调用第三方DLL闪退(crash)的原因和解决方法

某项目要调用一个第三方的 Windows 动态库(DLL),这个 DLL 除了一份简单的 API 文档,没有任何参考代码。用 VC++ 写了测试程序,通过 LoadLibrary、GetProcAddress 得到 DLL 中的 API 函数地址进行调用,一开始是按 Release 配置编译,结果调用该 DLL 中的函数可以得到正确结果,但之后总是闪退(也就是 crash),不报任何错。由于没有该 DLL 的源码,无法定位 crash 原因,无法确定是否由于调用参数不正确还是由于该 DLL 本身的 bug 导致的 crash。后来改成 Debug 配置编译测试程序,结果一启动就直接弹框报错:

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.

原来是跟 calling convention 不一致有关,根据网上的相关文章,在定义 DLL 中的 API 函数的函数指针的地方添加了关键字 __stdcall,就像这样:

typedef int (__stdcall * func)(void);

修改后程序正常运行,不再 crash。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值