У меня есть приложение, которое делает COM-объект доступным для внешних клиентов (путем его регистрации в ROT).
Объект реализован на C ++ с использованием ATL.
Вопрос 1. Можно ли определить, исходит ли одна из ссылок на мой объект от внепроцессного клиента?
Мотивация: мне нужно освободить некоторые связанные объекты (которые блокируют некоторые операции) при удалении внешних ссылок, даже если внешняя ссылка неожиданно умирает. Я также не хочу требовать от звонящего прощаться.
Я использую один и тот же интерфейс внутри, поэтому я не могу работать с отдельным счетчиком ссылок для интерфейса. Открытый интерфейс основан на IDispatch
, поэтому настраиваемого маршалинга не происходит.
Вопрос 2: Можно ли сообщить внепроцессным ссылкам на объект (и / или все объекты), что объект больше не жив? Принудительный возврат любого вызова внепроцессного интерфейса, например RPC_E_DISCONNECTED
(так же, как после завершения серверного процесса, клиент получает RPC_E_SERVER_DIED
для каждого вызова).
Мотивация: процесс завершения работы сервера может быть инициирован пользователем и может занять некоторое время. В это время все звонки от внешних клиентов блокируются; было бы благоразумно сообщить им раньше, что вызов не удался.
CoDisconnectObject
для 2 - person RbMm   schedule 30.06.2020