GetProcAddress 函数 (libloaderapi.h)

从指定的动态链接库 (DLL) 检索导出函数 (也称为过程) 或变量。

语法

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

参数

[in] hModule

包含函数或变量的 DLL 模块的句柄。 LoadLibrary、LoadLibraryExLoadPackagedLibraryGetModuleHandle 函数返回此句柄。

GetProcAddress 函数不会从使用 LOAD_LIBRARY_AS_DATAFILE 标志加载的模块中检索地址。 有关详细信息,请参阅 LoadLibraryEx

[in] lpProcName

函数或变量名称,或函数的序号值。 如果此参数是序号值,则它必须在低序位字中;高序位字必须为零。

返回值

如果函数成功,则返回值是导出的函数或变量的地址。

如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

注解

lpProcName 指向的函数名称的拼写和大小写必须与源 DLL 模块定义 (.def) 文件中的 EXPORTS 语句相同。 导出的函数名称可能与在代码中调用这些函数时使用的名称不同。 此差异由 SDK 头文件中使用的宏隐藏。 有关详细信息,请参阅 函数原型的约定

lpProcName 参数可以通过在 EXPORTS 语句中指定与函数关联的序号值来标识 DLL 函数。 GetProcAddress 验证指定的序号是否在 .def 文件中导出的最高序号值的范围 1 中。 然后,该函数使用序号作为索引从函数表中读取函数的地址。

如果 .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)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

动态链接库函数

FreeLibrary

GetModuleHandle

LoadLibrary

LoadLibraryEx

LoadPackagedLibrary

运行时动态链接