Что такое COM / ActiveX / OCX — различия и связь

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

История изменений (1 обновлений, последнее 30 Aug 2026)

Журнал изменений этой статьи. Там, где версия до правки была заархивирована, она остаётся доступной для чтения по постоянной ссылке с DOI.

Русский текст переписан как полноценный технический перевод, а не калька с японского. Утверждения статьи не менялись.
Первая публикация
Цитирование статьи(DOI: 10.5281/zenodo.21619671)

Статья заархивирована на Zenodo. Ниже приведены DOI, который всегда ведёт к последней версии, и DOI, закреплённый за версией, которую вы читаете.

Го Комура (2026). Что такое COM / ActiveX / OCX — различия и связь. KomuraSoft LLC. https://doi.org/10.5281/zenodo.21619671 https://comcomponent.com/ru/blog/2026/03/13/000-what-is-com-activex-ocx/

DOI (последняя версия)
10.5281/zenodo.21619671
DOI (эта версия)
10.5281/zenodo.21619672

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

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

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

Почему разговор перестаёт сходитьсяКогда близкие термины COM, ActiveX и OCX всплывают на площадке одновременно, разговор перестаёт сходиться; если отделить, что является основой, что компонентом, а что файлом, исследовать, переносить и объяснять становится проще.Три слова приходят разомРазговор не сходитсяОтделить основу, компонент и файлИсследовать, переносить и объяснять проще

Рис. 1: Цель статьи одна. Отделить, что здесь основа, что компонент, а что файл.

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

Содержание

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

Карта знаний этой статьи

COM — фундамент, на котором компоненты в Windows обмениваются по бинарному контракту; ActiveX — контекст многократно используемого компонента на базе COM и OLE/Automation, который встраивают в хост или контейнер. OCX — лишь часто используемое расширение файла реализации такого элемента управления ActiveX, а не само понятие. ActiveX давно применяют не только в браузере, но и в приложениях Windows — VB6, MFC, COM-обёртка из WinForms и т. д. CLSID и ProgID, библиотека типов и модель apartment STA/MTA поддерживают идентификацию и вызов COM; регистрация с правами администратора через regsvr32 и совпадение разрядности 32-bit/64-bit определяют размещение OCX. Браузерный ActiveX продолжает работать в расчёте на режим IE как мост обратной совместимости.

Карта знаний COM, ActiveX и OCXСхема, которая показывает, как на фундаменте COM надстраиваются OLE/Automation и ActiveX и доходят до файла реализации OCX; как CLSID, ProgID, библиотека типов и модель apartment обеспечивают идентификацию и вызов COM; регистрацию с правами администратора через regsvr32 и ограничение совпадения разрядности; и конструкцию, в которой браузерный ActiveX зависит от режима IEиспользуетреализуетиспользуетиспользуетиспользуетиспользуетиспользуетиспользуетиспользуетавтоматизируеттребуетнастраиваетсятребуеттребуетиспользуетиспользуетиспользуетпроверяетсяCOM (Component Object Model)ActiveXOCXOLE/AutomationCLSID (Class ID)ProgID (Programmatic Identifier)Visual Basic 6.0 (VB6)библиотека типов (TLB).NET (начиная с Core)модель апартаментов COM (STA/MTA)regsvr32права администраторатребование совпадения разрядностирежим IEMFC (Microsoft Foundation Classes)Windows Formsdumpbin

На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 18, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle

1. Сначала вывод (коротко)

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

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

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

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

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

Три вопроса, с которых начинаютСначала отделяют, идёт ли речь о COM как о механизме, об ActiveX control как о компоненте или просто так называют, увидев файл ocx.О чём сейчас речь?COM = речь о механизмеActiveX = речь о контексте компонентовOCX = речь о файле

Рис. 2: Запутались — возвращайтесь к этим трём вариантам. COM — механизм, ActiveX — контекст компонентов, OCX — файл.

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

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

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

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

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

Ширина слова ActiveX и фокус этой статьиИсторически слово ActiveX какое-то время использовалось шире, но сегодня трудности крутятся вокруг элементов управления, встраивания, хостов, браузера и регистрации, поэтому статья держит фокус ближе к ActiveX control.Слово ActiveXИсторически смысл был ширеСегодня трудности — вокруг controlЭта статья идёт ближе к controlВстраивание, хост, браузер, регистрация

Рис. 3: Историческую ширину слова признаём, но фокус фиксируем на «стороне control», где на практике и возникают трудности.

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

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

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

COMОснова бинарного контрактаOLE / AutomationМеханизмы встраивания и автоматизацииActiveXКонтекст control на базе COMActiveX controlOCX (.ocx)Частая форма файла реализацииХост / контейнерIE / Access / VB6 / MFC / WinForms

Рис. 4: На основе COM складываются OLE / Automation, ActiveX и OCX; хост размещает control.

Важно, что COM и ActiveX — не одно и то же слово.

  • COM — это основа
  • OLE / Automation — механизмы встраивания и автоматизации
  • ActiveX проявляется как контекст элементов управления поверх них
  • OCX — файл, который часто встречается у таких реализаций control

Поэтому на вопрос ActiveX — это то же самое, что COM? ответ такой: основа — COM, но ActiveX не является самим COM.

3.2. Самый короткий словарь

Слово Первое приближение
COM Механизм, контракт, основа
ActiveX Контекст встраиваемых компонентов на базе COM
ActiveX control Сам компонент, который реально размещают на хосте
OCX Расширение файла, которое часто встречается у ActiveX control
OLE / Automation Механизмы встраивания, автоматизации, связки

Если запоминать по минимуму, этого достаточно.

  • COM — механизм
  • ActiveX — контекст компонентов
  • OCX — файл

4. Что такое COM

4.1. Коротко

COM расшифровывается как Component Object Model и представляет собой бинарный контракт, по которому компоненты в Windows общаются друг с другом.

Бинарный контракт здесь — не удобство исходников и не особенности языка, а интерфейс, обещания которого сохраняются и после компиляции. Компонент, написанный на C++, можно использовать из другого языка или другого приложения именно благодаря этому контракту.

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

Типичные приметы COM такие (значение каждого слова — по одной строке в 4.3).

  • подсчёт ссылок через IUnknown
  • поиск интерфейсов через QueryInterface
  • идентификация на основе GUID через IID и CLSID
  • использование in-process через DLL
  • использование out-of-process через EXE

Иначе говоря, COM — это основа культуры компонентизации в Windows.

Идея бинарного контрактаCOM соединяет компоненты не удобствами исходников или языка, а бинарным контрактом, который сохраняется и после компиляции, поэтому компонент на C++ можно использовать из другого языка или другого приложения.Компонент〔реализацию скрывают〕Бинарный контракт〔публичное обещание〕Другой язык, другое приложениеОбещание сохраняется и после компиляции

Рис. 5: Ядро COM — «скрыть реализацию и соединять только контрактом». Поэтому компоненты работают через границы языков.

4.2. Что важно в COM

Если ограничиться основами, в COM важно следующее.

  • В центре — интерфейс
    • Сначала решают, что публиковать, и лишь потом — как это реализовать
  • Идентификация через GUID
    • Классы и интерфейсы идентифицируются однозначно
  • Разделение хоста и реализации
    • Вызывающей стороне не нужно знать внутреннюю реализацию
  • Можно пересекать границу процессов
    • Компонент используют не только в том же процессе, но и как компонент в другом процессе

Именно это не даёт списать COM как просто старую технологию. С довольно ранних пор у него была прочная основа для переиспользования на базе контракта.

Четыре опоры COMПроектирование вокруг интерфейса, однозначная идентификация через GUID, разделение хоста и реализации и возможность пересекать границу процессов делают COM контрактным переиспользованием.Основы COMВ центре — интерфейсИдентификация через GUIDРазделение хоста и реализацииМожно пересекать границу процессов

Рис. 6: Четыре опоры COM. Контрактное переиспользование было заложено довольно рано.

4.3. Построчные заметки по терминам

В разговоре про COM следующие слова часто летят без пояснения. Здесь это только вход в концепты — по одной строке. Если интересен уже сам дизайн, см. Что такое COM — почему дизайн Windows COM до сих пор красив.

