轉帖|其它|編輯:郝浩|2008-07-15 13:55:17.000|閱讀 1331 次
概述:關于對話框DoModal()函數調用失敗的原因分析
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
對話框DoModal()函數調用失敗一般而言有兩種表現形式:一是對話框彈不出來,但是沒有錯誤提示;二是對話框彈不出來,同時伴隨內存訪問錯誤的提示框出現。
第一種表現主要是因為沒有對資源句柄進行切換造成的,以在DLL中彈出對話框中最為常見。解決辦法是:如果是MFC規則DLL,可以使用所有導出函數的開始處添加 AFX_MANAGE_STATE宏,具體代碼為:AFX_MANAGE_STATE(AfxGetStaticModuleState( )),如果是MFC擴展DLL,具體做法是:
1. 在DLL中定義兩個全局變量,
HINSTANCE hResOld; // 舊的資源句柄
HINSTANCE hDll; // DLL資源句柄
2. 在DllMain函數里初始化hDll
hDll = hInstance;
3. 在調用對話框DoModal()函數之前進行資源句柄切換
HINSTANCE hResOld = AfxGetResourceHandle();
AfxSetResourceHandle(hDll);
……
CYourDlg dlg;
dlg.DoModal();
……
AfxSetResourceHandle(hResOld);
若是第二種表現,即對話框彈不出來,同時伴隨內存訪問錯誤的提示框出現,那么問題很可能出現在初始化對話框界面的代碼方面,具體是在OnInitDialog函數,即使它是在DLL中彈出對話框。事實上在在DLL中彈出對話框如果不進行資源句柄切換,頂多是彈不出對話框,并不會出現內存訪問方面的錯誤。在解決這方面的錯誤,一個誤區是單步進入DoModal()函數調試,直至定位DoModal函數內部哪一句出錯。后來我發現這純粹是浪費時間,就算定位了在DoModal函數內部哪一句出錯,你依然不知道為什么會出錯。實際上調用DoModal()函數,激發的卻是OnInitDialog函數。因此你只需確定OnInitDialog函數哪一句出錯了(這里的OnInitDialog函數是指派生對話框類的OnInitDialog函數)。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:CSDN