Поделиться через


Com-библиотека

Любой процесс, использующий COM, должен инициализировать и деинициализировать библиотеку COM. Помимо спецификации COM также реализует некоторые важные службы в этой библиотеке. Предоставляется как набор библиотек DLL и EXEs (в основном Ole32.dll и Rpcss.exe) в Microsoft Windows, библиотека COM включает в себя следующее:

  • Небольшое количество основных функций, которые упрощают создание COM-приложений как клиента, так и сервера. Для клиентов COM предоставляет базовые функции для создания объектов. Для серверов COM предоставляет средства демонстрации своих объектов.

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

  • Прозрачные вызовы удаленных процедур, когда объект выполняется локально или на удаленном сервере.

  • Стандартный механизм, позволяющий приложению управлять выделением памяти в рамках своего процесса, особенно памятью, которая должна передаваться между взаимодействующими объектами, чтобы ее можно было освободить должным образом.

Чтобы использовать базовые службы COM, все потоки исполнения COM в клиентах и внепроцессных серверах должны вызывать CoInitialize или CoInitializeEx перед вызовом любой другой функции COM, кроме вызовов выделения памяти. CoInitializeEx заменяет другую функцию, добавляя параметр, который позволяет указать модель потоков для потока: либо многопоточный режим, либо свободный режим. Вызов CoInitialize просто устанавливает модель многопоточности, основанную на апартаментах.

Приложения составных документов OLE вызывают функцию OleInitialize, которая вызывает CoInitializeEx, а также выполняет некоторую инициализацию, необходимую для составных документов. Таким образом, потоки, вызывающие OleInitialize, не могут быть свободными потоками. Сведения о потоках в клиентах и серверах см. в разделе Процессы, потоки и компоненты.

Серверы внутри процесса не вызывают функции инициализации, так как они загружаются в процесс, который уже сделал это. В результате внутрипроцессные серверы должны задать свою модель поточности в реестре в разделе InprocServer32. Подробные сведения о проблемах с потоками в серверах с внутрипроцессной архитектурой см. в разделе In-Process Проблемы с потоками сервера.

Важно также деинициализировать библиотеку. Для каждого вызова CoInitialize или CoInitializeExдолжен быть соответствующий вызов CoUninitialize. Для каждого вызова OleInitializeдолжен быть соответствующий вызов OleUninitialize.

Серверы внутри процесса могут предположить, что процесс, в который они загружаются, уже выполнил эти действия.

компонентная объектная модель