【发布时间】:2014-07-14 07:45:29
【问题描述】:
我想在 delphi 中使用这个简单的 C 函数,但不能完美地将值转换为指针。
C 函数:
PVOID GetInterfaceMethod(PVOID intf, DWORD methodIndex)
{
return *(PVOID*)(*(DWORD_PTR*)intf + methodIndex);
}
德尔福函数:
function GetInterfaceMethod(const intf; methodIndex: DWORD): Pointer;
begin
// return *(PVOID*)(*(DWORD_PTR*)intf + methodIndex); x64
// return *(PVOID*)(*(DWORD*)intf + methodIndex * 4); x86
Result := Pointer(Pointer(DWORD_PTR(Pointer(intf)^) + methodIndex)^); //x64
end;
对不起,我的英语不好。
【问题讨论】:
-
在查看 x86 实现(Delphi 例程中的注释代码)时,x64 实现显然是错误的。因此,有问题的 C 函数一开始可能是错误的(如果应该乘以 8)。这也是有道理的,因为参数被称为 methodIndex 而不是 byteOffset 或类似的东西,然后由架构依赖于调用方。
-
return *(PVOID*)(*(DWORD_PTR*)intf + methodIndex*sizeof(PVOID));可以在任何地方使用,尽管这样做会很蹩脚。