顯式連結到 DLL 的進程調用 GetProcAddress 來擷取
DLL 匯出函數的地址。 使用返回的函數指標調用 DLL 函數。 GetProcAddress 將(由 LoadLibrary、AfxLoadLibrary 或GetModuleHandle 返回的)DLL
模組控制代碼和要調用的函數名或函數的匯出序號用作參數。
由於是通過指標調用 DLL 函數並且沒有編譯時間類型檢查,需確保函數的參數是正確的,以便不會超出在堆棧上分配的記憶體和不會導致存取違規。 協助提供型別安全的一種方法是查看匯出函數的函數原型,並建立函數指標的匹配
typedef。 例如:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);...HINSTANCE hDLL; // Handle to DLLLPFNDLLFUNC1 lpfnDllFunc1; // Function pointerDWORD dwParam1;UINT uParam2, uReturnVal;hDLL = LoadLibrary("MyDLL");if (hDLL != NULL){ lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1"); if (!lpfnDllFunc1) { // handle the error FreeLibrary(hDLL); return SOME_ERROR_CODE; } else { // call the function uReturnVal = lpfnDllFunc1(dwParam1, uParam2); }}
調用 GetProcAddress 時指定所需函數的方式取決於
DLL 的產生方式。
僅當要連結到的 DLL 是用模組定義 (.def) 檔案產生的,並且序號在 DLL 的 .def 檔案的 EXPORTS 部分中與函數一起列出時,才能擷取匯出序號。 如果
DLL 具有許多匯出函數,則相對於使用函數名,使用匯出序號調用 GetProcAddress 的速度稍快一些,因為匯出序號是 DLL 匯出表的索引。 使用匯出序號,GetProcAddress 可直接定位函數,而不是將指定名稱與
DLL 匯出表中的函數名進行比較。 但是,僅當有權控制 .def 檔案中匯出函數的序號分配時,才應使用匯出序號調用 GetProcAddress。