Приложение COM MFC не показывает окно - PullRequest
1 голос
/ 24 апреля 2009

У меня есть приложение MFC с поддержкой ATL, идея в том, что когда кто-то создает экземпляр моего интерфейса, объявленного в приложении mfc, это создание создает и отображает окно.

Это все работает нормально, если com-клиентом является cmd.exe, я сделал быстрый com-клиент, который создает экземпляр интерфейса, и когда это происходит, окно отображается по желанию.

Но если эта реализация выполняется в других com-объектах (например, объектах (службах) atl-сервера), окно не отображается. Обратите внимание, что процесс mfc создается в процессе DcomLaunch, но окно не отображается. Все работает нормально, но окно не отображается на моем рабочем столе.

Два вопроса:

1) почему мое окно не отображается в этой ситуации?

2) когда я создаю тот же интерфейс с моим консольным приложением, создается только один процесс приложения mfc, независимо от того, сколько консольных приложений я запускаю, и если служба пытается создать более одного объекта, более одного MFC процесс создан! почему это, как я могу избежать этого. Как я могу сделать так, чтобы первый процесс MFC всегда был таким же, который отвечает на вызовы клиента?

(я думаю, это все из-за настроек безопасности ... но я уже пытаюсь изменить некоторые и ничего ...)

Спасибо

Нуно

1 Ответ

1 голос
/ 28 апреля 2009

Обычно служба не может создавать окна. В предварительной версии вы можете включить службу для взаимодействия с рабочим столом (например, открыть окно) с помощью флажка «Разрешить службе взаимодействовать с рабочим столом» в теге «Вход в систему» ​​свойств указанных служб. Если вы нацелены на Vista, это не вариант.

Однако, учитывая, что вы имеете дело с сервисом DcomLaunch, вы явно не хотите этого делать.

Даже если бы вы сами писали об услуге, никто не посоветовал бы вам делать это в любом случае по нескольким причинам (без определенного порядка):

  • Созданный пользовательский интерфейс будет доступен только в сеансе 0
  • Создание окна создает службу атаки в вашем (возможно) привилегированном процессе, поскольку любой другой процесс, который запускает пользователь, может взаимодействовать с окном службы.

Опять же, поскольку вышеприведенное работает только до версии Vista и, в любом случае, является плохой идеей, общепринятой «наилучшей практикой» для службы, которая хочет представить пользовательский интерфейс, является наличие отдельного приложения, содержащего пользовательский интерфейс, который взаимодействует с сервис, использующий любой механизм IPC, который вы выберете.

...