Я разработал COM-компонент (dll), который реализует метод Edit (), отображающий модальное диалоговое окно WTL.
Полный интерфейс к этому COM-компоненту соответствует стандарту программного обеспечения, используемому в химической промышленности (CAPE-OPEN), и в результате этого COM-компонент должен использоваться различными исполняемыми файлами сторонних производителей, которые не входят в мой список. управление.
Мой компонент работает должным образом во многих из этих EXE-файлов, но для одного из них, в частности, метод Edit () просто зависает без появления диалога.
Однако, если я сделаю вызов ::MessageBox()
непосредственно перед DoModal()
, диалоговое окно отобразится и будет работать правильно после первого отображения MessageBox.
У меня есть подозрение, что проблема может быть связана с тем, что данный конкретный EXE-файл работает как «приложение со скрытым окном».
Я пытался использовать как NULL, так и возвращаемое значение из ::GetConsoleWindow()
в качестве родителя диалога, ни один из них не работал.
Сам диалог является ATL / WTL CPropertySheetImpl.
Родительское приложение (EXE), о котором идет речь, находится вне моего контроля, так как оно разработано (слегка враждебно) третьей стороной.
Я знаю, что могу успешно вызвать ::MessageBox()
или отобразить стандартное диалоговое окно файлов Windows из моего COM-компонента, и что после этого я смогу отобразить свой собственный диалог. Я просто не могу отобразить свой собственный диалог без предварительного отображения стандартного диалога.
Может кто-нибудь подсказать, как заставить его отображать диалоговое окно без предварительного показа ненужного MessageBox? Я знаю, что это возможно, потому что я видел, как этот EXE отображает диалоги других компонентов COM, соответствующих тому же интерфейсу.