Вне процесса COM-сервер - вызовы функций и потоков - PullRequest
3 голосов
/ 28 мая 2010

Если у вас есть COM-сервер вне процесса, и вы вызываете функцию из Клиента внутри этого сервера из Thread X внутри клиента, то как эта функция выполняется на COM-сервере?

В потоке, который выполняется в данный момент, или в основном потоке?

Ответы [ 3 ]

2 голосов
/ 28 мая 2010

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

Если он находится в квартире MTA, то вызов метода будет выполняться в произвольном рабочем потоке RPC. И вам нужно будет принять обычные меры предосторожности при нарезке резьбы.

1 голос
/ 28 мая 2010

См. Обмен данными между объектами , Прокси и Заглушка .

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

Так какой метод на самом деле выполняется? Ответ заключается в том, что всякий раз, когда есть вызов к внешнему интерфейсу, каждый метод интерфейса реализован по объекту прокси. Объект прокси всегда внутрипроцессный объект, который действует от имени вызываемого объекта. Этот прокси-объект знает, что фактический объект работает в локальном или удаленный сервер.

Объект прокси упаковывает параметры функции в некоторых данных пакеты и генерирует вызов RPC для локальный или удаленный объект. Тот пакет забирается объектом-заглушкой в процессе сервера на локальном или удаленный компьютер, который распаковывает параметры и делает вызов Реальная реализация метода. Когда эта функция возвращается, заглушка упаковывает любые выходные параметры и вернуть значение и отправляет его обратно прокси, который распаковывает их и возвращает их первоначальному клиенту.

Таким образом, клиент и сервер всегда общаются с друг друга, как будто все было в процессе.

1 голос
/ 28 мая 2010

Потоки не переходят от процесса к процессу.

Внутри COM-сервера COM прослушивает входящие вызовы методов и имеет пул потоков (специфичных для этого процесса) для обслуживания запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...