小甲鱼 发表于 2016-8-11 16:58:23

GetProcAddress

注:本文档由 谁动了我的豆包 翻译,小甲鱼校对。

原文链接 -> 传送门

函数功能:

GetProcAddress 函数用于获取指定动态链接库(DLL)中的一个导出函数或变量的地址。


API 函数原型:

注释:_In_ 说明该参数是输入的。
FARPROC WINAPI GetProcAddress(
_In_ HMODULE hModule,
_In_ LPCSTRlpProcName
);

参数解析:


参数 含义
hModule1. 该参数指定一个包含函数或者变量的 DLL 模块的句柄。由 LoadLibrary 函数,LoadLibraryEx 函数,LoadPackagedLibrary 函数,或者 GetModuleHandle 函数返回该句柄

2. GetProcAddress 函数不会从用 LOAD_LIBRARY_AS_DATAFILE 标识加载的模块中获得地址。更多信息请参照 LoadLibraryEx 函数
lpProcName该参数指定该函数或者变量名,或者该函数的序号值。如果该参数是一个序号值,该序号值一定在低位字;高位字一定是 0


返回值:

1. 如果函数运行成功,则返回值为导出函数或变量的地址;

2. 如果函数运行失败,则返回值为 NULL。

想要调用更多的错误信息,请调用 GetLastError 函数。


备注:

1. 一个被 IpProcName 参数指出的函数名的拼写方法和示例必须与源 DDL 模板定义文件(.def)的 EXPORTS 声明一致。当调用在你代码里的函数时,输出的函数名可能与你用的函数名不同。该不同被在 SDK 头文件中使用的宏命令所隐藏。想要更多信息,请参照 Conventions for Function Prototypes(函数原型约定)。

2. IpProcName 参数能够通过一个在 EXPORTS 声明里的函数有关的指定的序号值来确定 DLL 函数。GetProcAddress 函数检查指定的序号是不是在范围 1 到从 .def 文件导出的最高值之间。然后该函数用这个序号作为一个索引去从一个函数表中读取该函数的地址。如果 .def 文件不从 1 到 N(在这里 N 是导出函数的个数)连续地编号函数,在 GetProcAddress 函数返回一个无效地址,非空地址的地方可能发生一个错误,即使没有任何函数配有该指定的序号。

3. 如果一个函数可能在 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);
   }

需求:


Minimum supported client Windows XP [桌面应用程序 | Windows 商店应用程序]
Minimum supported server Windows 2003 服务器版 [桌面应用程序 | Windows 商店应用程序]
Minimum supported phone Windows Phone 8
HeaderWinbase.h (包含于 Windows.h)
LibraryKernel32.lib
DLLKernel32.dll


【API档案】版权归鱼C工作室(www.fishc.com)所有,转载请注明来源。

页: [1]
查看完整版本: GetProcAddress