Открыть сервис

Component Object Model

Component Object Model (COM) — это технология программного интерфейса, разработанная корпорацией Microsoft, которая позволяет программным компонентам, созданным разными разработчиками на разных языках программирования, взаимодействовать друг с другом в рамках единой системы. COM определяет стандартный способ создания объектов, управления их временем жизни и вызова их методов, обеспечивая независимость от языка, платформы и местоположения компонента (в пределах одного компьютера). Технология лежит в основе многих ключевых компонентов Windows, включая OLE (Object Linking and Embedding), ActiveX, DirectX и Windows Shell.

История

Разработка COM началась в конце 1980-х годов как эволюция технологии OLE 1.0, которая позволяла встраивать и связывать документы разных приложений (например, внедрение таблицы Excel в документ Word). Первая версия COM была представлена в 1993 году вместе с OLE 2.0. В 1996 году Microsoft выпустила расширение COM под названием DCOM (Distributed COM), которое позволяло компонентам взаимодействовать по сети. Позднее, на основе COM, была создана технология COM+ (1997), добавившая поддержку транзакций, пулов объектов и очередей сообщений. В 2000-х годах COM постепенно вытеснялся платформой .NET, однако остаётся критически важным для обратной совместимости и работы устаревших систем.

Основные принципы

Двоичный стандарт

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

Управление временем жизни

COM использует механизм подсчёта ссылок для управления временем жизни объектов. Каждый объект имеет счётчик, который увеличивается при получении новой ссылки на него (метод AddRef) и уменьшается при освобождении ссылки (метод Release). Когда счётчик достигает нуля, объект уничтожается. Это позволяет избежать утечек памяти и гарантирует, что объект будет существовать, пока на него есть хотя бы одна ссылка.

Идентификация и создание объектов

Каждый COM-класс идентифицируется уникальным 128-битным идентификатором (CLSID, Class Identifier). Для создания экземпляра объекта используется функция CoCreateInstance, которая по CLSID находит в реестре Windows соответствующий сервер (DLL или EXE), загружает его и возвращает указатель на запрошенный интерфейс. Помимо CLSID, каждый интерфейс также имеет свой уникальный идентификатор (IID, Interface Identifier).

Прозрачность местоположения

COM обеспечивает прозрачность местоположения: клиентский код не знает, находится ли объект в том же процессе, в другом процессе на том же компьютере или на удалённой машине. За это отвечают прокси-объекты и заглушки (stubs), которые автоматически генерируются для маршалинга (упаковки) параметров вызовов между процессами или компьютерами. В DCOM эта функциональность расширена на сетевой уровень.

Архитектура

Интерфейсы

Интерфейс в COM — это контракт, определяющий набор методов, которые объект обязуется реализовать. Все COM-интерфейсы наследуются от базового интерфейса IUnknown, который содержит три метода:

  • QueryInterface — позволяет запросить у объекта указатель на другой интерфейс, который он поддерживает.
  • AddRef — увеличивает счётчик ссылок.
  • Release — уменьшает счётчик ссылок.

Благодаря QueryInterface клиент может динамически узнавать, какие возможности предоставляет объект, и переключаться между ними.

Серверы

COM-объекты могут быть реализованы в виде:

  • In-process сервера (DLL) — загружается в адресное пространство клиента, обеспечивая максимальную производительность.
  • Out-of-process сервера (EXE) — работает в отдельном процессе, что обеспечивает изоляцию и возможность работы с удалёнными объектами через DCOM.

Реестр

Реестр Windows (ключи HKEY_CLASSES_ROOT\CLSID и HKEY_CLASSES_ROOT\Interface) хранит информацию о зарегистрированных COM-классах и интерфейсах, включая пути к серверам, идентификаторы и дополнительные метаданные. При создании объекта система обращается к реестру для поиска и загрузки соответствующего сервера.

Применение

OLE (Object Linking and Embedding)

OLE позволяет встраивать и связывать объекты из одного приложения в другое. Например, пользователь может вставить таблицу Excel в документ Word, и при двойном щелчке по ней откроется редактор Excel. OLE является одним из первых и наиболее известных применений COM.

ActiveX

ActiveX — это технология, основанная на COM, которая позволяет создавать интерактивные элементы управления, встраиваемые в веб-страницы или другие приложения. ActiveX-контролы широко использовались в Internet Explorer для добавления функциональности (например, проигрыватели мультимедиа, просмотрщики PDF). Из-за проблем с безопасностью и распространения вредоносных программ использование ActiveX в вебе значительно сократилось.

Windows Shell

Многие компоненты оболочки Windows (Проводник, панель задач, рабочий стол) реализованы как COM-объекты. Расширения оболочки (shell extensions) позволяют сторонним разработчикам добавлять новые пункты в контекстное меню, настраивать отображение значков и папок, а также интегрироваться в диалоги свойств файлов.

DirectX

DirectX — это набор API для работы с мультимедиа (графика, звук, ввод), который также использует COM для управления своими объектами. Например, интерфейсы IDirect3DDevice9 или IDirectSoundBuffer являются COM-интерфейсами, что позволяет управлять их временем жизни и запрашивать дополнительные интерфейсы.

Критика и ограничения

  • Сложность разработки: COM требует строгого соблюдения двоичного стандарта, ручного управления памятью и подсчёта ссылок, что делает разработку трудоёмкой и подверженной ошибкам.
  • Проблемы с версионированием: Изменение интерфейса (добавление новых методов) может нарушить совместимость с существующими клиентами. Microsoft рекомендует создавать новые интерфейсы с новыми IID, а не модифицировать старые.
  • Безопасность: ActiveX и DCOM могут быть использованы для распространения вредоносного кода, если не настроены должным образом. В современных версиях Windows DCOM по умолчанию отключён или ограничен.
  • Устаревание: С появлением .NET, которая предоставляет более простую и безопасную модель компонентного взаимодействия (сборки, управляемая память), COM постепенно вытесняется из новых проектов. Однако для поддержки устаревших систем и обратной совместимости COM остаётся востребованным.

Интересные факты

  • COM не является объектно-ориентированной технологией в классическом смысле: она не поддерживает наследование реализации, только наследование интерфейсов.
  • Идентификаторы CLSID и IID генерируются с помощью алгоритма UUID (Universally Unique Identifier), что гарантирует их уникальность во всём мире.
  • Технология COM+ (на базе COM) была частью Windows 2000 и позволяла создавать масштабируемые серверные приложения с поддержкой транзакций и пулов объектов.
  • Многие современные технологии, такие как WinRT (Windows Runtime), используют COM-подобную модель, но с улучшенной поддержкой метаданных и упрощённым управлением.

Источники

  • Microsoft Developer Network (MSDN) — документация по COM, DCOM, OLE, ActiveX.
  • Книга «Inside COM» by Dale Rogerson (Microsoft Press, 1997).
  • Книга «Essential COM» by Don Box (Addison-Wesley, 1998).
  • Статья «Component Object Model» в Wikipedia (английская версия).
  • Технические спецификации Microsoft Windows SDK.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →