共用方式為


GetProcAddress

處理明確連結至 DLL 呼叫 GetProcAddress 以取得 DLL 中匯出函式的位址。 您可以使用傳回的函式指標來呼叫 DLL 函式。 GetProcAddress 接受 DLL 模組句柄的參數(由 LoadLibraryAfxLoadLibraryGetModuleHandle 傳回),並接受您想要呼叫的函式名稱或函式的導出序數。

因為您是透過指標呼叫 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

您想要做什麼事?

您還想知道關於哪些方面的詳細資訊?

另請參閱

在 Visual Studio 中建立 C++ DLL