dll导出中函数中使用CString类型的参数引发的ESP出错

来源:互联网 发布:淘宝千人千面在哪 编辑:程序博客网 时间:2024/06/06 22:55

今天下午花了很久去调试这个bug,因为自己一个dll函数参数的疏忽,导致浪费很多的时间去调试。

 

这个参数直接使用了CString类型,后面会造成两次析构而引发ESP出错,直接崩掉...

 

1

 

回来的时候,抽空分析了一下,大致过程是这样的,先写个简单的伪代码来调试吧:

 

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

 

另外,送一个相关的超级传送门...

 

点击此处!!!