Что такое COM / ActiveX / OCX - объясняем различия и связь между ними

· · COM, ActiveX, OCX, OLE, Разработка Windows, Устаревшие технологии

Три слова — COM / ActiveX / OCX — почти всегда появляются вместе в Windows-проектах с легаси-кодом.

  • Вендор присылает .ocx
  • На экране Access или VB6 висит загадочный компонент
  • Только что сказали «это COM», а сразу вслед за этим — «это же ActiveX»
  • А затем разом набегают слова вроде regsvr32, 32-бит / 64-бит, IE-режим

На этом этапе разговор обычно резко буксует. Термины близки друг к другу, да и исторически они сильно пересекаются. Но верно и обратное: если научиться их разделять, исследование, миграция и объяснение становятся заметно проще.

В этой статье мы разберём, что такое COM, что такое ActiveX и что такое OCX, в таком порядке, чтобы были видны их различия и связь. В особенности мы чётко проясним, что здесь фундамент, что компонент, а что файл.

Содержание

  1. Сначала вывод (в двух словах)
  2. Что в этой статье понимается под COM / ActiveX / OCX
  3. Сначала на одном листе
    • 3.1. Схема связей
    • 3.2. Краткий словарь терминов
  4. Что такое COM
    • 4.1. В двух словах
    • 4.2. Что важно в COM
  5. Что такое ActiveX
    • 5.1. В двух словах
    • 5.2. ActiveX — не только для браузера
  6. Что такое OCX
    • 6.1. В двух словах
    • 6.2. Чем отличается от .dll
  7. Различия в таблице
  8. Где это применялось
  9. Почему это легко перепутать
  10. Как относиться к этому в сегодняшней практике
  11. Частые заблуждения
  12. Контрольные точки при исследовании
  13. Итог
  14. Список источников

1. Сначала вывод (в двух словах)

Сначала грубо, но полезно сформулируем так.

  • COM — это фундамент. Бинарный контракт для взаимодействия компонентов друг с другом в Windows
  • ActiveX — это контекст компонентов на базе COM. Особенно часто это проявляется как элементы управления, встраиваемые в хост
  • OCX — это файл реализации, который часто встречается у ActiveX-компонентов. Вы сталкиваетесь с ним как с расширением файла
  • Иначе говоря, картина проясняется, если воспринимать так: COM = механизм, ActiveX = контекст компонентов, OCX = файл
  • Память вида ActiveX = та опасная штука из старых браузеров наполовину верна, наполовину недостаточна. ActiveX — не только для браузера
  • OCX = ActiveX часто говорят почти как синонимы, но строго говоря, это смешение концепции и расширения файла
  • Сегодня это не та технология, вокруг которой стоит строить новую разработку, но она всё ещё встречается в существующих Windows-приложениях, Office, Access, SDK оборудования и внутренних веб-системах

Всё начинается с того, чтобы разделять эти три вопроса.

  1. Речь идёт о самом COM?
  2. Речь идёт об ActiveX-компоненте?
  3. Или это просто так называют, увидев файл .ocx?

Как только вы научитесь это различать, туман заметно рассеивается.

2. Что в этой статье понимается под COM / ActiveX / OCX

На практике эти три термина зачастую небрежно живут вперемешку. Поэтому сначала зафиксируем их значения для этой статьи.

  • COM: сама компонентная модель Windows. Фундамент интерфейсов, GUID, регистрации и вызова
  • ActiveX: встраиваемые компоненты на базе COM и контекст их использования. На практике чаще всего означает именно ActiveX-компоненты (controls)
  • OCX: расширение файла, которое часто встречается у реализаций ActiveX-компонентов. .ocx

Небольшое уточнение: исторически слово ActiveX какое-то время использовалось несколько шире. Но большинство мест, где ActiveX создаёт трудности в сегодняшней практике, так или иначе вращаются вокруг компонентов, встраивания, хостов, браузеров и регистрации.

Поэтому и в этой статье мы в основном будем исходить из того, что ActiveX ≈ история про ActiveX-компоненты.

3. Сначала на одном листе

3.1. Схема связей

Быстрее всего увидеть общую картину на одной схеме.

COMФундамент бинарных контрактовOLE / AutomationМеханизмы встраивания и автоматизацииActiveXКонтекст компонентов на базе COMActiveX-компонентOCX (.ocx)Частая форма файла реализацииХост / контейнерIE / Access / VB6 / MFC / WinForms

Здесь важно, что 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.ocx
  • vendorhelper.dll
  • vendorcore.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, легче не заблудиться, если последовательно проверить следующее.

  1. Что это за компонент
    • UI-элемент управления?
    • Вьюер?
    • Интеграция с оборудованием?
    • Интеграция с Office / Access?
  2. Где это работает
    • Access / VBA?
    • VB6 / MFC?
    • WinForms?
    • IE / IE-режим?
  3. Какие файлы и идентификаторы
    • .ocx / .dll / .exe
    • ProgID
    • CLSID
    • Type Library
  4. Как обстоят дела с регистрацией и распространением
    • Нужен ли regsvr32?
    • Есть ли зависимые DLL?
    • Нужны ли права администратора?
  5. Совпадает ли разрядность
    • 32-бит?
    • 64-бит?
    • Нужно ли работать в одном и том же процессе?
  6. Как поступать с этим в будущем
    • Оставить как есть?
    • Провести границу и обернуть?
    • Заменить?

Если броситься с фразой раз есть ActiveX, реализуем всё заново с нуля, не пройдя по этим пунктам, вы аккуратно наступите на все старые грабли. Не обязательно устраивать себе иглотерапию посреди минного поля.

13. Итог

Если формулировать различия COM / ActiveX / OCX максимально грубо, но полезно для практики, получится так.

  • COM — это фундамент
  • ActiveX — это контекст встраиваемых компонентов на базе COM
  • OCX — это файл, который часто встречается у ActiveX-компонентов

Научившись разделять эти три понятия, вы заметно легче начинаете видеть:

  • это просто .ocx или нет;
  • это проблема всего COM целиком;
  • это зависимый от браузера ActiveX;
  • это компонент, который можно оставить на десктопе.

Легаси-технология сложна не потому, что название старое, а потому, что фундамент, компоненты и файлы появляются в одном и том же разговоре. Но стоит увидеть структуру — и неожиданно оказывается, что с этим вполне можно работать.

14. Список источников

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

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

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

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

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

Что такое файл 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, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

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

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