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