Правда ли, что COM-сервисы не могут использоваться несколькими программами одновременно? - PullRequest
1 голос
/ 26 августа 2010

До того, как приложение завершит свою работу выполнение, COM должен быть выключен снова. (Невозможность выключить COM может приводят к ошибкам выполнения, когда другая программа пытается использовать COM услуги.)

Приведенная выше цитата подразумевает это, верно?

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Очень важно, чтобы вы указали источник этой цитаты, чтобы мы могли получить контекст. Насколько я понимаю, вы узнали об этом из книги о программировании DirectShow. На самом деле он ссылается на необходимость вызова CoUninitialize ().

Да, это очень важно. Поток должен вызвать CoInitializeEx () для инициализации инфраструктуры COM, прежде чем он начнет использовать любую из функций COM API. Вы действительно должны вызывать CoUninitialize (), когда эти потоки заканчиваются, чтобы все было правильно очищено. Обычно в конце функции main () вашей программы. Невыполнение этого требования может привести к сбою другого приложения при обнаружении фабрики классов регистров, которая на самом деле мертва.

В противном случае ничего не имеет отношения к серверу COM вне процесса, который должен каким-либо образом ограничивать себя. Вы определяете режим совместного использования с аргументом REGCLS для CoRegisterClassObject (). Конечно, сервер должен не выходить и вызывать CoUninitialize до тех пор, пока все его объекты не будут освобождены.

1 голос
/ 26 августа 2010

Нет, это не так.

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

Служба COM вне процесса может быть спроектирована так, чтобы иметь отдельные экземпляры компонентов для каждого клиента (внутри или между службами), которые полностью независимы (даже если размещены в одном и том же процессе), и в этом случае трудно понять, сбой одного клиента будет влиять на другие экземпляры (кроме траты памяти на экземпляры до тех пор, пока COM, наконец, их не истечет). Если экземпляры делят состояние, они могут, конечно, вмешиваться, даже если клиенты работают в соответствии с правилами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...