【发布时间】:2010-09-07 11:10:00
【问题描述】:
我开发了一个 COM 组件 (dll),它实现了一个显示 WTL 模式对话框的 Edit() 方法。
该 COM 组件的完整接口对应于化学过程工业中使用的软件标准 (CAPE-OPEN),因此该 COM 组件应该可以被我不知道的一系列第 3 方可执行文件使用控制。
我的组件在许多这些 EXE 中都按预期工作,但特别是其中一个,Edit() 方法只是挂起而没有出现对话框。
但是,如果我在 DoModal() 之前立即调用 ::MessageBox(),则对话框会在首次显示 MessageBox 后显示并正确运行。
我怀疑问题可能与这个作为“隐藏窗口应用程序”运行的特定 EXE 有关。
我尝试使用 NULL 和来自 ::GetConsoleWindow() 的返回值作为对话框的父级,但都没有成功。
对话框本身是一个 ATL/WTL CPropertySheetImpl。
有问题的父应用程序 (EXE) 不受我控制,因为它是由(轻度敌对的)第 3 方开发的。
我确实知道我可以成功调用::MessageBox() 或从我的 COM 组件显示标准 Windows 文件对话框,并且在这样做之后我就可以显示我的自定义对话框。如果不先显示“标准”对话框,我将无法显示我的自定义对话框。
谁能建议我如何在不先显示不必要的 MessageBox 的情况下让它显示对话框?我知道这是可能的,因为我已经看到这个 EXE 显示了来自其他 COM 组件对应于同一接口的对话框。
【问题讨论】: