这两天写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必然崩溃。