GetProcAddress
明確連結至 DLL 的處理序會呼叫 GetProcAddress 來獲得 DLL 裡匯出函式的位址。 您可以使用傳回的函式指標來呼叫 DLL 函式。 GetProcAddress 會將 DLL 模組控制代碼 (由 LoadLibrary、AfxLoadLibrary 或 GetModuleHandle 傳回) 和您要呼叫的函式名稱或函式的匯出序數當做參數來使用。
因為 DLL 函式是經由指標呼叫,而且沒有編譯時期型別檢查,請確定函式的參數是正確的,以防止您逾越堆疊的記憶體配置和造成存取違規。 一個提供型別安全的方式是檢視匯出函式的函式原型,並為函式指標建立相符的 Typedef。 例如:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...
HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
DWORD 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。