GetProcAddress
處理明確連結至 DLL 呼叫 GetProcAddress 以取得 DLL 中匯出函式的位址。 您可以使用傳回的函式指標來呼叫 DLL 函式。 GetProcAddress 接受 DLL 模組控制碼的參數(由 LoadLibrary 、 AfxLoadLibrary
或 GetModuleHandle 傳回 ),並接受您想要呼叫的函式名稱或函式的匯出序數。
因為您是透過指標呼叫 DLL 函式,而且沒有編譯時間類型檢查,所以請確定函式的參數正確無誤,讓您不會超越堆疊上配置的記憶體,並造成存取違規。 協助提供型別安全性的其中一種方法是查看匯出函式的函式原型,並為函式指標建立相符的 typedefs。 例如:
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,以及序數列在 DLL .def 檔案的 EXPORT 區段中的函 式時,您才能取得匯出序數。 如果 DLL 有許多匯出函數,因為匯出序數做為 DLL 匯出資料表中的索引,則呼叫 GetProcAddress 與函式名稱相反,會稍微快一點。 使用匯出序數, GetProcAddress 可以直接找出函式,而不是將指定的名稱與 DLL 匯出資料表中的函式名稱進行比較。 不過,只有在您控制將序數指派給 .def 檔案中匯出的函式時,才應該使用匯出序數呼叫 GetProcAddress 。