Как узнать функция CoCreateInstance возвратила новый экземпляр объекта или уже существующий?
On 04/16/2010 08:51 PM, megapixel wrote:
> Моё приложение запускает внешний процесс с com интерфейсом через
> cocreateinstance и необходима функциональность закрывающая это внешнее
> приложение по окончании работы с ним если оно не существовало ранее.
> Насколько я понимаю теоретически внешнее приложение должно закрыться при
> обнулении счётчика ссылок на него но в данном случае этого не происходит
> и оно закрывается только по вызову специальной функции.
1. Клиент должен использовать IClassFactory::LockServer чтобы
гарантировать, что компонент не выгрузится пока клиент использует
фабрики классов, но не использует COM-объекты этого компонента.
2. EXE-серверы сами управляют временем своей жизни. Никто не должен
выгружать EXE сервер, он должен выгружаться сам.
3. В реализации IFactory::LockServer, в случае EXE сервера необходимо
при освобождении блокировки проверять счетчик активных объектов, и если
таковых нет, то либо выгружать EXE сразу, либо подождать с пол-секунды,
и если больше никто не залокает фабрику и не запросит ко-класс, то
выгружать через пол секунды. (Такой таймаут полезен, когда сервер
дергают куча скриптов в пакетном режиме).
4. В реализации IUnknown::Release также нужно проверять блокировки и
счетчик ссылок и выгружать EXE как и при освобождении блокировки.
Закрывать Внепроцессный сервер с помощью вызова специальной функции —
нарушение спецификации COM. НЕ ДЕЛАЙТЕ ТАК.
Posted via RSDN NNTP Server 2.1 beta