Должен ли COM-сервер out-proc в конечном итоге остановиться во всех случаях, когда он не используется? - PullRequest
1 голос
/ 04 марта 2011

Я обнаружил, что COM-сервер out-proc реализован (предположительно из-за ошибки) таким образом, что, если клиент вызывает CoGetClassObject(), а затем никогда не пытается создать экземпляр чего-либо с извлеченной фабрикой, процесс сервера выполняется вечно.COM-сервер не запускается как служба, это простой исполняемый файл.

В описанном сценарии клиент никогда не вызывает IClassFactory::LockServer(), поэтому этот вопрос заключается в том, чтобы полностью игнорировать эти «блокировки сервера».

Это правильное поведение?Должен ли COM-сервер out-proc всегда останавливаться, если он не обслуживал объекты в течение определенного периода времени, или должны быть случаи, когда COM-сервер out-proc должен работать непрерывно, даже если он не обслуживает какие-либо объекты?

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

Серверы вне процесса и IClassFactory :: LockServer ()

COM добавляет неявный вызов LockServer с TRUE для объекта класса, когда он маршалирует интерфейс IClassFactory инеявный вызов LockServer с FALSE, когда клиент освобождает интерфейс IClassFactory.Следовательно, нет необходимости в удаленных вызовах LockServer обратно на сервер, и прокси-сервер для LockServer просто возвращает S_OK без фактического повторного вызова.

Процесс должен выполняться до тех пор, пока объект класса не будет освобожден как (raw) COM не предусматривает какой-либо механизм тайм-аута.Так что да, пока вы -> интерфейс объекта класса Release (), который вы приобрели с помощью CoGetClassObject (), серверный процесс (размещенный dll или exe) будет продолжать работать.Поведение не имеет ничего общего с классами, созданными объектом класса (фабрикой), поскольку на них ссылаются отдельно.

FWIW, Извлеченный интерфейс также не должен быть IClassFactory.Это может быть какая-то пользовательская реализация, поэтому вы можете делать что-то за пределами хорошо известных интерфейсов, которые предоставляет COM.Я нахожу странным, что CoGetClassObject вызывается вместо CoCreateInstance (Ex), так как вызов CoGetClassObject () действительно инструмент специального назначения для создания нескольких объектов.Я никогда не обнаруживал себя использующим объект класса, или прозвища, или дюжину других поведений, которые поддерживал COM.DCOM, COM +, OLE, конечно, но не низкоуровневое сырье.

1 голос
/ 04 марта 2011

Я думаю, что программа правильная.CoGetClassObject возвращает интерфейс AddRef, и если это не Release'd, EXE не должен выходить.

...