Как узнать создан-ли новый экземпляр объекта?
От: megapixel  
Дата: 16.04.10 06:09
Оценка:
Как узнать функция CoCreateInstance возвратила новый экземпляр объекта или уже существующий?
Re: Как узнать создан-ли новый экземпляр объекта?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 16.04.10 07:19
Оценка:
Здравствуйте, megapixel, Вы писали:

M>Как узнать функция CoCreateInstance возвратила новый экземпляр объекта или уже существующий?


В СОМе этот вопрос несущественен — есть экземпляр и с ним можно работать. Поэтому — каков твой критерий нового и отличие его от существующего?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Как узнать создан-ли новый экземпляр объекта?
От: megapixel  
Дата: 16.04.10 13:51
Оценка:
Здравствуйте, Vi2, Вы писали:
Vi2>В СОМе этот вопрос несущественен — есть экземпляр и с ним можно работать. Поэтому — каков твой критерий нового и отличие его от существующего?
Моё приложение запускает внешний процесс с com интерфейсом через cocreateinstance и необходима функциональность закрывающая это внешнее приложение по окончании работы с ним если оно не существовало ранее.
Насколько я понимаю теоретически внешнее приложение должно закрыться при обнулении счётчика ссылок на него но в данном случае этого не происходит и оно закрывается только по вызову специальной функции.
Re[3]: Как узнать создан-ли новый экземпляр объекта?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 16.04.10 14:09
Оценка:
Здравствуйте, megapixel, Вы писали:

M>Моё приложение запускает внешний процесс с com интерфейсом через cocreateinstance и необходима функциональность закрывающая это внешнее приложение по окончании работы с ним если оно не существовало ранее.


CoCreateInstance возвращает новый экземпляр объекта. Это её парадигма. Иногда CoCreateInstance возвращает экземпляр-синглетон, но работа с ним ничем не отличается от работы в нормальной парадигмы.

GetActiveObject, в противовес CoCreateInstance, возвращает существующий экземпляр объекта.

Поэтому иногда работа клиента начинается с запроса GetActiveObject и при его неудаче продолжается запросом CoCreateInstance, и это учитывается при завершении.

M>Насколько я понимаю теоретически внешнее приложение должно закрыться при обнулении счётчика ссылок на него но в данном случае этого не происходит и оно закрывается только по вызову специальной функции.


Если у тебя есть явное указание на эту функцию, то вызывай её при окончании работы по CoCreateInstance. Возможно, есть и другие причины, почему сервер не желает завершиться корректно.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Как узнать создан-ли новый экземпляр объекта?
От: Other Sam Россия  
Дата: 18.04.10 07:07
Оценка:
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.