Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.

首先,确定自己的代码正确,线程函数正确退出后,报这个错,最后发现线程函数是这么定义:

static DWORD WINAPI ServerWork(LPVOID lpParameter)

其中WINAPI为:

#define WINAPI      __stdcall

把WINAPI去掉就好了。

解析:

主模块在调用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的导出函数定义成空处理(直接返回),如还出现错误,则是调用错误。

国外论坛不少人也提过这个问题将Calling Convention由原来的__cdecl (/Gd)修改为__stdcall (/Gz),其实是因为IUnknown被转换为IDispatch的问题。

http://blog.youkuaiyun.com/sysprogram/article/details/7737397

http://www.cnblogs.com/junchu25/archive/2012/08/10/2631133.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值