dll导出中函数中使用CString类型的参数引发的ESP出错
来源:互联网 发布:淘宝千人千面在哪 编辑:程序博客网 时间:2024/06/06 22:55
今天下午花了很久去调试这个bug,因为自己一个dll函数参数的疏忽,导致浪费很多的时间去调试。
这个参数直接使用了CString类型,后面会造成两次析构而引发ESP出错,直接崩掉...
回来的时候,抽空分析了一下,大致过程是这样的,先写个简单的伪代码来调试吧:
Dll源码:
主工程为对话框,添加两个按钮,消息响应如下:
点击测试,再关闭队话框,即出现常见的对话框(如果在调试时,将会出现上图结果):
Microsoft Visual C++ Debug Library:
Debug Error:
Program: ...
Module:
file: i386/chkesp.c
Line: xx
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.
(Press Retry to Debug the Application)
于是载入IDA,查看两个函数反汇编代码:
于是,这个bug就立刻展现眼前,原来是CString拷贝构造函数引起两次析构函数,而造成ESP出错!于是改这个bug也很简单了,在参数前加个&即可。感谢法师,加一个&符号即可修正之.....
突然,才发现MS SDK的MFC类库函数也很少用到这个类型的参数,只是有很少的一部分也只是加上&引用使用。
所以,建议大家在Dll中尽量不要直接使用CString作为参数,可以直接使用LPCSTR替代吧!
配套源码:http://download.csdn.net/source/2372247
另外,送一个相关的超级传送门...
点击此处!!!
- dll导出中函数中使用CString类型的参数引发的ESP出错
- dll导出中函数中使用CString类型的参数引发的ESP出错
- C#中调用C++的dll的参数为指针类型的导出函数
- C#中调用C++的dll的参数为指针类型的导出函数
- 关于DLL中导出类、导出函数接口的参数
- 在dll导出函数参数中传递map类型的参数,在函数内insert时出非法访问错
- DLL中函数返回CString的问题
- 查看DLL中导出的函数及参数
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- DLL中导出函数的方法
- Wininet.dll中导出的几个函数
- DLL导出函数使用wchar_t类型的问题
- 如何获知DLL中函数的参数
- 如何获知DLL中函数的参数
- 如何获知DLL中函数的参数
- 非MFC的DLL中使用CString类
- 动作文件的合并
- CentOS 5.3 Linux 用yum 安装mplayer
- android 自定义ListView中的单项选择
- 软件漏洞分析入门(一)
- 跟随内心的感觉
- dll导出中函数中使用CString类型的参数引发的ESP出错
- 滑雪--POJ--1088
- 陋室铭 刘禹锡
- CentOS 5.4 服务器配置 yum安装Apache+php+Mysql
- 如何为window7旗舰版 安装iis
- A*路径寻找算法入门(转)
- 向Linux进军
- UVa 10405 Longest Common Subsequence
- Geoserver+MYSQL数据配置,openlayer预览图层异常