Как заставить процесс изоляции для COM-сервера вне процесса? - PullRequest
0 голосов
/ 02 февраля 2009

Я пишу управляемый код, который должен взаимодействовать с сервером автоматизации COM поставщиком энергии, которая проходит вне процесса. Я обнаружил, что этот сервер становится неустойчивым, если более чем один клиент подключается к нему. Например, если я управляемый код в процессе А и управляемый код в процессе B и подключение к этому COM-серверу, один процесс будет раскручиваются для COM-сервера и его поведение является менее надежным. Я надеюсь, что есть способ заставить отдельный процесс для каждого клиента - подключение к серверу . В идеале, я хотел бы закончить с:

Управляемый процесс A разговаривает с COM-сервера в процессе С1
Управляемый процесс B разговаривает с COM-сервера в процессе С2

Одна мысль, что пришло в голову, что если я побежал процесс А и процесс В с разными фамилиями безопасности, что это может привести к COM инфраструктуры для создания отдельных серверных процессов. Я бы предпочел не идти по этому пути, однако. Управляемый процесс A и B Управляемый процесс на самом деле Windows Services. И я бегу их с единицей локальной системы (потому что они нужны, чтобы иметь возможность взаимодействовать с рабочим столом, и вы не можете установить флажок «взаимодействие с рабочим столом» на апплета услуг за услуги, которые не работают, как локальные System). И причина, мне нужно взаимодействовать с рабочим столом, что это COM-сервер иногда подбрасывает диалоговое окно на экране, и если сама служба не может взаимодействовать с рабочим столом, то COM-сервер нерестится не может отобразить диалоговое окно (я считаю, что это отображается на скрытой WinStation).

Ответы [ 3 ]

2 голосов
/ 04 февраля 2009

Поместите компонент, зарегистрированный в COM +, это поместит слой изоляции в ваш.
Использование: Панель управления-> Администрирование
или cmd / выполнить DCOMCNFG

Службы компонентов-> Компьютеры-> Мой компьютер-> Приложение COM +, щелкните правой кнопкой мыши, новое приложение, далее, Создайте пустое приложение, введите имя приложения «COM + your.dll», далее выберите «Локальная служба», далее, далее, затем закончить.

В созданном новом элементе разверните узел Компоненты, щелкните правой кнопкой мыши новый компонент, затем выберите «Установить новый компонент» и выберите свой компонент.

Нажмите Свойства компонента, перейдите на вкладку Идентификация, выберите Системная учетная запись.

Об ошибках в вызовах см. Событие после.

1 голос
/ 02 февраля 2009

Прошло много времени с тех пор, как я это сделал, поэтому память у меня мутная.

Если вы конфигурируете OOP COM-сервер в качестве DCOM-сервера с помощью средства настройки DCOM, я полагаю, вы можете указать уровень изоляции. Я сделал это несколько лет назад с помощью не-поточной внутрипроцессной DLL-библиотеки, к которой нужно было обращаться из IIS безотказным способом, и это сработало.

Дайте мне знать, если это работает для вас:)

0 голосов
/ 02 февраля 2009

Лучше всего, чтобы поставщик исправил компонент. В конце концов, если он не будет обрабатывать несколько клиентов, могут быть и другие ошибки . Если вы не можете сделать это, попробуйте другие вещи.

С внутрипроцессными COM-объектами у меня была возможность вручную загрузить dll и получить доступ к интерфейсам напрямую, не проходя через COM.

Я сам этого не делал с помощью внепроцессного COM, но есть некоторые вещи, которые вы можете попробовать. В конечном итоге библиотека - это просто процесс, сидящий там и получающий сообщения, которые вызывают функции.

Возможно, вы сможете вручную запустить новую копию процесса для каждого клиента и затем отправить ему сообщения. Вы можете столкнуться с некоторыми сбоями с этим. Например, процесс может проверить, запущен ли он, и отказать в запуске или быть недовольным.

Если у вас есть известный верхний предел числа клиентов, другой подход, который вы могли бы рассмотреть, - сделать несколько копий исходного файла .exe и затем использовать двоичное исправление (что-то похожее на библиотеку обходов от Microsoft Research) для переопределите функции регистрации COM и зарегистрируйте каждую копию как отдельный объект COM.

...