Верно ли, что службы COM не могут использоваться несколькими программами одновременно?

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

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

1
задан Cœur 9 October 2017 в 17:50
поделиться

2 ответа

Нет.

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

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

1
ответ дан 2 September 2019 в 21:50
поделиться

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

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

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

1
ответ дан 2 September 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: