COM: можно ли узнать, есть ли внепроцессная ссылка на один из моих COM-объектов? Могу я его выпустить?

У меня есть приложение, которое делает COM-объект доступным для внешних клиентов (путем его регистрации в ROT).

Объект реализован на C ++ с использованием ATL.

Вопрос 1. Можно ли определить, исходит ли одна из ссылок на мой объект от внепроцессного клиента?

Мотивация: мне нужно освободить некоторые связанные объекты (которые блокируют некоторые операции) при удалении внешних ссылок, даже если внешняя ссылка неожиданно умирает. Я также не хочу требовать от звонящего прощаться.

Я использую один и тот же интерфейс внутри, поэтому я не могу работать с отдельным счетчиком ссылок для интерфейса. Открытый интерфейс основан на IDispatch, поэтому настраиваемого маршалинга не происходит.

Вопрос 2: Можно ли сообщить внепроцессным ссылкам на объект (и / или все объекты), что объект больше не жив? Принудительный возврат любого вызова внепроцессного интерфейса, например RPC_E_DISCONNECTED (так же, как после завершения серверного процесса, клиент получает RPC_E_SERVER_DIED для каждого вызова).

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


person peterchen    schedule 29.06.2020    source источник
comment
я думаю, что вам нужно реализовать _1 _ интерфейс на вашем объекте   -  person RbMm    schedule 30.06.2020
comment
и CoDisconnectObject для 2   -  person RbMm    schedule 30.06.2020
comment
@RbMm: спасибо, работает как положено. если вы хотите опубликовать его в качестве ответа, я с радостью приму.   -  person peterchen    schedule 30.06.2020


Ответы (1)


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

CoDisconnectObject позволяет указать внешнее соединение, чтобы уйти (хотя кажется, что внешний вызывающий абонент не может быть уведомлен немедленно, цикл сообщений может быть активным).

person Community    schedule 23.07.2020