當(dāng)前位置:
首頁 >
关于对话框DoModal()函数调用失败的原因分析
發(fā)布時間:2025/5/22
42
豆豆
生活随笔
收集整理的這篇文章主要介紹了
关于对话框DoModal()函数调用失败的原因分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
對話框DoModal()函數(shù)調(diào)用失敗一般而言有兩種表現(xiàn)形式:一是對話框彈不出來,但是沒有錯誤提示;二是對話框彈不出來,同時伴隨內(nèi)存訪問錯誤的提示框出現(xiàn)。第一種表現(xiàn)主要是因?yàn)闆]有對資源句柄進(jìn)行切換造成的,以在DLL中彈出對話框中最為常見。解決辦法是:如果是MFC規(guī)則DLL,可以使用所有導(dǎo)出函數(shù)的開始處添加 AFX_MANAGE_STATE宏,具體代碼為:AFX_MANAGE_STATE(AfxGetStaticModuleState( )),如果是MFC擴(kuò)展DLL,具體做法是1. ? ? 在DLL中定義兩個全局變量,HINSTANCE hResOld; // 舊的資源句柄HINSTANCE hDll; // DLL資源句柄2. ? ? ?在DllMain函數(shù)里初始化hDllhDll = hInstance;3. ? ? 在調(diào)用對話框DoModal()函數(shù)之前進(jìn)行資源句柄切換HINSTANCE hResOld = AfxGetResourceHandle();?AfxSetResourceHandle(hDll);?……CYourDlg dlg;?dlg.DoModal();?……AfxSetResourceHandle(hResOld);?若是第二種表現(xiàn),即對話框彈不出來,同時伴隨內(nèi)存訪問錯誤的提示框出現(xiàn),那么問題很可能出現(xiàn)在初始化對話框界面的代碼方面,具體是在OnInitDialog函數(shù),即使它是在DLL中彈出對話框。事實(shí)上在在DLL中彈出對話框如果不進(jìn)行資源句柄切換,頂多是彈不出對話框,并不會出現(xiàn)內(nèi)存訪問方面的錯誤。在解決這方面的錯誤,一個誤區(qū)是單步進(jìn)入DoModal()函數(shù)調(diào)試,直至定位DoModal函數(shù)內(nèi)部哪一句出錯。后來我發(fā)現(xiàn)這純粹是浪費(fèi)時間,就算定位了在DoModal函數(shù)內(nèi)部哪一句出錯,你依然不知道為什么會出錯。實(shí)際上調(diào)用DoModal()函數(shù),激發(fā)的卻是OnInitDialog函數(shù)。因此你只需確定OnInitDialog函數(shù)哪一句出錯了(這里的OnInitDialog函數(shù)是指派生對話框類的OnInitDialog函數(shù))。
總結(jié)
以上是生活随笔為你收集整理的关于对话框DoModal()函数调用失败的原因分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# WINFORM SOCKET编程-
- 下一篇: 结构体、类的成员对齐