Технология ActiveX базируется на технологии Microsoft COM и позволяет создавать и использовать программные компоненты, предоставляющие различные сервисы другим приложениям и операционной системе.
В настоящее время существуют три типа спецификаций COM, определенных Microsoft и включающих большое количество интерфейсов и функций:
Использование СОМ, и в частности технологии ActiveX, позволяет создавать приложения, собираемые из готовых компонентов - элементов управления ActiveX. При этом не имеет значения, на каком языке программирования написаны как готовые компоненты, так и использующее их приложение, - лишь бы средство разработки поддерживало возможность использования таких компонентов в разрабатываемом приложении (такое приложение обычно называется контейнером).
Элементы управления ActiveX своим поведением напоминают компоненты на палитре C++Builder. Их можно поместить на проектируемую форму, и при этом в инспекторе объектов появятся их свойства и события. Можно также вызывать их методы на этапе выполнения использующего их приложения. Как было сказано выше, главное отличие элементов ActiveX от компонентов VCL заключается в том, что если компоненты, написанные на Delphi, доступны для использования только в Delphi и C++Builder, а компоненты, написанные на C++ Builder, - только в C++Builder, то элементы управления ActiveX можно применять в любых средствах разработки, поддерживающих использование в приложениях СОМ-объектов, например в Visual Basic, Microsoft Visual C++, PowerBuilder, Visual dBase и др.
Элементы управления ActiveX представляют собой библиотеки, содержащие исполняемый код. Эти библиотеки могут быть использованы в различных приложениях как встроенные элементы управления, поэтому они обладают свойствами, событиями и методами, доступными посредством автоматизации. Подавляющее большинство современных средств разработки, как правило, позволяет включать такие элементы в создаваемые с их помощью приложения. Помимо этого, элементы управления ActiveX нередко используются в качестве расширений Web-браузеров с целью придания им дополнительной функциональности, например для отображения документов, отличных от поддерживаемых данным браузером.
Отметим, что элементы управления ActiveX представляют собой внутренние (in-process) серверы, выполняющиеся в адресном пространстве приложения.
Как любой СОМ-сервер, элемент управления ActiveX обладает уникальным идентификатором GUID и должен быть зарегистрирован в реестре. На основании этой записи может быть осуществлен поиск местоположения файла с расширением *.осх, содержащего его реализацию.
Таким образом, создав элемент управления ActiveX, обладающий интересующей вас функциональностью, вы можете в дальнейшем позволить его пользователям встраивать этот элемент в свои приложения (например, написанные на Visual Basic, PowerBuilder, Delphi, C++Builder, Visual dBase и др.), отображать его в Web-браузере в составе выгруженной с вашего Web-сервера HTML-страницы, включать его в состав документов MS Office, при этом вы не обязаны представлять исходный текст этого компонента.
Когда следует создавать управляющие элементы ActiveX?
Естественно, в тех случаях, когда функциональность, содержащаяся в таком элементе, уникальна. Нет смысла создавать ActiveX, реализующий функциональность кнопки или текстового редактора, - таких элементов управления, в том числе выполненных в виде ActiveX, на рынке готовых компонентов более чем достаточно. Нет смысла также создавать ActiveX, если он будет использоваться только в C++Builder; в этом случае проще создать VCL-компонент, который будет работать в использующем его приложении значительно быстрее, чем аналогичный ActiveX. Но создание элемента управления, реализующего, к примеру, часть автоматизированного рабочего места какой-либо категории сотрудников предприятия, может оказаться весьма полезным особенно в следующих двух случаях. Первый случай - использование на предприятии различных инструментальных средств, например C++Builder и Visual Basic; в этом случае разработчик, использующий Visual Basic, может встраивать в свои приложения ActiveX, созданный другим разработчиком и реализующий какую-либо функциональность, используемую несколькими различными автоматизированными рабочими местами. Второй случай - широкое использование Internet или intranet при автоматизации предприятия. В этом случае ActiveX, реализующий подобную функциональность, может быть встроен в HTML-страницу и отображен в Web-браузере. Такой подход существенно облегчает решение проблемы обновления версий автоматизированных рабочих мест, так как вместо установки новых версий на рабочих станциях достаточно заменить один экземпляр ActiveX, хранящийся на Web-сервере. Наиболее ярким примером такого подхода может быть выполненный в виде ActiveX "тонкий" клиент, получающий данные от удаленного сервера приложений, являющегося, в свою очередь, клиентом серверной СУБД.
Такой набор преимуществ сделал эту технологию весьма популярной, и именно поэтому многие современные средства разработки, такие, как Delphi или C++Builder, позволяют создавать элементы управления ActiveX. Эти средства обычно имеют встроенные механизмы поддержки спецификации ActiveX с помощью автоматической генерации соответствующего кода (хотя, конечно, не возбраняется писать подобный код вручную).
Спецификация ActiveX представляет собой набор правил (а именно описание стандартных интерфейсов), с помощью которых следует создавать такие элементы управления. Отметим, что текущая версия этой спецификации учитывает возможность использования в качестве контейнера Web-браузеров и необходимость загрузки элементов ActiveX с удаленных Web-серверов с их автоматической регистрацией.
C++Builder позволяет создавать элементы управления ActiveX на основе VCL-компонентов. При этом могут использоваться не только компоненты, поставляемые с C++Builder, но и созданные программистом или приобретенные у третьих лиц.
Процесс создания элемента управления ActiveX весьма прост. Для этого следует выбрать из репозитария объектов страницу ActiveX, а потом элемент ActiveX Control. Далее следует заполнить появившуюся диалоговую панель. Следует выбрать VCL-компонент, на основе которого будет создан элемент ActiveX. В качестве примера выберем TCalendar.
Отметим, что при выборе опции Include Design-Time Licence автоматически будет сгенерирован файл с расширением *.lic, без которого данный ActiveX нельзя будет использовать ни в каких средствах разработки, но можно поставлять с готовыми приложениями. Использование такого файла бывает удобно в случае, когда ActiveX поставляется бесплатно его автором в составе готового продукта, но требует отдельного лицензирования при встраивании его другими пользователями в свои разработки.
Опция Include Version Information нужна для того, чтобы информация о версии управляющего элемента ActiveX была доступна использующим его приложениям. Если создаваемый элемент управления планируется использовать в Visual Basic, эту опцию обязательно следует выбрать.
В результате работы ActiveX Control Wizard будет создано несколько модулей, сгенерирован уникальный идентификатор (GUID) будущего ActiveX, а также соответствующая библиотека типов.
Библиотека типов содержит сведения о свойствах, событиях и методах компонента ActiveX, унаследованных от исходного VCL-компонента.
В коде, связанном с реализацией ActiveX, можно найти описание этих свойств и методов.
Отметим, что для включения элемента управления ActiveX в приложение необходимо, чтобы это приложение импортировало его библиотеку типов (элементы управления ActiveX, в отличие от некоторых других СОМ-серверов, обязаны экспонировать свою библиотеку типов). После этого на форме, на которую помещается элемент ActiveX, создается контейнер, представляющий собой СОМ-объект.
В библиотеке типов элемента ActiveX содержится как минимум пара интерфейсов - IDispatch и Dispinterface (диспинтерфейс). В IDispatch содержатся свойства и методы, которые экспонируются элементом управления ActiveX. Ссылка на IDispatch передается контейнеру, и контейнер может изменять свойства и вызывать методы элемента управления ActiveX. Кроме того, контейнер считывает идентификатор IID (Interface Identifier) и список методов диспинтерфейса элемента ActiveX. Далее внутри контейнера создается интерфейс IDispatch с тем же самым IID и тем же самым списком методов. Ссылка на этот интерфейс передается элементу ActiveX. При этом внутри самого ActiveX никаких дополнительных диспинтерфейсов не создается.
Полученная ссылка на интерфейс IDispatch элемента ActiveX используется инспектором объектов для вызова методов, устанавливающих значения свойств элемента ActiveX. Обработчики событий, доступные в инспекторе объектов (или в его аналоге в других средствах разработки), связываются с интерфейсом IDispatch контейнера.
Если на этапе выполнения необходимо изменить свойства элемента ActiveX или выполнить его методы, контейнер обращается к интерфейсу IDispatch элемента ActiveX. И наоборот, при возникновении событий в ActiveX он обращается к интерфейсу IDispatch контейнера.
Как будет показано в дальнейшем, методы СОМ-объекта можно вызвать либо через виртуальную таблицу методов (раннее связывание), либо через IDispatch (позднее связывание). Для вызова методов ActiveX и изменения его свойств контейнером используется раннее связывание. Однако при возникновении событий ActiveX вызывает методы контейнера только через IDispatch. Понятна причина такого различия - ActiveX всегда разрабатывается раньше контейнера, в котором он используется, и при его разработке таблица виртуальных методов контейнера недоступна.
Далее следует сохранить и скомпилировать проект и зарегистрировать элемент ActiveX в реестре. Это делается с помощью выбора пункта меню Run/Register ActiveX Server.
После этого можно протестировать созданный ActiveX-компонент, открыв его, например, в Visual Basic. Отметим, что последние версии именно этого средства разработки широко используют элементы управления ActiveX в качестве составных частей создаваемых с их помощью приложений. Фактически приложения Visual Basic собраны целиком из ActiveX-компонентов. Более того, спецификация ActiveX создана с учетом того, что в первую очередь Visual Basic и Visual C++ (и лишь затем остальные средства разработки) могут быть контейнерами для этих элементов управления. Поэтому тестирование поведения ActiveX в Visual Basic может более или менее гарантировать, что в других средствах разработки этот управляющий элемент будет вести себя точно так же.
В случае отсутствия Visual Basic можно воспользоваться и более широко распространенным Visual Basic for Applications. С этой целью можно запустить Microsoft Word 97, создать новый документ и выбрать на панели инструментов кнопку "Редактор Visual Basic". Далее следует выбрать в окне Project имя вновь созданного документа, щелкнуть по нему правой кнопкой мыши и из полученного контекстного меню выбрать опцию "Insert/UserForm". На экране появится редактор форм Visual Basic и панель элементов. Далее нужно щелкнуть правой клавишей мыши по панели элементов и выбрать из контекстного меню опцию "Дополнительные элементы". Теперь следует из появившегося списка всех зарегистрированных элементов управления ActiveX выбрать нужный, и он автоматически окажется на панели элементов Visual Basic (можно поместить его на единственную имеющуюся страницу управляющих элементов или создать свою, выбрав опцию "Создать страницу" из контекстного меню ярлычков блокнота, расположенного на панели элементов). После этого можно поместить наш ActiveX на форму и попытаться изменить какие-либо его свойства, используя для этой цели окно "Свойства".
И наконец, можно вернуться в редактируемый документ, поместить на него кнопку, дважды щелкнуть по ней и в окне редактора кода создать процедуру, показывающую созданную форму, вписав в сгенерированный код строку UserForml.Show:
Private Sub CommandButton1_Click() UserForml.Show End Sub
Теперь можно нажать на панели инструментов Visual Basic кнопку "Выход из режима конструктора". После этого нажатие на созданную в теле документа кнопку приведет к появлению диалоговой панели с созданным нами элементом управления.
Можно было бы, конечно, протестировать поведение созданного ActiveX, установив его в палитру компонентов Delphi или C++Builder, но это не самый лучший способ тестирования - ведь в основе создания нашего ActiveX лежит та же самая библиотека VCL, что и в основе создаваемого приложения для тестирования ActiveX. Применение для этой цели любого не имеющего отношения к VCL средства разработки, способного использовать элементы управления ActiveX в создаваемых приложениях, более оправданно. При этом следует заметить, что Visual Basic for Applications представляет собой наиболее часто встречающееся средство разработки такого класса, так как входит в состав самого популярного в нашей стране офисного пакета.
Так как элементы управления ActiveX могут быть использованы в средствах разработки, нередко они обладают набором страниц свойств, позволяющим пользователям менять те или иные свойства этого элемента управления.
Для создания страницы свойств выберем из репозитария объектов страницу ActiveX и элемент Property Page. В результате получим форму, на которой можно размещать интерфейсные элементы.
Создадим страницу для редактирования свойств CalendarDate и GridLineWidth. Для этого разместим на вновь созданной форме два компонента TStaticText и два компонента TEdit. В созданной форме имеются сгенерированные прототипы обработчиков событий UpdatePropertyPage и UpdateObject. Добавим в них соответствующий код:
void __fastcall TPropertyPage1::UpdatePropertyPage(void) { // Update your controls from OleObjects Edit1->Text = OleObject.OlePropertyGet ("CalendarDate"); Edit2->Text = OleObject.OlePropertyGet ("GridLineWidth"); } void __fastcall TPropertyPage1::UpdateObject(void) { // Update OleObjects from your controls OleObject.OlePropertySet ("CalendarDate", Variant (Edit1->Text)); OleObject.OlePropertySet ("GridLineWidth", Variant (Edit2->Text)); }
Далее следует создать ссылку на странице свойств в модуле, описывающем реализацию элемента ActiveX. С этой целью следует модифицировать h-файл. Модификация кода заключается во вставке строки, указывающей на необходимость регистрации страницы свойств:
BEGIN_PROPERTY_MAP(TCCalendarXImpl) // PROP_PAGE(CLSID_CCalendarXPage) PROP_PAGE(CLSID_CCalendarX) END_PROPERTY_MAP()
Следует также включить ссылку на h-файл страницы свойств в h-файл реализации ActiveX. Далее следует заново скомпилировать библиотеку ActiveX и зарегистрировать ее.
Если теперь в среде разработки Visual Basic поместить на пользовательскую форму наш ActiveX и выбрать страницу свойств "Специальные", получим созданную нами страницу:
При изменении значений в компонентах TEdit можно убедиться, что изменяются и соответствующие свойства элемента ActiveX. Создание активных форм
Активная форма - это элемент управления ActiveX, содержащий несколько VCL-компонентов. Возможность создания таких элементов управления позволяет существенно расширить круг доступных для элементов ActiveX функциональных возможностей. Создание такого ActiveX происходит примерно так же, как и разработка обычного приложения.
Приведем простейший пример такого элемента управления. Для его разработки следует выбрать со страницы ActiveX репозитария объект ActiveForm, ответить на вопросы об имени компонента, после чего в дизайнере форм получим пустую форму - заготовку будущего ActiveX. Добавим на эту форму компоненты TCheckBox, TButton, TImage и TOpenPictureDialog, заменив некоторые из их свойств.
Создадим обработчики событий, связанных со щелчками мыши на компонентах TCheckBox и TButton:
void __fastcall TActiveFormX::Button1Click(TObject *Sender) { if (OpenPictureDialog1->Execute ()) { Image1->Picture->LoadFromFile (OpenPictureDialog1->FileName); } } void __fastcall TActiveFormX::CheckBox1Click(TObject *Sender) { Image1->Stretch = CheckBox1->Checked; }
Теперь можно скомпилировать приложение, зарегистрировать созданный ActiveX и протестировать его указанным выше способом.
Можно также протестировать созданный ActiveX с помощью отображения его в Internet Explorer. Для этой цели достаточно выбрать пункт меню "Project/Web Deployment Options" и на странице "Project" в полях "Target dir", "Target URL", "HTML dir" этого диалога указать имя какого-нибудь локального каталога.
Затем можно выбрать опцию "Project/Web Deploy" и по окончании работы Web Deployment Wizard открыть в Internet Explorer автоматически сгенерированную C++Builder HTML-страницу с именем, совпадающим с именем созданного проекта.
Отметим, что для успешного отображения ActiveX в браузере требуется Microsoft Internet Explorer версии 3.0 и выше, при этом настройки уровня безопасности должны позволять загрузку и выполнение элементов ActiveX, расположенных в intranet-зоне (что существенно отличается от установок, принятых по умолчанию; далее в этой главе будут более подробно освещаться вопросы безопасности, связанные с отображением ActiveX в Internet Explorer).
Если в качестве браузера используется Netscape Navigator, он должен быть оснащен модулем расширения (plug-in), позволяющим интерпретировать тег <OBJECT> языка HTML как элемент управления ActiveX (естественно, такая возможность существует только для версий Navigator, выполняющихся под управлением 32-разрядных версий Windows).
Отметим также, что сгенерированную автоматически страницу можно в дальнейшем отредактировать с помощью любого HTML-редактора (или даже любого текстового редактора).
При поставке ActiveX через Web процедура аналогична описанной, но вместо локальных каталогов в строке URL следует указать Internet-адрес Web-сервера.
Нужно обратить внимание на следующее: "Target dir" и "Target URL" представляют собой путь к одной и той же директории, но в первом случае путь задается с точки зрения владельца локального компьютера, а во втором - с точки зрения пользователя-гостя, обращающегося к Web-серверу через Internet. Конкретное соответствие определяется в настройках Web-сервера, и перед началом заполнения данного диалога необходимо уточнить его настройки. Директория, в которую помещают *.осх или *.cab-файл, должна быть доступна для чтения гостям. В частности, при установке Web-серверов Microsoft такой директорией по умолчанию считается C:\InetPub\WWWRoot. Соответственно URL, который определен для каждого Web-сервера, и указывает на эту директорию - http://localhost, если тестирование будет проводиться на локальном компьютере.
Помимо этого, следует обратить внимание на дополнительные пакеты или другие файлы, которые надо включить в поставку, если опции проекта таковы, что требуют использования каких-либо дополнительных библиотек. Разделение ActiveX на несколько файлов и выделение отдельных пакетов может быть использовано для того, чтобы уменьшить в целом время загрузки ActiveX через Internet, например в случае предстоящей необходимости обновления версии ActiveX или при поставке нескольких разных ActiveX, тогда часть пакетов, содержащих общую для всех ActiveX или для всех версий данного ActiveX часть скомпилированного кода, может быть установлена один раз, а далее производится поставка лишь небольшой содержательной части элемента ActiveX. Впрочем, не возбраняется создавать ActiveX и в виде одного файла. Отметим также, что при выборе опции Include CAB File compression можно собрать используемые файлы в один файл с расширением *.cab, фактически представляющий собой архив, что также уменьшает примерно в два раза время загрузки файлов через Internet.
Следует отметить, что в активных формах можно использовать практически все компоненты C++Builder, кроме TMainMenu. Возможна также динамическая генерация дополнительных форм на этапе выполнения, при этом дополнительные формы уже не будут содержаться в контейнере, а будут представлять собой обычные формы Windows (и естественно, могут содержать в том числе и TMainMenu).
Отметим также, что, редактируя библиотеку типов, можно к созданным ActiveX добавлять свойства и методы и затем описывать их реализацию в соответствующем модуле.