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

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

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

有时(十分之1 ??),弹出窗口根本无法显示,并且主应用程序挂起。永远不会调用“弹出”对话框的OnShowWindow。我曾尝试调用ShowWindowASync,但有时仍无法显示弹出窗口,但此调用不会锁定Main App。

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

如果弹出窗口显示第一次调用ShowWindow,则可以在主应用程序的整个生命周期中无限期关闭和重新打开它。如果(使用ShowWindowASync)弹出窗口无法显示,则它将在主应用程序的生命周期内永远不会显示。我可以重新运行该应用程序(而无需重建任何内容),并且它运行或失败的几率很大。我无法确定任何预测条件或属性。

我已经使用工具对所有资源元素进行重新编号,以便在整个解决方案中不会发生冲突。

更新:

我使用Winspector来获取有关该对话框的一些信息,无论该对话框是否有效。

当对话框正常工作(正确显示)时,Winspector报告我的对话框具有有效的位置(10、96、1015、514),与资源模板匹配的样式属性,ID为0(不确定ID的含义)以及“所有者EXE”是“ MyApp.exe”-我可以看到许多消息传入和传出对话框,包括WM_SHOWWINDOW。

对话框失败(未显示显示窗口消息)时,Winspector报告位置(-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特定的问题。

uniquecll 回答:有时ShowWindow从不调用OnShowWindow且主应用程序挂起

正在从未执行消息泵的线程创建对话框。这是根本问题。我曾尝试从“ init”线程初始化所有对话框(即称为“ Create”),然后稍后在winproc / GUI线程中使用它们。显然不能做到这一点。

然后将指向对话框的指针检索到winproc / GUI(具有消息泵)中,但是到那时,对话框已经“损坏”并且不再正确响应winproc

本文链接:https://www.f2er.com/3150366.html

大家都在问