关于对话框DoModal()函数调用失败的原因分析
生活随笔
收集整理的這篇文章主要介紹了
关于对话框DoModal()函数调用失败的原因分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對話框DoModal()函數調用失敗一般而言有兩種表現形式:一是對話框彈不出來,但是沒有錯誤提示;二是對話框彈不出來,同時伴隨內存訪問錯誤的提示框出現。第一種表現主要是因為沒有對資源句柄進行切換造成的,以在DLL中彈出對話框中最為常見。解決辦法是:如果是MFC規則DLL,可以使用所有導出函數的開始處添加 AFX_MANAGE_STATE宏,具體代碼為:AFX_MANAGE_STATE(AfxGetStaticModuleState( )),如果是MFC擴展DLL,具體做法是1. ? ? 在DLL中定義兩個全局變量,HINSTANCE hResOld; // 舊的資源句柄HINSTANCE hDll; // DLL資源句柄2. ? ? ?在DllMain函數里初始化hDllhDll = 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函數)。
總結
以上是生活随笔為你收集整理的关于对话框DoModal()函数调用失败的原因分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# WINFORM SOCKET编程-
- 下一篇: 结构体、类的成员对齐