按照文檔,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) ......
QLibrary* lib = new QLibrary("dwmapi.dll");
aeroEffectCheck aeroCheckFunc = (aeroEffectCheck)lib->resolve("DwmIsCompositionEnabled");
if( aeroCheckFunc && (aeroCheckFunc(&aeroFlag) ......
如果不用__stdcall修飾,只要執行aeroCheckFunc必然崩潰。