mupdf不支持x64_Delphi xe2使用x64编译器编译ASM代码时出错 . 不支持的语言功能:'ASM'...
代碼無法直接正確移植到x64,因為它將執行64位指針截斷 - 有關詳細信息,請參見下文 .
64位應用程序不支持將匯編語句與Pascal代碼混合使用 . 使用Pascal代碼或完全用匯編編寫的函數替換匯編語句 .
這里使用裝配是不必要的 . 我不確定為什么原作者會選擇去解決這個問題 . 通過轉換為Pascal來處理這些移植問題總是最好的,這樣編譯器就可以完成所有工作 .
您可以按以下方式編寫代碼:
type
TDllLoadInfo = record
Module: HMODULE;
EntryPoint: function(hinstDLL: HMODULE; fdwReason: DWORD;
lpvReserved: Pointer): BOOL; stdcall;
end;
TGetProcAddrExInfo = record
ExitThread: procedure(dwExitCode: DWORD); stdcall;
GetProcAddress: function(hModule: HMODULE;
lpProcName: PAnsiChar): Pointer; stdcall;
GetModuleHandle: function(lpModuleName: PWideChar): HMODULE; stdcall;
lpModuleName: PWideChar;
lpProcName: PAnsiChar;
end;
TInjectLibraryInfo = record
LoadLibrary: function(lpFileName: PWideChar): HMODULE; stdcall;
lpModuleName: PWideChar;
Sleep: procedure(dwMilliseconds: DWORD); stdcall;
end;
procedure DllEntryPoint(lpParameter: pointer); stdcall;
var
LoadInfo: ^TDllLoadInfo absolute lpParameter;
begin
LoadInfo.EntryPoint(LoadInfo.Module, DLL_PROCESS_ATTACH, nil);
end;
procedure GetProcAddrExThread(lpParameter: pointer); stdcall;
var
GetProcAddrExInfo: ^TGetProcAddrExInfo absolute lpParameter;
ModuleHandle: HMODULE;
ProcAddress: Pointer;
begin
ModuleHandle := GetProcAddrExInfo.GetModuleHandle(GetProcAddrExInfo.lpModuleName);
ProcAddress := GetProcAddrExInfo.GetProcAddress(ModuleHandle,
GetProcAddrExInfo.lpProcName);
GetProcAddrExInfo.ExitThread(DWORD(ProcAddress)); // !!!! x64 pointer truncation !!!!
end;
procedure InjectLibraryThread(lpParameter: Pointer); stdcall;
var
InjectLibraryInfo: ^TInjectLibraryInfo absolute lpParameter;
begin
InjectLibraryInfo.LoadLibrary(InjectLibraryInfo.lpModuleName);
while True do // rather pointless to loop ....
InjectLibraryInfo.Sleep(INFINITE);
end;
該代碼假定您已經獲得了 W 后綴Unicode API函數的函數指針 . 如果沒有,則使用 PAnsiChar 而不是 PWideChar .
但是,在這一點上,我們需要評估并考慮我們剛剛做了什么 . 我們試圖將64位指針推入32位 DWORD 線程退出代碼 . 這不一定適合 . 如果庫加載到4GB以上的地址,那么您將遭受指針截斷 .
所以,這里的底線是你無法正確地將此代碼移植到x64 . 您需要找到此代碼的變體,該變體能夠從線程返回64位值 . 但它必須以不同的方式這樣做,因為你不能將64位值放入線程返回值 .
總結
以上是生活随笔為你收集整理的mupdf不支持x64_Delphi xe2使用x64编译器编译ASM代码时出错 . 不支持的语言功能:'ASM'...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL技术内幕 InnoDB存储引
- 下一篇: idea菜鸟教程