由函数调用约定引起的问题

这两天写ap,调用了系统动态库中的函数。
按照文档,QLibray,load,resovle,执行都没问题,但是release版本发布时出问题了,只要执行必然内存访问错误崩溃退出。
开始跟踪调试,注释掉QLibrary所有相关的代码,执行ok;
只保留到load,执行ok;
保留到resolve,执行ok;
执行resolve的函数,运行崩溃。于是怀疑是调用时堆栈约定有问题,将函数声明为__stdcall后,问题解决。原来的默认是__cdecl,堆栈被破坏了。
修改后的代码类似下面:

typedef HRESULT (__stdcall *aeroEffectCheck)(BOOL *pfEnabled);

QLibrary* lib = new QLibrary("dwmapi.dll");
aeroEffectCheck aeroCheckFunc = (aeroEffectCheck)lib->resolve("DwmIsCompositionEnabled");
if( aeroCheckFunc && (aeroCheckFunc(&aeroFlag) ......


如果不用__stdcall修饰,只要执行aeroCheckFunc必然崩溃。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值