Delphi指针转换

Kam*_*ran 3 c delphi pointers casting

我想在delphi中使用这个简单的C函数,但是不能将值完美地转换为指针.

C功能:

PVOID GetInterfaceMethod(PVOID intf, DWORD methodIndex)
{
  return *(PVOID*)(*(DWORD_PTR*)intf + methodIndex);
}
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

对不起,我的英语不好.

Ste*_*nke 7

这不是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;
Run Code Online (Sandbox Code Playgroud)

此代码说明了接口引用是指向IMT的指针,如下所示:

在此输入图像描述