Обновлено: см. этот другой поток . Вместо этого все эти COM-компоненты не являются частью проблемы.
Одно из наших приложений имеет интерфейс COM, который запускает диалоговое окно, например:
STDMETHODIMP CSomeClass::LaunchDialog(BSTR TextToDisplay)
{
CDialog *pDlg = new CSomeDialog(TextToDisplay);
pDlg->BringWindowToTop();
}
По какой-то причине, когда COM-метод вызывается сервером несколько раз одновременно, мы получаем странное поведение:
- Мы получаем несколько диалогов, но только одна запись на панели задач
- Диалоговый Z-порядок основан на созданном порядке и не может быть изменен ... первый созданный диалог всегда отображается под вторым, 2-й под 3-м и т. Д., Даже если вы перетаскиваете их
- если было создано N диалогов, закрытие одного из них закрывает его, а все остальные создаются впоследствии. например, если 5 диалоговых окон создано, и вы закрываете третий, # 3, # 4, # 5 все закрываются.
Это похоже на то, что диалоги - это братья и сестры, но я не вижу ничего странного. Возможно, это связано с COM, или это странная проблема MFC / Win32?
EDIT: если метод интерфейса вызывается несколько раз по отдельности, он работает как положено. Только когда серверный компонент отправляет несколько через один раз, он, кажется, портит. Может быть виноваты потоки / тайминги?
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, родитель = 0013014A
- Dlg создан. HWND = 000B03B0, родитель = 001B0390
Очевидно, что проблема 1039 * состоит в том, что диалоги становятся дочерними элементами друг для друга. Но вопрос , ПОЧЕМУ ?! Кажется, Windows делает это автоматически ...
Этот вопрос, кажется, несколько отличается от основной проблемы воспитания детей, поэтому я попытался выделить основной вопрос в новый вопрос .