簡體   English   中英

有時 ShowWindow 從不調用 OnShowWindow 並且主應用程序掛起

[英]Sometimes ShowWindow never calls OnShowWindow and main App hangs

我有一個帶有多個支持 DLL 和幾個彈出對話框的多線程應用程序。 我的主應用程序在啟動時加載所有 DLL,這會創建所有彈出窗口,但在需要時它們會一直隱藏。

當用戶在主應用程序中按下一個按鈕時,通過調用 ShowWindow( SW_SHOW ) (無模式)顯示一個特定的彈出窗口(來自 DLL)

有時(十分之一?)彈出窗口根本無法顯示並且主應用程序掛起。 彈出對話框的 OnShowWindow 永遠不會被調用。 我曾嘗試調用 ShowWindowASync,但有時仍無法顯示彈出窗口,但此調用不會鎖定主應用程序。

此問題僅影響單個 DLL 內的彈出窗口。

如果彈出窗口顯示第一次調用 ShowWindow 時,它可以在主應用程序的整個生命周期內無限期地關閉和重新打開。 如果(使用 ShowWindowASync)彈出窗口無法顯示,則在主應用程序的生命周期內將永遠不會顯示。 我可以重新運行該應用程序(無需重建任何東西),它可能會工作或失敗。 我無法識別任何預測條件或屬性。

我已使用工具對所有資源元素重新編號,以便在整個解決方案中不存在沖突。

更新:

我使用 Winspector 來獲取有關對話框何時起作用和不起作用的一些信息。

當對話框工作(正確顯示)時,Winspector 報告我的對話框具有有效的 position(10,96,1015,514),與資源模板匹配的樣式屬性,ID 為 0(不確定 ID 的含義)和“所有者EXE”是“MyApp.exe”——我可以看到許多消息傳入和傳出對話框,包括 WM_SHOWWINDOW。

對話框失敗時(沒有得到顯示 window 消息),Winspector 報告 position (-1512, 190, -517, 634),樣式屬性與資源模板不匹配,ID 509290824,所有者 EXE 為“C:\ Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" - 當對話框無法顯示時,我在 Winspector 的消息查看器中也看不到任何消息。

顯然,對話框沒有正確創建。 CDialog::Create 對我來說永遠不會失敗。 此外,我在發布時遇到了這個問題(不使用 Visual Studio),所以這不是 VS 特定的問題。

該對話框是從未執行消息泵的線程創建的。 這是根本問題。 我曾嘗試從“init”線程初始化所有對話框(即調用“Create”),然后稍后在 winproc/GUI 線程中使用它們。 顯然不能這樣做。

然后將指向對話框的指針檢索到 winproc/GUI(具有消息泵)中,但到那時,對話框已經“損壞”並且不再正確響應 winproc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM