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

COM-объект

COM-объект (Component Object Model, компонентная объектная модель) — это программный объект, созданный в соответствии со спецификацией COM, разработанной корпорацией Microsoft в 1993 году. COM-объекты представляют собой бинарные компоненты, которые могут взаимодействовать друг с другом независимо от языка программирования, в котором они написаны, и от адресного пространства, в котором они выполняются. Основная цель COM — обеспечить стандартизированный механизм для создания повторно используемых программных компонентов, их регистрации в системе и вызова их методов через строго определённые интерфейсы.

История

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

В 1996 году вышла версия DCOM (Distributed COM), которая расширила возможности COM на распределённые вычисления по сети. В 1997 году была представлена технология COM+ (в составе Windows NT 4.0 Option Pack), добавившая поддержку транзакций, пул объектов и управление контекстом. С выходом .NET Framework в 2002 году Microsoft начала постепенно замещать COM управляемым кодом, однако COM-объекты остаются в обратной совместимости Windows и используются в устаревших приложениях, драйверах и системных компонентах.

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

Бинарный стандарт

COM определяет строгий бинарный формат, которому должен соответствовать любой COM-объект. Это означает, что объект компилируется в динамическую библиотеку (DLL) или исполняемый файл (EXE) и предоставляет таблицу виртуальных функций (vtable) для каждого реализуемого интерфейса. Благодаря этому COM-объекты могут быть написаны на C++, Delphi, Visual Basic, а также на языках, поддерживающих вызовы через vtable.

Интерфейсы

Взаимодействие с COM-объектом происходит исключительно через интерфейсы — строго типизированные наборы методов, объявленные в виде абстрактных классов. Каждый интерфейс имеет уникальный идентификатор (IID — Interface Identifier), представляющий собой 128-битный GUID. Все COM-интерфейсы наследуются от базового интерфейса IUnknown, который содержит три метода:

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

Управление памятью

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

Регистрация и поиск

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

Архитектура COM

Серверы COM

COM-сервер — это модуль, реализующий один или несколько COM-классов. Серверы бывают трёх типов:

  • Внутрипроцессные (in-process) — DLL, загружаемая в адресное пространство клиента. Обеспечивают максимальную производительность.
  • Локальные (local) — EXE, выполняющийся в отдельном процессе на той же машине. Взаимодействие через механизм LPC (Local Procedure Call).
  • Удалённые (remote) — EXE или DLL, выполняющиеся на другой машине. Взаимодействие через DCOM с использованием RPC.

Маршалинг

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

Библиотеки типов

COM-объекты могут описывать свои интерфейсы и типы данных в библиотеках типов (type libraries) — файлах с расширением .tlb или .olb. Библиотеки типов содержат метаданные о методах, параметрах, структурах и перечислениях, что позволяет клиентам на языках высокого уровня (например, Visual Basic или VBA) использовать COM-объекты без ручного объявления интерфейсов.

Применение COM-объектов

ActiveX

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

Windows Shell

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

DirectX

DirectX — набор API для мультимедиа и игр, основанный на COM. Интерфейсы DirectX (например, IDirect3D9, IDirectSound8) являются COM-интерфейсами. Это обеспечивает универсальность и возможность обновления компонентов без перекомпиляции приложений.

Автоматизация (OLE Automation)

COM-объекты, реализующие интерфейс IDispatch, поддерживают позднее связывание — вызов методов по имени во время выполнения. Это позволяет использовать COM-объекты из скриптовых языков (VBScript, JavaScript) и языков, не поддерживающих раннее связывание. Примеры: Microsoft Office (Word, Excel, Outlook) предоставляют объектные модели через IDispatch.

Системные службы

COM+ (Component Services) — надстройка над COM, предоставляющая транзакции, пул объектов, управление контекстом и безопасность. COM+ используется в приложениях среднего уровня (middleware) на платформе Windows, например, в Microsoft Transaction Server (MTS) и Internet Information Services (IIS).

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

  • Сложность разработки — создание COM-объектов требует строгого соблюдения бинарного стандарта, управления подсчётом ссылок и GUID. Ошибки в реализации могут привести к утечкам памяти или нестабильности.
  • Проблемы безопасности — ActiveX-объекты могут выполнять произвольный код на клиентской машине, что привело к многочисленным уязвимостям. В современных версиях Windows ActiveX по умолчанию отключён.
  • Зависимость от Windows — COM является платформозависимой технологией, ограниченной экосистемой Microsoft. Попытки портирования (например, проект Wine) существуют, но не обеспечивают полной совместимости.
  • Устаревание — с появлением .NET Framework и управляемого кода, а также веб-технологий (REST, SOAP, JSON), COM постепенно вытесняется из новых проектов. Microsoft рекомендует использовать COM только для поддержки существующих систем.

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

  • Идентификатор GUID (128-битное число) в COM генерируется алгоритмом, основанным на MAC-адресе сетевой карты, времени и случайном числе, что обеспечивает уникальность без централизованного управления.
  • Технология COM была запатентована Microsoft, но спецификации опубликованы и доступны для реализации сторонними разработчиками.
  • В Windows 10 и 11 COM-объекты по-прежнему используются для работы с реестром, планировщиком задач, системными уведомлениями и другими низкоуровневыми функциями.
  • Существует открытая реализация COM для Unix-подобных систем — проект XPCOM (Cross Platform Component Object Model), разработанный Mozilla для Firefox, но он несовместим с Microsoft COM.

Источники

  • Microsoft Corporation. «The Component Object Model Specification». 1995.
  • Don Box. «Essential COM». Addison-Wesley, 1998.
  • Kraig Brockschmidt. «Inside OLE 2». Microsoft Press, 1994.
  • MSDN Library. «COM (Component Object Model)». Microsoft Docs.
  • «COM+ (Component Services)». Microsoft Docs.

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

На главную BFOmetr →