我想在delphi中使用这个简单的c函数,但是无法将值完美地转换为指针。
C函数:
PVOID GetInterfaceMethod(PVOID intf, DWORD methodIndex)
{
return *(PVOID*)(*(DWORD_PTR*)intf + methodIndex);
}
Delphi函数:
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;
对不起,我英语不好。
最佳答案
这不是C代码的100%翻译,但它实现了您试图通过使用以下方法实现的目标:
function GetInterfaceMethod(const intf; methodIndex: Cardinal): Pointer;
type
PPVtable = ^PVtable;
PVtable = ^TVtable;
TVtable = array[0..MaxInt div SizeOf(Pointer) - 1] of Pointer;
begin
Result := PPVtable(intf)^^[methodIndex];
end;
这段代码说明接口引用是指向imt的指针,如下所示: