日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mupdf不支持x64_Delphi xe2使用x64编译器编译ASM代码时出错 . 不支持的语言功能:'ASM'...

發布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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'...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。