關於對話方塊DoModal 函式呼叫失敗的原因分析

2021-08-22 17:08:50 字數 1040 閱讀 8724

朱金燦

對話方塊 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函式)。

關於對話方塊DoModal 函式呼叫失敗的原因分析

對話方塊domodal 函式呼叫失敗一般而言有兩種表現形式 一是對話方塊彈不出來,但是沒有錯誤提示 二是對話方塊彈不出來,同時伴隨記憶體訪問錯誤的提示框出現。第一種表現主要是因為沒有對資源控制代碼進行切換造成的,以在dll中彈出對話方塊中最為常見。解決辦法是 如果是mfc規則dll,可以使用所有匯出...

關於對話方塊

1.1 一般new的時候在初始化的時候,而進行銷毀的時候是在程式退出的時候。1.2 就如windows中的,在init函式進行new操作然後在onclose函式中進行delete操作。1.3 注意 在沒有不得已的時候不要在標頭檔案中包含其他標頭檔案,這是非常之高危險的事情,盡量的使用前置宣告。1.4...

對話方塊 訊息對話方塊

我們在使用windows系統的過程中經常會見到訊息對話方塊,提示我們有異常發生或提出詢問等。因為在軟體開發中經常用到訊息對話方塊,所以mfc提供了兩個函式可以直接生成指定風格的訊息對話方塊,而不需要我們在每次使用的時候都要去建立對話方塊資源和生成對話方塊類等。這兩個函式就是cwnd類的成員函式mes...