由函數調用約定引起的問題

這兩天寫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必然崩潰。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章