关于vaule of ESP was not properly saved across a function call 错误

vc++ 专栏收录该内容
3 篇文章 0 订阅

最近由于写程序时需要动态加载dll,在获取函数如后地址后,调用函数返回时vaule of ESP was not properly saved across a function call.错误,很是烦恼,在网上找解决的方法,,大多千篇一律,后来在http://hi.baidu.com/buaanengan/blog/item/5bb3a4a10bd61386461064ec.html看到了对该问题比较详细的分析,
此处为引用原文————
问题说明:
主模块在调用Dll的导出函数时会保存返回地址在堆栈中(ESP+xxx)。函数调用返回时,会弹栈取得返回地址(ESP-xxx),从而返回到主模块。

vaule of ESP was not properly saved across a function call.

上面出现的错误是系统提示主模块调用前堆栈的指针(ESP),与调用导出函数后的指针不符。

一般有两种情况会出现类似错误。
1. Dll导出函数声明导出方法,与主模块中声明的导入方法不一致。使得调用时参数的传递中,破坏了调用堆栈,出现错误。

2. Dll导出函数本身破坏了调用堆栈。编码中最一般的错误比如:对象(如CString)等。

解决方法:
针对第1种情况,请确定导出方(Dll等)与导入方(Exe等)的声明保持一致。
对于第2种情况,请保证产生的对象都被安全的释放。

备注:
可以试试下面的方法可以简单的测试方法
将Dll的导出函数定义成空处理(直接返回),如还出现错误,则是调用错误。
——引用结束

经过反复检查,终于找到了问题的根源
http://www.codeproject.com/Messages/749071/Re-the-value-of-ESP-was-not-properly-saved-across-.aspx里找到了答案:
Imagine if you have an exposed function in a DLL that uses the __stdcall calling convention, but your function pointer is declared as __cdecl. Using the function pointer would cause this error.
实际上就是上面的第一种情况,DLL里用的是 __cdecl,而我在定义指针函数时用的是__stdcall,网上的解决办法大多是说在定义指针函数时加__stdcall,而并没提及DLL中使用的是什么,这也是为什么很多人说加了__stdcall错误依然存在。

希望对大家有帮助。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值