微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi中的COM方法偏移

在Delphi中,如何找到COM方法的地址?
我可以硬编码偏移量
//0 is the offset of the QueryInterface method
p := TPonterarray(pointer(SomeInterface)^)[0];

但我更喜欢使用符号名称.以下显然不起作用:

var M : TMethod;
...
M := TMethod(SomeInterface.QueryInterface);

谢谢!

解决方法

您可以使用vmtoffset汇编程序指令获取接口方法相对于接口方法表开头的字节偏移量.看一下System.pas中_IntfCast的实现,例如:
call dword ptr [eax] + vmtoffset IInterface.QueryInterface
...
call dword ptr [eax] + vmtoffset IInterface._Release

一个表达式加0;第二,8.

但是,您无法对这些表达式进行参数化.它们是编译时常量,因此您无法在运行时选择所需的方法.您需要提前表示所有可能的方法名称.

你真正需要挂钩的是QueryInterface.完成后,您可以返回所需的任何代理对象,可以拦截对所有其他方法调用.

原文地址:https://www.jb51.cc/delphi/103189.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