在Delphi中,如何找到COM方法的地址?我可以硬编码补偿
//0 is the offset of the QueryInterface method
p := TPonterArray(pointer(SomeInterface)^)[0];
Run Code Online (Sandbox Code Playgroud)
但我更愿意使用符号名称.以下显然不起作用:
var M : TMethod;
...
M := TMethod(SomeInterface.QueryInterface);
Run Code Online (Sandbox Code Playgroud)
谢谢!
您可以使用vmtoffset汇编程序指令获取接口方法相对于接口方法表开头的字节偏移量.看看执行_IntfCast的System.pas,例如:
call dword ptr [eax] + vmtoffset IInterface.QueryInterface
...
call dword ptr [eax] + vmtoffset IInterface._Release
Run Code Online (Sandbox Code Playgroud)
第一个表达式加0; 第二,8.
但是,您无法对这些表达式进行参数化.它们是编译时常量,因此您无法在运行时选择所需的方法.您需要提前表示所有可能的方法名称.
所有你真正需要的是QueryInterface.完成后,您可以返回所需的任何代理对象,可以拦截对所有其他方法的调用.
我认为德尔福不支持这一点。对偏移量进行硬编码可能是唯一可行的方法,因为编译器不会将接口方法视为其值可以分配给函数指针的符号,就像对象方法或独立函数那样。
顺便说一句,你为什么要这样做?