我们的一个应用程序有一个COM接口,它将启动一个对话框,例如:
STDMETHODIMP CSomeClass::LaunchDialog(BSTR TextToDisplay)
{
CDialog *pDlg = new CSomeDialog(TextToDisplay);
pDlg->BringWindowToTop();
}
由于某些原因,当服务器一次多次调用COM方法时,我们会得到奇怪的行为:
它有点像对话框是兄弟姐妹,但我没有看到任何奇怪的事情发生。这可能是由于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。
答案 0 :(得分:0)
听起来第一个对话框已被设置为第二个对象的所有者,第二个对话框被设置为第三个对象的所有者。您是否可以更改对话框初始化以显式指定所有者窗口?是否有一个有意义的窗口分配?也许桌面窗口,如果它们都打算成为顶级窗口?
如果您希望能够访问所有三个(或更多),那么它们将需要无模式。尝试使用Create(CSomeClass::IDD, CWnd::GetDesktopWindow())
,您应该看到兄弟对话框,所有对话框都显示在任务栏上。