На MS Windows Server 2003 запущена служба (32-бит) под сетевыми правами. Из этой службы создаётся процесс (32-бит) (назовём P1) под правами пользователя (пользователь в группе администраторов, но в текущий момент не залогинен). Из этого процесса (P1) запускается COM-сервер (out-process, exe-файл) 64-бит. Далее у сервера вызывается метод, который успешно выполняется (т.е. всё создалось, подключилось и работает) и после этого процесс P1 уходит в ожидание, но COM-сервер не релизится (указатель храниться в CComPtr). Примерно через 10 секунд сервер благополучно завершает работу (процесс P1 ему в этом не помогал). После отладки выясняется, что с какого-то боку (неизвестно откуда) на сервер пришёл Release.
Вопрос: откуда это могло прийти (может, операционка постаралась) и что сделать, чтобы COM-сервер нормально продолжал работать?
Здравствуйте, apoheliy, Вы писали:
A>На MS Windows Server 2003 запущена служба (32-бит) под сетевыми правами. Из этой службы создаётся процесс (32-бит) (назовём P1) под правами пользователя (пользователь в группе администраторов, но в текущий момент не залогинен). Из этого процесса (P1) запускается COM-сервер (out-process, exe-файл) 64-бит. Далее у сервера вызывается метод, который успешно выполняется (т.е. всё создалось, подключилось и работает) и после этого процесс P1 уходит в ожидание, но COM-сервер не релизится (указатель храниться в CComPtr). Примерно через 10 секунд сервер благополучно завершает работу (процесс P1 ему в этом не помогал). После отладки выясняется, что с какого-то боку (неизвестно откуда) на сервер пришёл Release.
A>Вопрос: откуда это могло прийти (может, операционка постаралась) и что сделать, чтобы COM-сервер нормально продолжал работать?
По-моему это делает proxy/stub или служба RPC.
А чем это мешает серверу работать дальше? Не надо уничтожать объект и все, правда так стоит делать, только если сервер создает 1 общий для всех объект. Ну или если очень хочется

, можно в IClassFactory::CreateInstance самостоятельно вызвать лишний раз AddRef для своего объекта.