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

今天下午花了很久去调试这个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

 

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

 

点击此处!!!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪宁宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值