GetProcAddress 函式 (libloaderapi.h)

從指定的動態連結庫 (DLL) 擷取匯出函式 (也稱為程式) 或變數。

語法

FARPROC GetProcAddress(
  [in] HMODULE hModule,
  [in] LPCSTR  lpProcName
);

參數

[in] hModule

包含函式或變數之 DLL 模組的句柄。 LoadLibraryLoadLibraryExLoadPackagedLibraryGetModuleHandle 函式會傳回此句柄。

GetProcAddress 函式不會從使用 LOAD_LIBRARY_AS_DATAFILE 旗標載入的模組擷取位址。 如需詳細資訊,請參閱 LoadLibraryEx

[in] lpProcName

函式或變數名稱,或函式的序數值。 如果這個參數是序數值,它必須是低序位文字;高序位文字必須為零。

傳回值

如果函式成功,則傳回值是導出函式或變數的位址。

如果函式失敗,則傳回值為 NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

備註

lpProcName 所指向之函式名稱的拼字和大小寫必須與來源 DLL 模組定義 (.def) 檔案的 EXPORTS 語句相同。 匯出的函式名稱可能與您在程式碼中呼叫這些函式時所使用的名稱不同。 SDK 頭檔中使用的宏會隱藏此差異。 如需詳細資訊,請參閱 函式原型的慣例

lpProcName 參數可以在 EXPORTS 語句中指定與函式相關聯的序數值,以識別 DLL 函式。 GetProcAddress 會驗證指定的序數位於範圍 1 到 .def 檔案中匯出的最高序數值。 然後,函式會使用序數做為索引,從函式數據表讀取函式的位址。

如果 .def 檔案不會連續將函式編號為 1 到 N (其中 N 是導出的函式數目) ,則即使沒有具有指定序數的函式, GetProcAddress 傳回無效的非 NULL 位址,仍會發生錯誤。

如果函式可能不存在於 DLL 模組中,例如,如果函式僅適用於 Windows Vista,但應用程式可能會在 Windows XP 上執行,請依名稱指定函式,而不是依序數值指定函式,並設計您的應用程式來處理無法使用函式時的情況,如下列代碼段所示。

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);

// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.

   PGNSI pGNSI;
   SYSTEM_INFO si;

   ZeroMemory(&si, sizeof(SYSTEM_INFO));
   
   pGNSI = (PGNSI) GetProcAddress(
      GetModuleHandle(TEXT("kernel32.dll")), 
      "GetNativeSystemInfo");
   if(NULL != pGNSI)
   {
      pGNSI(&si);
   }
   else 
   {
       GetSystemInfo(&si);
   }

如需包含此代碼段的完整範例,請參閱 取得系統版本

範例

如需範例,請參閱 使用動態連結 Run-Time

規格需求

   
最低支援的用戶端 Windows XP [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 libloaderapi.h (包含 Windows.h)
程式庫 Kernel32.lib
DLL Kernel32.dll

另請參閱

動態連結庫函式

FreeLibrary

GetModuleHandle

LoadLibrary

LoadLibraryEx

LoadPackagedLibrary

運行時間動態連結

VBS 記憶體保護區中可用的 Vertdll API