有时ShowWindow从不调用OnShowWindow,主应用程序挂起



我有一个多线程应用程序,它有几个支持DLL和几个弹出对话框。我的主应用程序在启动时加载所有DLL,这会创建所有弹出窗口,但它们会一直隐藏,直到需要为止。

当用户按下主应用程序中的按钮时,将通过调用ShowWindow(SW_SHOW((无模式(显示特定的弹出窗口(来自DLL(

有时(十分之一?(弹出窗口根本无法显示,主应用程序挂起。永远不会调用弹出对话框的OnShowWindow。我试着调用ShowWindowASync,但有时它仍然无法显示弹出窗口,但这个调用不会锁定主应用程序。

此问题只影响单个DLL中的弹出窗口。

如果弹出窗口显示第一次调用ShowWindow,则它可以在主应用程序的整个生命周期内无限期关闭和重新打开。如果(使用ShowWindowASync(弹出窗口无法显示,则在主应用程序的生命周期内将永远不会显示。我可以重新运行应用程序(无需重建任何内容(,它有工作或失败的偶然机会。我无法确定任何预测条件或特性。

我已经使用工具对所有资源元素进行了重新编号,这样在整个解决方案中就不会出现冲突。

更新:

当对话框工作和不工作时,我使用Winspector来获取一些有关对话框的信息。

当对话框正常工作(显示正确(时,Winspector报告我的对话框具有有效位置(10,96101514(,与资源模板匹配的样式属性,ID为0(不确定ID的含义(,并且"所有者EXE"是"MyApp.EXE"-我可以看到许多消息进出对话框,包括WM_SHOWWINDOW。

当对话框失败(未获得显示窗口消息(时,Winspector会报告位置(-151219017634(、与资源模板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

最新更新