Что такое COM / ActiveX / OCX - объясняем различия и связь между ними
· Го Комура · COM, ActiveX, OCX, OLE, Разработка Windows, Устаревшие технологии
Три слова — COM / ActiveX / OCX — почти всегда появляются вместе в Windows-проектах с легаси-кодом.
- Вендор присылает
.ocx - На экране Access или VB6 висит загадочный компонент
- Только что сказали «это COM», а сразу вслед за этим — «это же ActiveX»
- А затем разом набегают слова вроде
regsvr32, 32-бит / 64-бит, IE-режим
На этом этапе разговор обычно резко буксует. Термины близки друг к другу, да и исторически они сильно пересекаются. Но верно и обратное: если научиться их разделять, исследование, миграция и объяснение становятся заметно проще.
В этой статье мы разберём, что такое COM, что такое ActiveX и что такое OCX, в таком порядке, чтобы были видны их различия и связь.
В особенности мы чётко проясним, что здесь фундамент, что компонент, а что файл.
Содержание
- Сначала вывод (в двух словах)
- Что в этой статье понимается под COM / ActiveX / OCX
- Сначала на одном листе
- 3.1. Схема связей
- 3.2. Краткий словарь терминов
- Что такое COM
- 4.1. В двух словах
- 4.2. Что важно в COM
- Что такое ActiveX
- 5.1. В двух словах
- 5.2. ActiveX — не только для браузера
- Что такое OCX
- 6.1. В двух словах
- 6.2. Чем отличается от
.dll
- Различия в таблице
- Где это применялось
- Почему это легко перепутать
- Как относиться к этому в сегодняшней практике
- Частые заблуждения
- Контрольные точки при исследовании
- Итог
- Список источников
1. Сначала вывод (в двух словах)
Сначала грубо, но полезно сформулируем так.
- COM — это фундамент. Бинарный контракт для взаимодействия компонентов друг с другом в Windows
- ActiveX — это контекст компонентов на базе COM. Особенно часто это проявляется как элементы управления, встраиваемые в хост
- OCX — это файл реализации, который часто встречается у ActiveX-компонентов. Вы сталкиваетесь с ним как с расширением файла
- Иначе говоря, картина проясняется, если воспринимать так: COM = механизм, ActiveX = контекст компонентов, OCX = файл
- Память вида
ActiveX = та опасная штука из старых браузеровнаполовину верна, наполовину недостаточна. ActiveX — не только для браузера OCX = ActiveXчасто говорят почти как синонимы, но строго говоря, это смешение концепции и расширения файла- Сегодня это не та технология, вокруг которой стоит строить новую разработку, но она всё ещё встречается в существующих Windows-приложениях, Office, Access, SDK оборудования и внутренних веб-системах
Всё начинается с того, чтобы разделять эти три вопроса.
- Речь идёт о самом COM?
- Речь идёт об ActiveX-компоненте?
- Или это просто так называют, увидев файл
.ocx?
Как только вы научитесь это различать, туман заметно рассеивается.
2. Что в этой статье понимается под COM / ActiveX / OCX
На практике эти три термина зачастую небрежно живут вперемешку. Поэтому сначала зафиксируем их значения для этой статьи.
- COM: сама компонентная модель Windows. Фундамент интерфейсов, GUID, регистрации и вызова
- ActiveX: встраиваемые компоненты на базе COM и контекст их использования. На практике чаще всего означает именно ActiveX-компоненты (controls)
- OCX: расширение файла, которое часто встречается у реализаций ActiveX-компонентов.
.ocx
Небольшое уточнение: исторически слово ActiveX какое-то время использовалось несколько шире.
Но большинство мест, где ActiveX создаёт трудности в сегодняшней практике, так или иначе вращаются вокруг компонентов, встраивания, хостов, браузеров и регистрации.
Поэтому и в этой статье мы в основном будем исходить из того, что ActiveX ≈ история про ActiveX-компоненты.
3. Сначала на одном листе
3.1. Схема связей
Быстрее всего увидеть общую картину на одной схеме.
flowchart LR
COM["COM<br/>Фундамент бинарных контрактов"] --> OLE["OLE / Automation<br/>Механизмы встраивания и автоматизации"]
OLE --> AX["ActiveX<br/>Контекст компонентов на базе COM"]
AX --> CTRL["ActiveX-компонент"]
CTRL --> OCX["OCX (.ocx)<br/>Частая форма файла реализации"]
HOST["Хост / контейнер<br/>IE / Access / VB6 / MFC / WinForms"] --> CTRL
Здесь важно, что COM и ActiveX — не одно и то же слово.
- COM — это фундамент
- OLE / Automation — это механизмы встраивания и автоматизации
- ActiveX проявляется как контекст компонентов, используемых поверх них
- OCX — это файл, который часто встречается у таких реализаций компонентов
Поэтому если спросить ActiveX — это то же самое, что COM?, ответ будет такой: фундамент — COM, но ActiveX не является самим COM.
3.2. Краткий словарь терминов
| Термин | Первое приближение к пониманию |
|---|---|
| COM | Механизм, контракт, фундамент |
| ActiveX | Контекст встраиваемых компонентов на базе COM |
| ActiveX-компонент | Сам компонент, реально размещаемый на хосте |
| OCX | Расширение файла, которое часто встречается у ActiveX-компонентов |
| OLE / Automation | Механизмы встраивания, автоматизации, интеграции |
Если запоминать по минимуму, этого достаточно.
- COM — это механизм
- ActiveX — это контекст компонентов
- OCX — это файл
4. Что такое COM
4.1. В двух словах
COM расшифровывается как Component Object Model и представляет собой бинарный контракт для взаимодействия компонентов друг с другом в Windows.
Под бинарным контрактом здесь понимается не удобство исходного кода или особенности языка, а интерфейс, обещания которого сохраняются даже в скомпилированном виде. Компонент, написанный на C++, можно использовать из другого языка или другого приложения именно благодаря этому контракту.
Если приблизить к практическому ощущению, COM — это не столько «удобный способ раздавать библиотеки», сколько механизм, который скрывает реализацию и соединяет всё исключительно через контракт.
Вот типичные приметы COM:
- подсчёт ссылок через
IUnknown; - поиск интерфейсов через
QueryInterface; - идентификация на основе GUID через
IIDиCLSID; - использование in-process через DLL;
- использование out-of-process через EXE.
Иными словами, COM — это фундамент культуры компонентизации в Windows.
4.2. Что важно в COM
Если ограничиться основами, в COM важно следующее.
- Интерфейс в центре внимания
- Сначала решают, что публиковать, и лишь потом — как это реализовать
- Идентификация через GUID
- Классы и интерфейсы идентифицируются однозначно
- Разделение хоста и реализации
- Вызывающей стороне не нужно знать внутреннюю реализацию
- Пересечение границ процессов
- Компонент можно использовать не только в том же процессе, но и как компонент в другом процессе
Именно это не даёт COM остаться просто старой технологией. С весьма ранних времён у него была прочная основа для переиспользуемого проектирования на основе контракта.
5. Что такое ActiveX
5.1. В двух словах
ActiveX проще всего понимать как переиспользуемые программные компоненты на базе COM, и в особенности как элементы управления, встраиваемые в хосты или контейнеры.
Когда на практике говорят ActiveX, с высокой вероятностью речь идёт об ActiveX-компонентах.
Например, сюда относятся такие вещи, как кнопки, сетки (grid), графики, календари, вьюеры, компоненты интеграции с оборудованием.
ActiveX — это не столько огромная самодостаточная технология, сколько компонент, работающий, будучи встроенным в какой-либо хост — при таком восприятии сложно ошибиться.
5.2. ActiveX — не только для браузера
Впечатление ActiveX = та штука из Internet Explorer довольно устойчиво.
Это не ошибка, но это ещё не вся история.
Перечислим места, где применялись ActiveX-компоненты.
- Формы Access
- Приложения VB6
- Контейнеры MFC
- Окружение Office / VBA
- Использование COM-обёрток из WinForms
- Internet Explorer и контекст его совместимой эксплуатации
Иначе говоря, ActiveX — это не браузерная технология, а компонентная технология, которая долго применялась и на стороне Windows-приложений.
Не понимая этого, вы легко начнёте воспринимать ActiveX, найденный во внутреннем веб-приложении, и ActiveX, встроенный в экран Access, как совершенно разные вещи. На самом деле оба они — весьма близкие родственники, тесно связанные с COM.
6. Что такое OCX
6.1. В двух словах
OCX — это расширение файла, которое часто используется для реализации ActiveX-компонентов.
Найдя .ocx в Windows-окружении, для начала можно смело подозревать встраиваемый COM-компонент типа элемента управления.
Обычно он встречается в таких местах:
- поставки вендорских SDK;
- старые проекты на VB6 / Access / MFC;
- файлы, подлежащие регистрации в составе инсталлятора;
- компоненты, для которых нужен
regsvr32.
Важно помнить, что OCX — это форма файла, а не сам концепт.
Поэтому если нужен грубый ответ на вопрос что такое OCX, это: файл, который чаще всего встречается как физическое воплощение ActiveX-компонента.
6.2. Чем отличается от .dll
Здесь тоже легко запутаться.
.ocxдовольно уверенно намекает, что это ActiveX-компонент.dllможет оказаться и обычной библиотекой, и COM-сервером, и зависимой DLL из окружения ActiveX
Увидев .ocx, можно с достаточной уверенностью предположить, что речь идёт об ActiveX; увидев же только .dll, вы пока не поймёте, что это такое.
На практике часто встречается такая расстановка:
vendorcontrol.ocxvendorhelper.dllvendorcore.dll
где главную роль играет OCX, а DLL поддерживают его сбоку.
Поэтому если спросить OCX — это разновидность DLL?, по ощущениям это близко, но в задачах исследования безопаснее рассматривать их роли раздельно.
7. Различия в таблице
| Термин | Что это такое | Слова, которые часто встречаются на практике | Частая физическая форма |
|---|---|---|---|
| COM | Компонентная модель, фундамент бинарных контрактов | IUnknown, QueryInterface, CLSID, IID, Apartment |
.dll, .exe, регистрационные данные |
| ActiveX | Контекст компонентов на базе COM | Контейнер, встраивание, свойства, события | ActiveX-компоненты |
| ActiveX-компонент | Реально размещаемый переиспользуемый компонент | Сетки, календари, вьюеры, интеграция с оборудованием | .ocx, .dll |
| OCX | Расширение файла, которое часто встречается у ActiveX-компонентов | regsvr32, панель инструментов, 32-бит / 64-бит |
xxx.ocx |
| OLE / Automation | Механизмы встраивания и автоматизации | Интеграция с Office, страницы свойств, автоматизация | Различные функции на базе COM |
Если запоминать по этой таблице, начните с этого.
- COM — это фундаментные работы
- ActiveX — это культура компонентов, возведённая на этом фундаменте
- OCX — это файл, который вы подбираете прямо на месте
8. Где это применялось
Из-за того, что память о браузере слишком сильна, ActiveX / OCX часто выглядят как старая веб-технология.
Но на самом деле их применяли значительно шире.
Конкретно — в таких местах.
- Десктопные приложения
- VB6
- MFC / C++
- Формы Access
- Окружение Office / VBA
- Браузеры / внутренние веб-системы
- Вьюеры, встроенные в Internet Explorer
- Компоненты подписи
- Компоненты передачи файлов
- Компоненты интеграции с периферийным оборудованием
- Существующие .NET-приложения
- Существующие ActiveX-компоненты, обёрнутые для использования из WinForms
- Случаи, когда существующие COM-активы продлевают жизнь в роли UI-компонентов
И здесь мы снова возвращаемся к тому, что ActiveX — не технология, предназначенная только для интернета. Он просто выглядит как веб-технология из-за того, что был особенно заметен в IE; по сути же и на практике точнее видеть в нём технологию встраиваемых компонентов Windows.
9. Почему это легко перепутать
9.1. Разные уровни языка появляются в одном и том же разговоре
- COM — это вопрос фундамента
- ActiveX — это вопрос контекста компонентов
- OCX — это вопрос файла
Изначально это разные уровни, но на практике они появляются одновременно в одном и том же месте, поэтому разговор легко превращается в кашу.
9.2. Слово ActiveX немного широкое
COM имеет сравнительно устойчивое значение.
ActiveX, напротив, используется несколько шире — и исторически, и на практике.
В зависимости от человека под этим может пониматься:
- сам компонент;
- файл
.ocx; - старый компонент, работающий в IE;
- встраиваемые компоненты на базе COM в целом.
И эти значения расходятся. На этом этапе разговор уже перестаёт совпадать.
9.3. Стоит увидеть .ocx, как хочется назвать всё подряд ActiveX
Это желание понятно. И для повседневного разговора обычно этого достаточно.
Однако в задачах миграции или исследования, если не проверить отдельно:
- является ли это UI-компонентом;
- в каком хосте это работает;
- нужна ли регистрация;
- как обстоят дела с 32-бит / 64-бит;
- есть ли зависимость от браузера,
вы обязательно споткнётесь позже.
10. Как относиться к этому в сегодняшней практике
Прежде всего: находка COM / ActiveX / OCX ещё не означает, что всё нужно немедленно отвергнуть. Но и относиться ко всему с одинаковой температурой тоже опасно.
Зависимость от ActiveX на стороне браузера
Это безопаснее рассматривать в первую очередь и достаточно жёстко.
- Это не часть основного направления современной разработки браузеров
- В контексте совместимой эксплуатации всплывает IE-режим, но его лучше воспринимать как мост для обратной совместимости
- Опираться на него как на предпосылку для чего-то нового сложно рекомендовать
Для веб-стороны ActiveX реалистичнее думать в терминах «с какого места начать отделение», а не «как продлить жизнь».
Зависимость от ActiveX / OCX на стороне десктопа
Здесь можно судить несколько более прагматично.
- Стабильно работает внутри существующего хоста
- Круг распространения ограничен
- Есть перспектива поддержки — вендорской или собственной
- Понятны предпосылки о регистрации, зависимых DLL, разрядности
Если эти условия выполняются, решение оставить — вполне нормальное.
С другой стороны, если:
- хочется загрузить 32-битный OCX напрямую в 64-битную сторону;
- хочется перевести на .NET только окружение;
- распространение и регистрация каждый раз доставляют проблемы;
- сохраняется зависимость от браузера,
то безопаснее рассматривать оставить / обернуть / заменить как отдельные варианты.
Сегодняшняя практика спрашивает не о том, плохо ли, что это ActiveX, а о том, где провести границу. Если смотреть на это не как на старую технологию, а как на стык существующей системы, с этим становится значительно легче работать.
11. Частые заблуждения
Заблуждение 1: COM = ActiveX
Неверно. COM — это фундамент, а ActiveX — это контекст компонентов, используемых поверх него.
Заблуждение 2: ActiveX = Internet Explorer
Неверно. Это правда, что IE прославил ActiveX, но ActiveX — не только для браузера.
Заблуждение 3: ActiveX = OCX
На практике эти слова используются в очень похожем смысле, но строго говоря это разные вещи. ActiveX — это вопрос контекста и компонентов, а OCX — это физическая форма, с которой вы сталкиваетесь как с расширением файла.
Заблуждение 4: OCX — это просто DLL, разве нет?
Грубо говоря, это близко, но в задачах исследования не стоит быть настолько грубым.
Одного только .dll недостаточно, чтобы понять роль, тогда как .ocx довольно сильно пахнет элементом управления.
Заблуждение 5: COM — это уже мёртвая технология
По крайней мере в мире Windows так говорить слишком грубо. Она просто отступила со сцены на второй план, но всё ещё встречается в контекстах проектирования и взаимодействия сегодня.
12. Контрольные точки при исследовании
Найдя COM / ActiveX / OCX, легче не заблудиться, если последовательно проверить следующее.
- Что это за компонент
- UI-элемент управления?
- Вьюер?
- Интеграция с оборудованием?
- Интеграция с Office / Access?
- Где это работает
- Access / VBA?
- VB6 / MFC?
- WinForms?
- IE / IE-режим?
- Какие файлы и идентификаторы
.ocx/.dll/.exe- ProgID
- CLSID
- Type Library
- Как обстоят дела с регистрацией и распространением
- Нужен ли
regsvr32? - Есть ли зависимые DLL?
- Нужны ли права администратора?
- Нужен ли
- Совпадает ли разрядность
- 32-бит?
- 64-бит?
- Нужно ли работать в одном и том же процессе?
- Как поступать с этим в будущем
- Оставить как есть?
- Провести границу и обернуть?
- Заменить?
Если броситься с фразой раз есть ActiveX, реализуем всё заново с нуля, не пройдя по этим пунктам, вы аккуратно наступите на все старые грабли.
Не обязательно устраивать себе иглотерапию посреди минного поля.
13. Итог
Если формулировать различия COM / ActiveX / OCX максимально грубо, но полезно для практики, получится так.
- COM — это фундамент
- ActiveX — это контекст встраиваемых компонентов на базе COM
- OCX — это файл, который часто встречается у ActiveX-компонентов
Научившись разделять эти три понятия, вы заметно легче начинаете видеть:
- это просто
.ocxили нет; - это проблема всего COM целиком;
- это зависимый от браузера ActiveX;
- это компонент, который можно оставить на десктопе.
Легаси-технология сложна не потому, что название старое, а потому, что фундамент, компоненты и файлы появляются в одном и том же разговоре. Но стоит увидеть структуру — и неожиданно оказывается, что с этим вполне можно работать.
14. Список источников
- Что такое COM - почему устройство Windows COM до сих пор прекрасно
- Как сегодня поступать с ActiveX / OCX - таблица решений: оставить, обернуть или заменить
- Component Object Model (COM) - Microsoft Learn
- ActiveX-компоненты - Win32 apps - Microsoft Learn
- ActiveX Controls - MFC - Microsoft Learn
- ActiveX Control - Access VBA - Microsoft Learn
- Что такое режим Internet Explorer (IE)? - Microsoft Learn
- Использование DevTools в режиме Internet Explorer (IE-режим) - Microsoft Learn
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
Ловушки регистрации и bitness при разработке COM/OCX/ActiveX
Разбираем с практической точки зрения типичные ловушки разработки COM, OCX и ActiveX: 32-бит/64-бит, Visual Studio 2022, regsvr32/Regasm,...
Как сегодня поступать с ActiveX / OCX - таблица решений: оставить, обернуть или заменить
Разбираем, что выбрать при обнаружении ActiveX / OCX — оставить, обернуть или заменить, — учитывая 32-бит/64-бит, регистрацию, зависимост...
Аутсорсинг и контрактная разработка Windows-приложения: что стоит прояснить перед заказом
Перед тем как заказать аутсорсинг или контрактную разработку Windows-приложения, разберём, что нужно прояснить: доработка существующего П...
Странная любовь разработчика, или Как я перестал беспокоиться и полюбил Windows
Windows — это хлопотно. Но эти хлопоты — от того, что данная ОС десятилетиями несла на себе реальный бизнес.
Что такое Reg-Free COM — механизм использования COM без регистрации
Разбираем основы Reg-Free COM, роль контекста активации и манифестов, преимущества, ограничения и критерии выбора в реальных проектах.
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Миграция ActiveX
Решения о сохранении, обёртке или замене компонентов COM / ActiveX / OCX.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Использование и перенос существующих активов
Разбор различий между COM / ActiveX / OCX хорошо подходит в качестве входной точки для размышлений о том, как использовать и переносить существующие активы.
Технические консультации и ревью дизайна
Если в проекте сначала нужно согласовать терминологию и границы, а уже потом определять направление, это можно проработать в формате технической консультации и ревью архитектуры.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- Что такое файл OCX?
- OCX — это расширение файла, которое часто используется для реализации ActiveX-компонентов. Найдя `.ocx` в Windows-окружении, для начала можно смело подозревать встраиваемый COM-компонент типа элемента управления. Чаще всего это встречается как поставка вендорского SDK, часть старого проекта на VB6 / Access / MFC, файл, подлежащий регистрации в составе инсталлятора, или компонент, для которого нужен regsvr32. Меньше путаницы возникает, если помнить: OCX — это форма файла, а не сам концепт.
- В чём разница между COM и ActiveX?
- COM — это бинарный контракт для взаимодействия компонентов друг с другом в Windows, то есть фундамент. ActiveX — это переиспользуемые программные компоненты на базе COM, и чаще всего это слово указывает именно на контекст элементов управления, встраиваемых в хост или контейнер. Картина проясняется, если воспринимать так: «COM = механизм, ActiveX = контекст компонентов, OCX = файл». Фундамент ActiveX — это COM, но ActiveX — не сам COM.
- Является ли ActiveX технологией, предназначенной исключительно для Internet Explorer?
- Нет. IE действительно прославил ActiveX, но ActiveX-компоненты долго применялись и на стороне Windows-приложений: формы Access, приложения VB6, контейнеры MFC, окружение Office / VBA, использование COM-обёрток из WinForms. На практике точнее видеть в этом не браузерную технологию, а технологию встраиваемых компонентов Windows. Отметим также, что зависимость от ActiveX в браузере сегодня реалистичнее рассматривать не как «как продлить жизнь», а как «с чего начать отделение».
- Чем отличаются OCX и DLL?
- Расширение `.ocx` довольно уверенно намекает, что это ActiveX-компонент, а вот `.dll` может оказаться и обычной библиотекой, и COM-сервером, и зависимой DLL из окружения ActiveX. На практике часто встречается паттерн, когда главную роль играет `vendorcontrol.ocx`, а DLL вроде `vendorhelper.dll` поддерживают его сбоку. Если спросить, является ли OCX разновидностью DLL, по ощущениям это близко, но в задачах исследования или миграции безопаснее рассматривать их роли раздельно.
Об авторе
Страница с профилем автора статьи.
Го Комура
Представитель KomuraSoft LLC
Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.
Публичные ссылки