Термин Смысл в одну строку
Интерфейс Набор функций, которым компонент обещает «это можно вызывать». От реализации он отделён
IUnknown Базовый интерфейс всех COM-интерфейсов. В нём только три метода: QueryInterface / AddRef / Release
QueryInterface Метод, которым у компонента спрашивают: «есть ли ещё и этот интерфейс?». Если есть, возвращается указатель
Подсчёт ссылок Счётчик числа пользователей. AddRef увеличивает, Release уменьшает; когда счётчик доходит до 0, компонент освобождается
GUID Globally Unique Identifier — 128-битный идентификатор вида {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}. Им избегают столкновения имён
CLSID Class ID — GUID, который указывает «какой это компонент (класс)». По этому значению ищут и регистрацию в реестре
IID Interface ID — GUID, который указывает «какой это интерфейс»
ProgID Человекочитаемый псевдоним CLSID. Строка вроде Excel.Application; ею на компонент ссылаются из скриптов и подобного
Type Library Данные с типами интерфейсов и методов, которые компонент публикует. Их читают VB6 и .NET, когда подключают компонент
Apartment (STA / MTA) Модель потоков COM. STA — «этот компонент вызывают только с одного потока», MTA — «можно вызывать сразу с нескольких». UI-компоненты почти всегда на стороне STA

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

Базовое поведение на основе IUnknownIUnknown — основа всех COM-интерфейсов: QueryInterface спрашивает другой интерфейс, AddRef и Release двигают подсчёт ссылок, и когда счётчик доходит до 0, компонент освобождается.IUnknown〔основа всего〕Спросить через QueryInterfaceЕсли есть — возвращается указательСчитать через AddRef и ReleaseДошло до 0 — компонент освобождают

Рис. 7: Три метода IUnknown в центре таблицы терминов делятся на две работы: «спросить» и «считать».

5. Что такое ActiveX

5.1. Коротко

ActiveX проще всего понимать как переиспользуемые программные компоненты на базе COM, и в особенности как элементы управления, которые встраивают в хост или контейнер.

Когда на практике говорят ActiveX, с высокой вероятностью речь об ActiveX control. Сюда относятся кнопки, сетки (grid), графики, календари, вьюеры, компоненты связки с оборудованием.

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

Компонент, который работает, будучи встроенным в хостКогда на практике говорят ActiveX, с высокой вероятностью речь об ActiveX control — кнопках, сетках, графиках, вьюерах, компонентах связки с оборудованием, которые работают внутри хоста или контейнера.Хост / контейнерActiveX controlСетка или календарьВьюер или связка с оборудованиемЭто не самодостаточная огромная технология

Рис. 8: ActiveX точнее держать как «компонент, который работает, будучи встроенным».

5.2. ActiveX — не только для браузера

Впечатление ActiveX = та штука из Internet Explorer довольно устойчиво. Это не ошибка, но это ещё не вся история.

Где применялись ActiveX control:

  • формы Access
  • приложения VB6 (Visual Basic 6.0)
  • контейнеры MFC (Microsoft Foundation Class Library)
  • окружение Office / VBA
  • использование COM-обёрток из WinForms
  • Internet Explorer и контекст совместимой эксплуатации

Иначе говоря, ActiveX — это не браузерная технология, а компонентная технология, которая долго жила и на стороне Windows-приложений.

Не понимая этого, ActiveX во внутренней веб-системе и ActiveX, встроенный в экран Access, легко принять за разные вещи. На самом деле оба — довольно близкие родственники со стороны COM.

Где применялись ActiveX controlФормы Access, приложения VB6, контейнеры MFC, окружение Office и VBA, COM-обёртки из WinForms, Internet Explorer — ActiveX не только для браузера, он долго жил и на стороне Windows-приложений.ActiveX controlAccess, VB6, MFCОкружение Office и VBACOM-обёртка WinFormsСемейство Internet ExplorerЗнаменит в основном отсюда

Рис. 9: Заметным ActiveX сделал IE, но большая часть мест применения — на стороне Windows-приложений.

6. Что такое OCX

6.1. Коротко

OCX — это расширение файла, которым часто оформляют реализацию ActiveX control. Увидев .ocx в Windows-окружении, для начала можно подозревать встраиваемый COM-компонент типа элемента управления.

Обычно он встречается здесь:

  • поставки вендорских SDK
  • старые проекты на VB6 / Access / MFC
  • файлы в инсталляторе, которые нужно регистрировать
  • компоненты, для которых нужен regsvr32

