對話(huà)框DoModal()函數調用失敗一般而言有兩種表現形式:一是對話(huà)框彈不出來(lái),但是沒(méi)有錯誤提示;二是對話(huà)框彈不出來(lái),同時(shí)伴隨內存訪(fǎng)問(wèn)錯誤的提示框出現。
第一種表現主要是因為沒(méi)有對資源句柄進(jìn)行切換造成的,以在DLL中彈出對話(huà)框中最為常見(jiàn)。解決辦法是:如果是MFC規則DLL,可以使用所有導出函數的開(kāi)始處添加 AFX_MANAGE_STATE宏,具體代碼為:AFX_MANAGE_STATE(AfxGetStaticModuleState( )),如果是MFC擴展DLL,具體做法是
1. 在DLL中定義兩個(gè)全局變量,
HINSTANCE hResOld; // 舊的資源句柄
HINSTANCE hDll; // DLL資源句柄
2. 在DllMain函數里初始化hDll
hDll = hInstance;
3. 在調用對話(huà)框DoModal()函數之前進(jìn)行資源句柄切換
HINSTANCE hResOld = AfxGetResourceHandle();
AfxSetResourceHandle(hDll);
……
CYourDlg dlg;
dlg.DoModal();
……
AfxSetResourceHandle(hResOld);
若是第二種表現,即對話(huà)框彈不出來(lái),同時(shí)伴隨內存訪(fǎng)問(wèn)錯誤的提示框出現,那么問(wèn)題很可能出現在初始化對話(huà)框界面的代碼方面,具體是在OnInitDialog函數,即使它是在DLL中彈出對話(huà)框。事實(shí)上在在DLL中彈出對話(huà)框如果不進(jìn)行資源句柄切換,頂多是彈不出對話(huà)框,并不會(huì )出現內存訪(fǎng)問(wèn)方面的錯誤。在解決這方面的錯誤,一個(gè)誤區是單步進(jìn)入DoModal()函數調試,直至定位DoModal函數內部哪一句出錯。后來(lái)我發(fā)現這純粹是浪費時(shí)間,就算定位了在DoModal函數內部哪一句出錯,你依然不知道為什么會(huì )出錯。實(shí)際上調用DoModal()函數,激發(fā)的卻是OnInitDialog函數。因此你只需確定OnInitDialog函數哪一句出錯了(這里的OnInitDialog函數是指派生對話(huà)框類(lèi)的OnInitDialog函數)。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。