GetProcAddress来自msdn 2010-7-12 15:17
2013-01-09 13:33
381 查看
显式链接到 DLL 的进程调用GetProcAddress来获取
DLL 导出函数的地址。使用返回的函数指针调用 DLL 函数。GetProcAddress 将(由LoadLibrary、AfxLoadLibrary或
GetModuleHandle 返回的)DLL 模块句柄和要调用的函数名或函数的导出序号用作参数。
由于是通过指针调用 DLL 函数并且没有编译时类型检查,需确保函数的参数是正确的,以便不会超出在堆栈上分配的内存和不会导致访问冲突。帮助提供类型安全的一种方法是查看导出函数的函数原型,并创建函数指针的匹配 typedef。例如:
复制
调用 GetProcAddress时指定所需函数的方式取决于 DLL 的生成方式。
仅当要链接到的 DLL 是用模块定义 (.def) 文件生成的,并且序号在 DLL 的 .def 文件的EXPORTS
部分中与函数一起列出时,才能获取导出序号。如果 DLL 具有许多导出函数,则相对于使用函数名,使用导出序号调用GetProcAddress
的速度稍快一些,因为导出序号是 DLL 导出表的索引。使用导出序号,GetProcAddress可直接定位函数,而不是将指定名称与 DLL 导出表中的函数名进行比较。但是,仅当有权控制 .def 文件中导出函数的序号分配时,才应使用导出序号调用GetProcAddress。
DLL 导出函数的地址。使用返回的函数指针调用 DLL 函数。GetProcAddress 将(由LoadLibrary、AfxLoadLibrary或
GetModuleHandle 返回的)DLL 模块句柄和要调用的函数名或函数的导出序号用作参数。
由于是通过指针调用 DLL 函数并且没有编译时类型检查,需确保函数的参数是正确的,以便不会超出在堆栈上分配的内存和不会导致访问冲突。帮助提供类型安全的一种方法是查看导出函数的函数原型,并创建函数指针的匹配 typedef。例如:
复制
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT); ... HINSTANCE hDLL; // Handle to DLL LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer DWORD 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。
相关文章推荐
- API太多(C++版) -- GetModuleHandle LoadLibrary GetProcAddress 讲解
- GetProcAddress
- 自己实现GetProcAddress
- GetProcAddress返回NULL
- GetProcAddress()、函数指针和 C++
- GetProcAddress 使用注意事项
- GetProcAddress()
- 使用API函数GetProcAddress的注意事项
- Windows API GetProcAddress 及demo code
- 使用API函数GetProcAddress的注意事项
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
- GetProcAddress
- LoadLibrary GetProcAddress FreeLibrary 近距应用
- dll的输出函数使用__stdcall调用约定后,客户端用GetProcAddress出现的问题!
- GetProcAddress函数
- linux下的"LoadLibrary & GetProcAddress"
- SqlServer Bug:扩展存储过程一直运行出现等待类型PREEMPTIVE_OS_GETPROCADDRESS
- 调用 GetProcAddress 失败,在 ISAPI 筛选器 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" 上
- 实现GetProcAddress
- GetProcAddress的用法