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 . Подробные сведения о проблемах с потоком на серверах внутри процесса см. в разделе "Проблемы потоков в процессе".

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

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

Модель COM