酱坛子

专注C++技术 在这里写下自己的学习心得 感悟 和大家讨论 共同进步(欢迎批评!!!)

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  65 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一伟 湖南商学院毕业 电子信息工程专业

常用链接

留言簿(19)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 352896
  • 排名 - 53

最新随笔

最新评论

阅读排行榜

评论排行榜

Visual C++
GetProcAddress
显式链接到 DLL 的进程调用 GetProcAddress 来获取 DLL 导出函数的地址。使用返回的函数指针调用 DLL 函数。GetProcAddress 将(由 LoadLibraryAfxLoadLibraryGetModuleHandle 返回的)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

 


posted on 2007-08-08 23:00 @王一伟 阅读(4540) 评论(3)  编辑 收藏 引用

Feedback

# re: GetProcAddress 2007-08-09 08:58 @王一伟
我重新写了上面的代码 发觉还是有问题dll能导入成功,函数地址能获取

但是一旦用typedef的函数指针的时候就连编译都编译不过了

请求帮助

工程文件如下http://www.cppblog.com/Files/sunraiing9/hahahah.rar

11k大小
  回复  更多评论
  

# re: GetProcAddress 2007-08-09 09:50 @王一伟
已经解决 嘿嘿  回复  更多评论
  

# re: GetProcAddress 2010-04-29 17:32 jocy
3Q
  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理