我想在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));'可以在任何地方工作,儘管這樣做可能是一種非常蹩腳的方式。 –