GetProcAddress

来源:互联网 发布:中国网络部队61398 编辑:程序博客网 时间:2024/05/18 22:45
显式链接到 DLL 的进程调用 GetProcAddress 来获取 DLL 导出函数的地址。使用返回的函数指针调用 DLL 函数。GetProcAddress 将(由 LoadLibraryAfxLoadLibrary 或 GetModuleHandle 返回的)DLL 模块句柄和要调用的函数名或函数的导出序号用作参数。

由于是通过指针调用 DLL 函数并且没有编译时类型检查,需确保函数的参数是正确的,以便不会超出在堆栈上分配的内存和不会导致访问冲突。帮助提供类型安全的一种方法是查看导出函数的函数原型,并创建函数指针的匹配 typedef。例如:

复制
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);...HINSTANCE hDLL;               // Handle to DLLLPFNDLLFUNC1 lpfnDllFunc1;    // Function pointerDWORD 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 的 .def 文件的 EXPORTS 部分中与函数一起列出时,才能获取导出序号。如果 DLL 具有许多导出函数,则相对于使用函数名,使用导出序号调用 GetProcAddress 的速度稍快一些,因为导出序号是 DLL 导出表的索引。使用导出序号,GetProcAddress 可直接定位函数,而不是将指定名称与 DLL 导出表中的函数名进行比较。但是,仅当有权控制 .def 文件中导出函数的序号分配时,才应使用导出序号调用 GetProcAddress

原文出处:http://www.cnblogs.com/kangwang1988/archive/2010/10/09/1846447.html

原创粉丝点击