• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > Delphi如何通过接口方法的DispID获取方法名称?

Delphi如何通过接口方法的DispID获取方法名称?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了dispid,c dispid,dispid newwindow3,delphi 接口,delphi 支付宝接口等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: Delphi 如何通过接口方法的DispID获取方法名称?
描述:

VC区也发一个
最近研究了Delphi RTTI 
想要实现一个类似TAutoObject功能的类 
经过以下试验分析 
Delphi 的双重接口的调用模式大致如下 


  //接口
  ITest = interface(IDispatch)
  ['{C8E5E6FF-FBF2-4397-A4F3-8041DF9548E8}']
    function Test: Boolean; stdcall;
  end;
  {$m-}{$METHODINFO OFF}
  //disp接口
  ITestDisp = dispinterface
  ['{C8E5E6FF-FBF2-4397-A4F3-8041DF9548E8}']
    function Test: Boolean; dispid 500;
  end;
  TTest = class(TInterfacedObject, ITest, IDispatch)
  protected
    function Test: Boolean; stdcall;
    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
    function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
    function GetIDsOfNames(const IID: TGUID; Names: Pointer;
      NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  end;
//以下是调用
var
  I: ITest;
  Disp: ITestDisp;
  V: Variant;
begin
  //用非disp接口调用, 直接执行到 Test 方法内部
  I := TTest.Create;
  I.Test;
  //用dips接口调用,执行到Invoke,再由 Invoke 执行其它方法
  Disp := TTest.Create as ITestDisp;
  Disp.Test;
  //用Variant调用,首先执行到 GetIDsOfNames 获取方法ID,然后再执行到 Invoke 再由 Invoke 执行其它方法
  V := TTest.Create as ITestDisp;
  V.Test;
end;

我想要的效果正是类似DispID的效果, 既只要有接口就可以调用, 避免传错参数或调错方法, 
然而我发现当执行到 Invoke 时传来的只是方法的DispID 
于是我无从下手了,不知道该如何把DispID解释成方法名或方法地址,于是无法进行调用实际想调用的方法 
跟据我的实验,用Variant的方式,只要在其调用GetIDsOfNames时生成一个模拟的DispID, 
这个DispID便可以由Invoke获取了,然而这个DispID却不是接口声明时的DispID,于是 
用disp接口仍然无法获取方法地址. 
我跟踪过TAutoObject的调用,他的调用是通过工厂类直接执行,然而一直跟踪下去才发现他是调用了Ole32 API,而这个API 
是需要IDL Table支持的,即一定要是COM或COM+才能获取到。 
用Variant调用的方式确实能满足我的需要,但其不能直接使用接口调用,传错参数也能编译通过,并且效比较低, 
首先要执行 GetIDsOfNames获取方法ID,再进行调用。 
经过跟踪调试发现,只要引用了ComObj单元,Disp接口调用时,都会调用到ComObj的DispCallByIDProc函数指针,该指针指向 
DispCallByID 函数,通过修改这个函数的指针,指向自己的DispCallByID,由DispCallByID转向Invoke以外的另一个方法把 
方法名传过去,也能达到我想要的效果,但是这样做是修改了Delphi内部的调用机制,比起 
这种方法,我更倾向于使用原有的机制,如果通过通过DispID获取到方法地址那才是最佳解决案。


解决方案1:

GetTypeInfo呢

解决方案2:

给楼主一个和这个类似的东西:
http://blog.csdn.net/fengrx/archive/2009/03/29/4033206.aspx


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 请问怎样在DISPID_AMBIENT_DLCONTROL中实现下载控制?
  • 在DISPID_BEFORENAVIGATE2事件中如何判断是否为IFRAME事件?
  • 请教各位,如何修改控件暴露的接口方法的dispid,具体描述见内。
  • 想截取鼠标在IE工作区左键点击事件,可是每次都截取到超过5次DISPID_HTMLELEMENTEVENTS_ONCLICK事件
  • DISPID起什么作用?
  • 获取IE弹出窗口的问题(DISPID_NEWWINDOW2)
  • 还有的DISPID叫啥名字呢?
  • DISPID_BEFORENAVIGATE2事件
  • 关于DISPID_ONADDRESSBAR
  • 编译的时候说:DISPID_BEFORENAVIGATE2没有定义

相关文章

  • 2017-06-05 菜鸟问题:关于vc++编程(线程)
  • 2017-06-04 activeX嵌在IE里面的时候,直接关闭IE,会出现内存不能为“read”的情况
  • 2017-06-05 在程序中启动一个命令行程序,要如何获取这个命令行程序的输出?比如说ping或者nbtstat程序
  • 2017-06-04 MFC使用Flash问题
  • 2017-06-05 我用ATL向导生成了一个ATL进程内的COM!多个接口的问题
  • 2017-06-04 使用COM可以实现这样的功能吗?
  • 2017-06-05 问一个比较白痴的问题
  • 2017-06-05 如何雅致地得知某一进程是关键系统进程?又如何终止关键系统进程呢?高分求解!!!
  • 2017-06-04 用什么方法控制播放vcd时声道输出?就像超解左右声道选择那样的效果?我的信箱:t161@163com
  • 2017-06-05 如何在程序中调用其他文件??

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请教怎么判断一个进程异常
    • 如何给子定义的控件加入keypress事件!
    • 关于ActiveX激活的问题
    • ★★★★关于一个DLL文件被多个程序加载的情况!★★★★
    • BN_CLICKED消息不能被反射?
    • CoCreateInstance的问题
    • 使用DLL时传递参数的问题
    • 请教vc为vb提供的dll
    • 关于线程操作的一个问题,多线程高手请-----》
    • NETDDE

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有