Что такое COM — почему архитектура Windows COM до сих пор прекрасна
Что такое 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, изоляция интерфейсов в микросервисах и тому подобное).
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
Аутсорсинг и контрактная разработка Windows-приложения: что стоит прояснить перед заказом
Перед тем как заказать аутсорсинг или контрактную разработку Windows-приложения, разберём, что нужно прояснить: доработка существующего П...
Странная любовь разработчика, или Как я перестал беспокоиться и полюбил Windows
Windows — это хлопотно. Но эти хлопоты — от того, что данная ОС десятилетиями несла на себе реальный бизнес.
Ловушки регистрации и bitness при разработке COM/OCX/ActiveX
Разбираем с практической точки зрения типичные ловушки разработки COM, OCX и ActiveX: 32-бит/64-бит, Visual Studio 2022, regsvr32/Regasm,...
Что такое COM / ActiveX / OCX - объясняем различия и связь между ними
Разбираем с практической точки зрения, что такое COM, что такое ActiveX и что такое OCX: их различия и связь, связь с OLE, где они примен...
Как сегодня поступать с ActiveX / OCX - таблица решений: оставить, обернуть или заменить
Разбираем, что выбрать при обнаружении ActiveX / OCX — оставить, обернуть или заменить, — учитывая 32-бит/64-бит, регистрацию, зависимост...
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Миграция ActiveX
Решения о сохранении, обёртке или замене компонентов COM / ActiveX / OCX.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Использование и перенос существующих активов
Понимание архитектуры и модели совместимости COM — естественная отправная точка для того, чтобы задуматься, как наилучшим образом использовать существующие Windows-активы.
Технические консультации и ревью дизайна
Если вы хотите выстроить стратегию, понимая устройство IUnknown, GUID и границ компонентов, это естественным образом приводит к технической консультации и ревью архитектуры.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- Что такое 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, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.
Публичные ссылки