CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

显式DLL的调用问题,应该不难,但是我实在搞不懂啦……抓狂了

楼主rick29(rick.z)2005-06-02 22:26:26 在 VC/MFC / 进程/线程/DLL 提问

高手们好,要是闲着,帮俺看看吧,要是忙着,还请闲着的时候也帮俺看看吧:  
   
    俺写一个DLL,DLL中的函数都是extern   "C"   __declspec(dllexport)的,显式链接到我的C++工程中,LoadLibrary正常,但调用时报错Runtime   Check   Failure   #0   -   The   value   of   ESP   was   not   properly   saved   across   a   function   call.   THis   usually   a   result   of   calling   a   function   declared   with   one   calling   convetion   with   a   function   pointer   declared   with   a   different   calling   convention.  
    说是调用规则不同。可是俺在调用时只是按联机文档中的方法:  
  typedef   PREVENTRESULT   (CALLBACK*   LPPRDLLFUNC)(PRPUBLICINFOPTR);  
  LPPRDLLFUNC   lpPrDllFunc   =   NULL;  
  if   (NULL   ==   m_hPrDll)    
  return   PER_DLL_NOT_INIT;  
  if   (NULL   ==   (lpPrDllFunc   =   (LPPRDLLFUNC)GetProcAddress(m_hPrDll,   "OnInitialPr")))    
  return   PER_EVENT_NO_RESPONSE;  
   
  PREVENTRESULT   result   =   lpPrDllFunc(pPublicInfo);   //   这里报上述错误  
  return   result;  
   
    extern   "C"是我加上去的,但如果我去掉的话,GetProcAddress函数就会找不到我这个导出函数,我郁闷啊,这是咋回事?毕业设计就要交了,这活儿干的。。。  
    高手们,指给俺点儿迷津吧…… 问题点数:40、回复次数:5Top

1 楼krh2001(边城浪子)回复于 2005-06-02 22:29:59 得分 30

函数原形跟你声明的不一致,导致堆栈异常了.  
   
  typedef   PREVENTRESULT   (CALLBACK*   LPPRDLLFUNC)(PRPUBLICINFOPTR);  
  你这个声明   跟   DLL   内的不一致.去掉   CALLBACK  
  Top

2 楼rick29(rick.z)回复于 2005-06-02 22:41:00 得分 0

我刚也这么试了,也发现了这个问题,过来一看果然如此,高手不愧高手!  
  但是我的目的是,是否可以不用extern   "C"?因为我加上这个以后GetProcAddress就会找不到我的导出函数。而加上extern   "C"后,我就无法在DLL中实现函数重载了。  
   
  是否有解决的办法?一定给分,非常感谢!Top

3 楼slience(疏星朗月)回复于 2005-06-03 08:27:43 得分 5

应该不会呀!我用过N次了,用extern可以调用要导出的函数的!  
   
  也可以不用extern   "C"而在工程中加*.def文件,在文件中写入:  
   
  LIBRARY   MyDll  
  EXPORTS  
  Max   //导出函数名  
  Min   //导出函数名Top

4 楼rick29(rick.z)回复于 2005-06-03 19:16:52 得分 0

我的意思是能否不用extern   "C",因为这样生成的C格式的导出符号里不允许有重载的情况。。Top

5 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-06-03 19:38:51 得分 5

需要注意函数调用约定,保证一致Top

相关问题

  • DLL的调用
  • dll的调用?
  • DLL调用
  • 调用DLL
  • 调用DLL
  • DLL调用
  • How 调用DLL ?
  • dll调用!
  • 调用dll
  • 调用DLL

关键词

  • 函数
  • dll
  • null
  • lpprdllfunc
  • 调用
  • 导出
  • preventresult
  • 高手
  • extern
  • getprocaddress

得分解答快速导航

  • 帖主:rick29
  • krh2001
  • slience
  • oyljerry

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo