1. 程式人生 > >動態庫匯出宣告 : extern "C" __declspec(dllexport) 與 __declspec(dllexport)

動態庫匯出宣告 : extern "C" __declspec(dllexport) 與 __declspec(dllexport)

最近在做專案,在動態載入動態庫後,使用GetProcAddress( HMODULE hModule, LPCWSTR lpProcName)獲取匯出的函式的地址時,發現不能獲得函式地址。

通過檢查發現是宣告動態庫匯出的定義不同導致:

在使用extern "C" __declspec(dllexport)時,可以使用GetProcAddr獲得函式地址。

在使用__declspec(dllexport)時,在使用GetProcAddr時,引數lpProcName不能為匯出的函式名字,否則就不能獲得函式地址。

用dependency軟體觀察分別使用extern "C" __declspec(dllexport)  與 __declspec(dllexport)宣告匯出函式的區別

使用extern "C" __declspec(dllexport)宣告匯出函式:


使用 __declspec(dllexport)宣告匯出函式:


總結:

很明顯,使用extern "C" __declspec(dllexport)宣告匯出函式,在DLL中的函式名字保持與匯出函式名一致。使用__declspec(dllexport)宣告匯出函式,在DLL中的函式名字與匯出函式名字不一致,有變化。這些差異主要是使用C方式函式C++方式編譯導致的。

所以,在使用GetProcAddress( HMODULE hModule, LPCWSTR lpProcName)函式查詢匯出函式時,最好在DLL中用extern "C" __declspec(dllexport)宣告匯出函式。