Важно помнить: OCX — форма файла, а не сам концепт. Поэтому грубый ответ на что такое OCX такой: файл, с которым чаще всего сталкиваются как с телом ActiveX control.

6.2. Чем отличается от .dll

Здесь тоже легко запутаться.

  • .ocx довольно уверенно намекает, что это ActiveX control
  • .dll может оказаться и обычной библиотекой, и COM-сервером, и зависимой DLL из окружения ActiveX

Увидев .ocx, можно с достаточной уверенностью предположить, что речь об ActiveX; увидев только .dll, вы пока не поймёте, что это такое.

На практике часто стоит такая расстановка:

  • vendorcontrol.ocx
  • vendorhelper.dll
  • vendorcore.dll

где главную роль играет OCX, а DLL держат его сбоку.

Поэтому на вопрос OCX — это разновидность DLL? по ощущению это близко, но в исследовании безопаснее смотреть на роли раздельно.

Сколько можно прочитать из расширенияocx довольно уверенно намекает, что это ActiveX control, а dll ещё может быть обычной библиотекой, COM-сервером или зависимой DLL. На практике часто главную роль играет OCX, а DLL держат его сбоку..ocx.dllКакое расширение?Почти наверняка сторона ActiveXПока непонятно, что этоБиблиотека, COM-сервер или зависимостьГлавный OCX, сбоку его держат DLL

Рис. 10: По .ocx уже можно попасть в цель; по .dll, пока не разобрана роль, непонятно, что это.

7. Различия в таблице

Слово Что это Слова, которые часто встречаются на практике Частая физическая форма
COM Компонентная модель, основа бинарного контракта IUnknown, QueryInterface, CLSID, IID, Apartment .dll, .exe, регистрационные данные
ActiveX Контекст control на базе COM Контейнер, встраивание, свойства, события ActiveX control
ActiveX control Переиспользуемый компонент, который реально размещают Сетка, календарь, вьюер, связка с оборудованием .ocx, .dll
OCX Расширение файла, которое часто встречается у ActiveX control 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 control, обёрнутые для использования из WinForms
    • случаи, когда существующие COM-наработки продлевают жизнь в роли UI-компонентов

И здесь мы снова возвращаемся к тому, что ActiveX — не технология только для интернета. Он выглядит как веб-технология потому, что был особенно заметен в IE; по сути же и на практике точнее видеть в нём технологию встраиваемых компонентов Windows.

Расхождение видимости и сутиИз-за того что ActiveX был особенно заметен в IE, он выглядит как старая веб-технология, но на деле применялся широко в десктопных приложениях, внутренних веб-системах и существующих .NET-приложениях; суть — технология встраиваемых компонентов Windows.Память о том, как это было заметно в IEВыглядит как старая веб-технологияРеальные места примененияДесктопные приложенияБраузер и внутренний вебСуществующие .NET-приложенияСуть — технология встраиваемых компонентов Windows

Рис. 11: Расхождение между видимостью «старая веб-технология» и сутью «технология встраиваемых компонентов Windows».

9. Почему это легко перепутать

9.1. Слова разных уровней появляются в одном разговоре

  • COM — это речь об основе
  • ActiveX — это речь о контексте компонентов
  • OCX — это речь о файле

Изначально это разные уровни, но на практике они всплывают одновременно на одной площадке, поэтому разговор легко превращается в кашу.

9.2. Слово ActiveX немного широкое

У COM значение сравнительно устойчивое. ActiveX, напротив, используется чуть шире — и исторически, и на практике.

В зависимости от человека под этим может иметься в виду:

  • сам элемент управления
  • файл .ocx
  • старый компонент, который работает в IE
  • встраиваемые компоненты на базе COM в целом

И эти значения расходятся. На этом этапе разговор уже не сходится.

9.3. Стоит увидеть .ocx, как хочется назвать всё подряд ActiveX

Это желание понятно. Для повседневного разговора обычно этого достаточно.

Но в задачах миграции или исследования, если не проверить отдельно,

  • является ли это UI-компонентом
  • в каком хосте это работает
  • нужна ли регистрация
  • как обстоят дела с 32-бит / 64-бит
  • есть ли зависимость от браузера

позже это обязательно вылезет.

