Что такое COM — почему архитектура Windows COM до сих пор прекрасна

· · COM, ActiveX, Разработка Windows

Что такое COM?

COM (Component Object Model) — это «бинарный контракт», позволяющий компонентам взаимодействовать друг с другом в Windows. Это механизм общения через интерфейсы как строгие контракты, невзирая на различия языков и компиляторов, и в его основе лежит философия проектирования «программировать против контракта, а не против реализации».

Три ключевых элемента COM

1. Проектирование, ориентированное на интерфейс

В COM «контракт первичен по отношению к реализации». Можно использовать объект, ничего не зная о его внутренней реализации, — достаточно знать его опубликованные интерфейсы.

2. Идентификация по GUID (CLSID / IID)

Каждому компоненту и интерфейсу присваивается глобально уникальный идентификатор (GUID), поэтому конфликты имён попросту невозможны.

3. IUnknown

Базовый интерфейс, от которого наследуется каждый интерфейс COM. Он предоставляет следующие три функции.

Метод Роль
QueryInterface Спрашивает, поддерживает ли объект другой интерфейс
AddRef Увеличивает счётчик ссылок
Release Уменьшает счётчик ссылок (объект уничтожает себя, когда счётчик достигает 0)

Четыре сильные стороны COM

1. Бинарная совместимость

После того как компонент собран, его можно использовать повторно независимо от языка программирования или среды выполнения. Вызов COM-компонента, написанного на C++, из C# или Python — совершенно обычная практика.

2. Изоляция интерфейса

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

3. Сосуществование версий

Стандартный подход к добавлению функциональности с сохранением обратной совместимости — добавлять новые интерфейсы. Новую функциональность можно предоставить, не меняя старые интерфейсы.

4. Повторное использование через границы процессов

С помощью Out-of-proc COM (EXE-серверов) можно безопасно вызывать функциональность из другого процесса. Однако если серверный процесс аварийно завершится, вызывающая сторона получит сбой вида RPC_E_DISCONNECTED или RPC_S_SERVER_UNAVAILABLE, поэтому логика восстановления — перезапуск и повторное подключение — по-прежнему необходима.

COM всё ещё в строю

Её нередко списывают со счетов как «устаревшую технологию», но COM — это механизм, который остаётся в самом ядре Windows и сегодня.

Где используется COM

  • Расширения проводника (контекстные меню, обработчики предпросмотра)
  • Автоматизация Office (внешнее управление Excel и Word)
  • Взаимодействие с .NET (COM Interop)
  • Существующие системы, включая ActiveX
  • DirectX, Windows Shell API и множество других Windows API

Даже если вам кажется, что «это меня не касается», пока вы разрабатываете под Windows, COM обязательно где-то появится.

Заключение

Я считаю, что красота COM заключается в «независимости от языка, процесса и реализации». Проектирование интерфейсов, нейтральное к языку, уникальная идентификация и версионирование через GUID, подсчёт ссылок через IUnknown и механизм, прозрачно обрабатывающий межпроцессное взаимодействие. Каждая из этих идей — универсальная концепция, напрямую применимая и к современной компонентной разработке (контракты REST API, изоляция интерфейсов в микросервисах и тому подобное).

Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.

Эти страницы показывают тему статьи в более широком контексте услуг и решений.

Статья напрямую связана со следующими услугами.

Частые вопросы

Вопросы, которые часто возникают при консультациях по теме статьи.

Что такое COM в Windows?
COM (Component Object Model) — это бинарный контракт, позволяющий компонентам взаимодействовать друг с другом в Windows, невзирая на различия языков и компиляторов. Компоненты общаются через интерфейсы, выступающие в роли строгих контрактов, следуя философии проектирования «программировать против контракта, а не против реализации». Каждому компоненту и интерфейсу присваивается глобально уникальный GUID, поэтому конфликты имён попросту невозможны.
Используется ли COM до сих пор?
Да. COM остаётся в самом ядре Windows и сегодня, хотя её нередко списывают со счетов как устаревшую технологию. Она лежит в основе расширений проводника, таких как контекстные меню и обработчики предпросмотра, автоматизации Office, взаимодействия с .NET через COM Interop, существующих систем на ActiveX и таких Windows API, как DirectX и Windows Shell API. Пока вы разрабатываете под Windows, COM обязательно где-то появится.
Что такое интерфейс IUnknown и для чего он нужен?
IUnknown — базовый интерфейс, от которого наследуется каждый интерфейс COM. Он предоставляет три функции: QueryInterface запрашивает, поддерживает ли объект другой интерфейс, AddRef увеличивает счётчик ссылок, а Release его уменьшает. Когда счётчик ссылок достигает нуля, объект уничтожает сам себя — так COM управляет временем жизни объектов.
Почему COM считается бинарно совместимой?
После того как компонент COM собран, его можно использовать независимо от языка программирования или среды выполнения, поэтому вызов COM-компонента, написанного на C++, из C# или Python — совершенно обычная практика. Поскольку публикуется только контракт интерфейса, а реализация остаётся скрытой, внутреннее устройство можно свободно менять, не затрагивая вызывающий код. Новая функциональность добавляется через новые интерфейсы, что сохраняет обратную совместимость для существующих вызывающих сторон.

Об авторе

Страница с профилем автора статьи.

Го Комура

Представитель KomuraSoft LLC

Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

Публичные ссылки

Вернуться в блог