Шаг 168.
Среда программирования Visual C++.
Элементы управления на базе ActiveX

    На этом шаге мы дадим краткую характеристику элементов ActiveX .

    Элемент управления на базе ActiveX - это СОМ-объект, размещенный в контейнере ActiveX-элементов типа диалогового окна приложения или Web-страницы и выполняющий самостоятельную функцию. Часто графический интерфейс пользователя состоит из ActiveX-элементов.

    ActiveX-элемент - это произвольный СОМ-объект, предоставляющий интерфейс IUnknown и находящийся в саморегистрирующемся СОМ-сервере, который в свою очередь может размещаться в DLL- или ЕХЕ-файле. Клиент ActiveX-элемента называется контейнером (Container). Элементы управления ActiveX находятся, или располагаются (sited), в контейнере ActiveX-элементов. На рисунке 1 показан управляющий элемент Microsoft Chart, находящийся в контейнере ActiveX Control Test Container.


Рис.1. Контейнер ActiveX Control Test Container

    Обычно ActiveX-элементы применяют для реализации пользовательского интерфейса. Многие считают это главной функцией технологии ActiveX-элементов. По мере развития и увеличения популярности распределенных приложений остается все меньше причин для поддержки пользовательского интерфейса в СОМ-компонентах. Действительно, если Ваш СОМ-компонент, находящийся на удаленном компьютере, откроет информационное окно ошибки, то увидеть его Вы не сможете. С другой стороны, большинство ActiveX-элементов тесно связаны с контейнером, представляющим пользовательский интерфейс. Предполагается, что элемент управления работает как часть этого интерфейса.

    Хотя по определению ActiveX-элементам достаточно поддерживать интерфейс IUnknown, контейнеры могут предъявлять к ним свои особые требования, например поддержку определенных интерфейсов, без которых взаимодействие невозможно. Если Вы хотите, чтобы Ваш элемент работал с каким-то особенным контейнером, Вам придется реализовать нужные ему интерфейсы.

    Большинство популярных контейнеров требуют от элемента управления поддержки некоторого набора данных, генерации событий и предоставления достаточного для нормальной работы количества интерфейсов. В таблице 1 перечислен минимальный набор интерфейсов, обязательных для взаимодействия с контейнером ActiveX Control Test Container (а также большинством других контейнеров пользовательского интерфейса).

    При рассмотрении такого большого числа интерфейсов можно предположить, что создание ActiveX-элементов - задача сложная трудоемкая, но в MFC и ATL есть мастера, позволяющие автоматически создать каркас ActiveX-элемента и сосредоточиться на реализации требуемой Вам функциональности.

Таблица 1. Минимальный набор интерфейсов, поддерживаемых ActiveX-элементом
Интерфейс Описание
IOleQbject Необходим для взаимодействия с клиентским местом (site), если оно не организовано на основе событий. События обрабатываются через интерфейс IConnectionPointContainer (он рассмотрен далее)
IOleInPlaceObject Реализуется в элементах управления, которые могут активизироваться "по месту" и предоставлять собственный пользовательский интерфейс. Требует поддержки IOleObject
IOleInPlaceActiveObject Необходим только для элементов, предоставляющих пользовательский интерфейс и поддерживающих IOleInPlaceObject
IDataObject Необходим для элементов управления, передающих каким-либо способом данные в контейнер (например через разделяемую память или файл). IDataObject предоставляет средства для Uniform Data Transfer - СОМ-протокола, устанавливающего правила обмена данными любого вида
FViewObject2 Поддерживается видимыми элементами, которые отображают окно
IDispatch Необходим для элементов управления со специальными методами или свойствами, доступными клиенту через Dispatch::Invoke()
IConnectionPointContainer Необходим для элементов управления, генерирующих события. Этот интерфейс перечисляет клиенту события, которые элемент способен породить
ConnectionPoint Необходим для элементов управления, поддерживающих интерфейс IConnectionPointContainer
IProvideClassInfo Реализован в элементах управления, содержащих библиотеки типов, то есть в большинстве ActiveX-элементов. Метод GetClassInfo() этого интерфейса предоставляет указатель на конкретную версию ITypeInfo, из которой клиент может извлечь сведения о типе элемента управления
IPersistStorage Необходим для элементов управления, которые осуществляют сохранение/загрузку в/из предоставляемого контейнером экземпляра IStorage
IClassFactory Создает экземпляр объекта требуемого класса и возвращает указатель на него. Объекту присваивается CLSID, который одновременно регистрируется в системном реестре
IClassFactory2 To же, что IClassFactory, но с поддержкой лицензирования

    На следующем шаге мы рассмотрим свойства элементов управления ActiveX.




Предыдущий шаг Содержание Следующий шаг