Три причины путаницыПутаницу дают три вещи: в одном разговоре смешиваются разные уровни, слово ActiveX чуть широкое, и стоит увидеть ocx, как хочется назвать всё подряд ActiveX.Речь разных уровней в одном разговореРазговор превращается в кашуСлово ActiveX широкоеУвидев ocx, называют всё подряд такВ миграции и исследовании это вылезает

Рис. 12: Суть путаницы в том, что основа, компонент и файл — разные уровни — появляются на одной площадке одновременно.

10. Как к этому относиться в сегодняшней практике

Прежде всего: находка COM / ActiveX / OCX ещё не значит, что всё нужно сразу отвергнуть. Но и относиться ко всему с одной температурой тоже опасно.

Зависимость от ActiveX на стороне браузера

Это безопаснее рассматривать в первую очередь и достаточно жёстко.

  • Это не часть основного направления современной разработки браузеров
  • В контексте совместимой эксплуатации всплывает режим IE, но его лучше воспринимать как мост для обратной совместимости
  • Опираться на него как на предпосылку для чего-то нового сложно рекомендовать

Для решения нужна ещё и временная шкала. Десктопное приложение IE11 уже выведено из эксплуатации; оставшаяся опора — режим IE в Microsoft Edge. По этому режиму IE Microsoft держит курс поддерживать как минимум до 2029 года и предупреждать об отмене за год. То есть 2029 — это не «до тех пор можно ничего не делать», а срок, к которому отделение нужно закончить, и от него считают назад. Сами шаги отделения разобраны отдельно в Как избавиться от зависимости внутренних веб-систем от режима IE.

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

Временная шкала ActiveX на стороне браузераДесктопное приложение IE11 уже выведено, оставшаяся опора — режим IE в Edge; Microsoft держит курс поддерживать как минимум до 2029 года и предупреждать об отмене за год. 2029 — не срок, до которого можно ничего не делать, а срок, к которому отделение нужно закончить.Десктопный IE11 уже выведенОставшаяся опора — режим IE в EdgeПоддержка как минимум до 2029Считать назад как срок окончания отделенияКурс: об отмене предупреждать за год

Рис. 13: 2029 — не отсрочка, а дедлайн. На стороне браузера думают в терминах «с чего начать отделение».

Зависимость от ActiveX / OCX на стороне десктопа

Здесь можно судить чуть прагматичнее.

  • Стабильно работает внутри существующего хоста
  • Круг поставки ограничен
  • Есть перспектива поддержки — вендорской или собственной
  • Понятны предпосылки о регистрации, зависимых DLL, разрядности

Если эти условия выполняются, решение оставить — вполне нормальное.

С другой стороны, если:

  • хочется загрузить 32-битный OCX напрямую в 64-битную сторону
  • хочется перевести на .NET только окружение
  • поставка и регистрация каждый раз ломаются
  • остаётся зависимость от браузера

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

Сегодняшняя практика спрашивает не о том, плохо ли, что это ActiveX, а о том, где провести границу. Если смотреть на это не как на старую технологию, а как на стык существующей системы, с этим становится заметно легче работать.

Как расходятся решения на стороне десктопаЕсли стабильная работа, ограниченная поставка, перспектива поддержки и понимание предпосылок есть, решение оставить — нормальное; если есть столкновение разрядности, частичный перевод на .NET, сбои поставки или зависимость от браузера, отдельно рассматривают оставить, обернуть и заменить.стабильная работа и понимание предпосылокесть узкие местаУсловия выполнены?Решение оставить — нормальноеОтдельно: оставить, обернуть, заменитьКак стык: где провести границу

Рис. 14: На стороне десктопа температуру разделяют. Вопрос не в добре и зле, а в положении границы.

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

Как поправить частые заблужденияCOM — не сам ActiveX, а основа; ActiveX не только для IE; ActiveX и OCX различаются как концепт и файл; COM — не мёртвая технология.COM = ActiveX?COM — основа, это другоеActiveX = только IE?На десктопе тоже в ходуActiveX = OCX?Разница концепта и файлаCOM уже мёртв?Во взаимодействии встречается и сейчас

Рис. 15: Все пять заблуждений рождаются из смешения разных уровней.

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. Как поступать с этим дальше
    • оставить как есть?
    • провести границу и обернуть?
    • заменить?

