我已經使用「CPPLoadLibrary」示例(來自Microsoft All-in-One框架) 好吧,有兩種從示例DLL中導出符號的方法。從DLL使用.DEF文件 的模塊定義(.DEF)文件確定DLL的符號名稱
- 導出符號是包含一個或描述一個DLL的各種屬性更模塊 語句的文本文件。創建.DEF文件和 構建DLL時使用.def文件。使用這種方法,我們可以按順序從名稱中導出 函數。從DLL使用__declspec(dllexport)的 __declspec(dllexport)的
- 出口符號增加了出口指令到目標文件,這樣我們就 不需要使用.def文件。當試圖導出裝飾的C++函數名稱時,這種便利性最爲明顯。
所以我們有下面的代碼。
typedef int (_cdecl* LPFNGETSTRINGLENGTH1) (PCWSTR);
typedef int (CALLBACK* LPFNGETSTRINGLENGTH2) (PCWSTR);
LPFNGETSTRINGLENGTH1 lpfnGetStringLength1 = (LPFNGETSTRINGLENGTH1)
GetProcAddress(hModule, "GetStringLength1");
LPFNGETSTRINGLENGTH2 lpfnGetStringLength2 = (LPFNGETSTRINGLENGTH2)
GetProcAddress(hModule, "[email protected]");
所以我的問題是如何確定符號的名稱,以便調用GetProcAddress?在第一種情況下,它是非常簡單的,我們從.DEF文件中獲取該符號名稱。 但是「_GetStringLength2 @ 4」怎麼樣 什麼是下劃線?什麼是「@ 4」代表什麼? 謝謝。
這是__stdcall調用約定的標準裝飾。函數指針聲明中的CALLBACK宏還指定__stdcall。使用LoadLibrary + GetProcAddress當然是你想要避免的一般情況,它非常容易出錯。只需讓鏈接器處理它,鏈接導入庫。 –