Re[2]: Удаление COM-объекта
От: Quantum Россия  
Дата: 04.10.02 18:34
Оценка:
Здравствуйте TK, Вы писали:

AV>>Подскажите, есть ли какой-нибудь способ убить COM-объект, невзирая на его счетчик ссылок. Т.е. имеется ссылка на один из его интерфейсов и по ней надо его грохнуть?


TK>Вызывать Release в цикле пока retval != 0. Но это может и не сработать...


Я бы не стал на это полагаться по двум причинам. Во-первых, не смотря на то IUnknown::Release() возвращает ULONG, в спецификации COM не оговорено что это будет именно количество ссылок. Во-вторых, возможно, что компонент использует специфический механизм подсчёта ссылок, который не позволяет конкретному клиенту освободить больше, чем он взял (например, в COM+ это включается через консоль управления).

Прежде всего замечу, что такое поведение противоречит концепции архитектуры COM-приложений, и, если возможно, нужно постараться избежать необходимости в такой функциональности.
Приведу первый пришедший в голову способ. Создаётся интерфейс, скажем, IEmergencyLifetimeControl, имеющий метод DestroyObject(), который просто уничтожает объект на сервере. Затем в кокласс добавляется поддержка этого интерфейса и его реализация (которая, скажем, делает "delete this;").
Плох этот метод, помимо всего прочего тем, что необходимо иметь доступ к исходному коду кокласса, однако можно создать оболочку вокруг любого данного кокласса, которая будет реализовывать те же интерфейсы что и он путём переадресации вызовов, а так же иметь уже описанную функциональность. В этом случае можно избежать ряда проблем вроде "осиротевших" прокси путём предоставления некоторой функциональности даже если сам "пациент" уже покинул нас.

Да, кстати, в случае с COM+ можно предложить вариант с принудительно остановкой некоторого приложения.
Игорь Лобанов a.k.a. Quantum
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.