Вызов графического интерфейса .NET с исполняемого сервера ATL (COM) - PullRequest
0 голосов
/ 08 февраля 2011

У нас следующая ситуация:

COM-сервер ATL (вне процесса, EXE), на котором размещаются COM-объекты с точками подключения. Эти объекты «живут внутри» одного (exe) процесса и запускают события (используя методы Fire_ *), чтобы другие процессы (например, приложение .NET GUI в другом процессе, «клиент» сервера ATL EXE) ) может ловить эти события и реагировать соответственно.

В настоящее время у нас есть приложение .NET (Windows Forms), которое является клиентом сервера ATL. При запуске (двойной щелчок) он присоединяет некоторые делегаты (обработчики событий) к событиям COM-объектов (точкам подключения), размещенным на сервере ATL. Каждый раз, когда событие запускается с сервера ATL, клиент .NET обычно отображает некоторую информацию в главном окне или открывает новое окно для взаимодействия с пользователем. Это решение основано на следующей статье: http://www.codeproject.com/KB/COM/cominterop.aspx#ConnectionPoints (обработка событий COM-.NET).

В приведенном выше сценарии предполагается, что пользователь фактически дважды щелкнул клиент .NET (exe) до запуска событий, то есть - явно открыл приложение .NET. Если клиент .NET не открыт (не создан), то запущенное событие «потеряно» - ни один клиент не обработал его.

Мы хотим следующую ситуацию:

Когда событие запускается с сервера ATL, немедленно должно появиться окно (всплывающее окно), с которым пользователь может взаимодействовать (например: заполните текстовое поле электронной почты и нажмите «ОК»), без необходимости запуска Клиент .NET явно до всего. Таким образом, пользователь будет уведомлен о каждом событии и может интерактивно реагировать на него.

Мы рассмотрели вариант размещения клиентского приложения .NET как dll на сервере ATL, но я читал, что отображение GUI из EXE-файла ATL - это большое «НЕТ-НЕТ» (любой GUI, не только. NET GUI, такой как WinForms или WPF).

Возможно ли это, когда сервер и клиент работают в двух разных процессах (а "клиент" еще не запущен)? Кто-нибудь сталкивался с такой же проблемой? было ли это решено (и как ...)?

Спасибо; -)

Омри

Есть ли решение для этого?

1 Ответ

1 голос
/ 08 февраля 2011

Вы не можете сделать эту работу так, как вы описываете. Если никто не слушает событие, то нет никакого способа ответить на него. Тривиально решите свою проблему, запустив приложение .NET с помощью ярлыка в папке «Автозагрузка», чтобы он всегда работал, когда пользователь вошел в систему. Вам не нужно создавать окно, пока вы не получите уведомление от сервера. Кража фокуса не сработает, кстати, поэтому вам, вероятно, понадобится NotifyIcon с воздушным шаром.

...