12.1. Чем это смотреть

Шесть пунктов выше — «на что смотреть». Рядом полезно держать и «куда открыть». Без этого даже при чек-листе первый шаг стопорится.

Что нужно выяснить Каким инструментом и куда смотреть
Может ли этот .dll / .ocx сам себя зарегистрировать как COM-сервер В dumpbin /exports имя-файла из состава Visual Studio: если экспортирован DllRegisterServer, это саморегистрируемый COM-сервер. Именно эту функцию вызывает regsvr32
Как регистрировать и снимать регистрацию regsvr32 имя-файла регистрирует, regsvr32 /u имя-файла снимает. Нужны права администратора. На 64-битной Windows %SystemRoot%\System32\regsvr32.exe — 64-битный, %SystemRoot%\SysWOW64\regsvr32.exe — 32-битный; выбирают под разрядность компонента
Найти файл реализации по CLSID В реестре значение по умолчанию HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32 — путь in-process сервера (DLL / OCX). Для out-of-process компонента смотрят LocalServer32
Найти CLSID по ProgID Значение по умолчанию HKEY_CLASSES_ROOT\имя-ProgID\CLSID — это CLSID. Обратно можно смотреть подраздел ProgID со стороны CLSID
Куда регистрируются 32-битные компоненты На 64-битной Windows 32-битная регистрация попадает под HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID. Нельзя, глядя только на 64-битную сторону, решить, что «не зарегистрировано»
Перечислить публикуемые интерфейсы Если в Windows SDK есть OLE/COM Object Viewer (oleview.exe), им смотрят зарегистрированные классы и Type Library. В части версий SDK его нет — тогда идут по реестру и по ссылкам в среде разработки
Разрядность хоста На вкладке «Подробности» диспетчера задач щёлкните правой кнопкой по заголовку столбца и добавьте столбец «Платформа» — по каждому процессу будет видно, 32-бит это или 64-бит. 32-битный OCX напрямую в 64-битный процесс не загрузится
Сбой регистрации или разрешения зависимых DLL Process Monitor по обращениям к реестру и файлам показывает, какой ключ или какую DLL искали и где это не удалось. Как пользоваться, разобрано в Практическое руководство по Process Monitor (ProcMon)

Если, не пройдя по этому, броситься с фразой раз есть ActiveX, реализуем всё заново с нуля, вы аккуратно наступите на все старые грабли. Сначала заполните соответствие шести пунктов и инструментов, и уже потом решайте «оставить / обернуть / заменить» из главы 10 — так безопаснее.

Порядок исследованияПо порядку смотрят, что это за компонент, где он работает, какие файлы и идентификаторы, как устроены регистрация и поставка, совпадает ли разрядность — и уже потом решают оставить, обернуть или заменить.Смотрят, что это за компонентСмотрят, где работаетРазбирают файлы и идентификаторыПроверяют регистрацию и поставкуПроверяют разрядностьРешают: оставить, обернуть или заменить

Рис. 16: Не бросаться сразу в новую реализацию. Безопаснее заполнить этот порядок и уже потом выбирать направление.

13. Итог

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

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

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

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

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

14. Источники

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

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

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

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

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

Что такое файл OCX?
OCX — расширение файла, которым часто оформляют реализацию ActiveX control. Увидев .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 control давно жили и на стороне Windows-приложений: формы Access, приложения VB6, контейнеры MFC, окружение Office / VBA, COM-обёртки из WinForms. На практике точнее видеть в этом не браузерную технологию, а технологию встраиваемых компонентов Windows. Зависимость от ActiveX в браузере сегодня реалистичнее рассматривать не как «как продлить жизнь», а как «с чего начать отделение».
Чем OCX отличается от DLL?
Расширение .ocx довольно уверенно намекает, что это ActiveX control, а .dll может оказаться и обычной библиотекой, и COM-сервером, и зависимой DLL из окружения ActiveX. На практике часто главную роль играет vendorcontrol.ocx, а DLL вроде vendorhelper.dll держат его сбоку. Если спросить, является ли OCX разновидностью DLL, по ощущению это близко, но в задачах исследования или миграции безопаснее смотреть на роли раздельно.

Об авторе

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

Го Комура

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

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

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

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