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 验证指定的序号是否在 .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)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

动态链接库函数

FreeLibrary

GetModuleHandle

LoadLibrary

LoadLibraryEx

LoadPackagedLibrary

运行时动态链接

VBS enclave 中可用的 Vertdll API