The value of ESP was not properly saved across a function call.
来源:互联网 发布:京东抄袭淘宝 编辑:程序博客网 时间:2024/05/22 10:46
调用DLL函数,出现错误
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
错误原因:
你定义函数指针原型时出错。
其实你定义的没有错,但是编译器不认识而已,因为你调用的dll函数是一个远函数,而且是一个C函数,你得告诉编译器它是个c函数才行。那么你就可以在定义该函数的时候加上一句话,
FAR PASCAL 或者 __stdcall 这个就OK了。
具体做法:
比如说你要定义一个 返回类型为空,参数为空的函数指针:
typedef void (*LPFUN)(void);
这样确实跟我们dll里的函数匹配了,上面也说了,我们应该添上几个字,告诉编译器这个是一个远的C函数。
typedef void (WINAPI *LPFUN)(void);
typedef void (__stdcall *LPFUN)(void);
typedef void (FAR PASCAL *LPFUN) (void);
像上面这样定义就OK了,如果用的是VC++,那么直接用第一种定义就ok了。
注意,上面是使用 MFC (DLL)的做法。
如果是WIN32 DLL,得相应的去掉WINAPI ,__stdcall ,FAR PASCAL 这几个参数。因为WIN32 DLL 默认的入栈方式为 __cedcall方式,不是__stdcall方式。
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
错误原因:
你定义函数指针原型时出错。
其实你定义的没有错,但是编译器不认识而已,因为你调用的dll函数是一个远函数,而且是一个C函数,你得告诉编译器它是个c函数才行。那么你就可以在定义该函数的时候加上一句话,
FAR PASCAL 或者 __stdcall 这个就OK了。
具体做法:
比如说你要定义一个 返回类型为空,参数为空的函数指针:
typedef void (*LPFUN)(void);
这样确实跟我们dll里的函数匹配了,上面也说了,我们应该添上几个字,告诉编译器这个是一个远的C函数。
typedef void (WINAPI *LPFUN)(void);
typedef void (__stdcall *LPFUN)(void);
typedef void (FAR PASCAL *LPFUN) (void);
像上面这样定义就OK了,如果用的是VC++,那么直接用第一种定义就ok了。
注意,上面是使用 MFC (DLL)的做法。
如果是WIN32 DLL,得相应的去掉WINAPI ,__stdcall ,FAR PASCAL 这几个参数。因为WIN32 DLL 默认的入栈方式为 __cedcall方式,不是__stdcall方式。
具体的组合方式太多了,反正知道错误的原因是声明相应的函数未匹配就行了。
http://bbs.csdn.net/topics/300134656
问题说明:
主模块在调用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://blog.csdn.net/sysprogram/article/details/7737397
0 0
- DLL 调用错误 -The value of ESP was not properly saved across a function call.
- dynamic DLL 调用错误 -The value of ESP was not properly saved across a function call
- DLL 调用错误 -The value of ESP was not properly saved across a function call.
- The value of ESP was not properly saved across a function call
- The value of ESP was not properly saved across a function call.
- The value of ESP was not properly saved across a function call解决方案
- 【Debug】The value of ESP was not properly saved across a function call.
- The value of ESP was not properly saved across a function call.
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
- The value of ESP was not properly saved across a function call的问题 2010-9-26 18:57
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. 错误解决
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
- DLL 调用错误 -The value of ESP was not properly saved across a function cal
- Excel塾_http://kokodane.com/
- tomcat修改默认web目录
- iOS 如何撤销还未审核通过的app
- 第三次学长授课之C#编写记事本----感想
- java中常用的几种数据结构
- The value of ESP was not properly saved across a function call.
- ios 中使用blend改变图片的颜色
- 关于MFC dll 怎么得到DLL_PROCESS_DETACH消息
- 栈:stack的实现
- 最新iOS获取当前设备的IP地址 和|Mac地址
- 棋盘覆盖
- dns+重定向
- 为SharePoint 2010 Workflow 开发 Custom(自定义的) Workflow Activity
- 1 最短路径算法