通过COM创建多个MFC对话框,这是一种奇怪的行为

时间:2010-04-28 12:30:23

标签: c++ com mfc winapi

更新:请参阅this other thread,所有这些COM内容都不是问题的一部分。


我们的一个应用程序有一个COM接口,它将启动一个对话框,例如:

STDMETHODIMP CSomeClass::LaunchDialog(BSTR TextToDisplay)
{
  CDialog *pDlg = new CSomeDialog(TextToDisplay);
  pDlg->BringWindowToTop();
}

由于某些原因,当服务器一次多次调用COM方法时,我们会得到奇怪的行为:

  • 我们获得了多个对话框,但任务栏中只有一个条目
  • Dialog Z-order基于创建的订单,无法更改...创建的第一个对话框始终显示在第二个,第二个下面的第三个等,即使你拖动它们
  • 如果创建了N个对话框,则关闭其中一个会关闭它,之后创建所有其他对话框。例如,如果创建了5个对话框并关闭了第3个对话框,则#3,#4,#5全部关闭。

它有点像对话框是兄弟姐妹,但我没有看到任何奇怪的事情发生。这可能是由于COM,还是一个奇怪的MFC / Win32问题?

编辑:如果分别多次调用接口方法,它将按预期工作。只有当服务器组件一次发送几个时才会出现问题。线程/时间可能是罪魁祸首吗?

EDIT2: 我把这个登录记录在:

std::stringstream ss;
HWND self = dlg->m_hWnd;
HWND parent = dlg->GetParent() ? dlg->GetParent()->m_hWnd : 0;
ss<<"Dlg created'. HWND = "<<self<<", Parent = "<<parent<<std::endl;
OutputDebugString(ss.str().c_str());

它给了:

  
      
  • Dlg创建。 HWND = 0013014A,父= 00000000
  •   
  • Dlg创建。 HWND = 001B0390,Parent = 0013014A
  •   
  • Dlg创建。 HWND = 000B03B0,Parent = 001B0390
  •   

显然问题是对话框正在成为彼此的孩子。但问题是,为什么?!看来Windows正在自动执行此操作......

这个问题似乎与主要的育儿问题略有不同,所以我试图将主要问题分为new question

1 个答案:

答案 0 :(得分:0)

听起来第一个对话框已被设置为第二个对象的所有者,第二个对话框被设置为第三个对象的所有者。您是否可以更改对话框初始化以显式指定所有者窗口?是否有一个有意义的窗口分配?也许桌面窗口,如果它们都打算成为顶级窗口?

如果您希望能够访问所有三个(或更多),那么它们将需要无模式。尝试使用Create(CSomeClass::IDD, CWnd::GetDesktopWindow()),您应该看到兄弟对话框,所有对话框都显示在任务栏上。