- •Проблемы, решаемые с помощью технологии com
- •Основные понятия
- •Именование com-объектов
- •Понятие интерфейса
- •Основы компиляции
- •Простейший пример использования
- •Интерфейс iUnknown
- •Еще один пример
- •Com-сервер
- •Создание "настоящего" com-сервера.
- •Фабрика классов
- •Использование фабрики классов
- •ITypeLib, iTypeInfo, библиотеки типов и информация о методах сервера. Язык idl.
- •IDispatch и вызов методов "по имени"
- •IMarshall, маршалинг и взаимодействие клиента с внутренними, локальными и удаленными серверами
- •Технология ole Внедрение и связывание объектов - ole
- •Использование ole-документов в приложениях
- •Использование свойств OleContainer
- •Создание элементов управления ActiveX Понятие ActiveX.
- •Создание элементов управления ActiveX на основе vcl-компонентов
- •Создание страниц свойств
- •Создание активных форм
- •Создание локальных серверов и контроллеров автоматизации Понятие автоматизации.
- •Создание приложения, подлежащего автоматизации
- •Превращение приложения в сервер автоматизации
- •Библиотека типов
- •Реализация методов объекта автоматизации
- •Создание контроллера
- •Раннее и позднее связывание
- •Создание контроллеров для произвольных серверов автоматизации
- •Коллекции объектов внутри серверов автоматизации
- •Использование информации из библиотек типов
- •Создание коллекций объектов
- •Экспонируемые свойства и методы
- •Процессы в Windows Процессы
- •Планирование потоков
- •Приоритеты
- •Привязка к процессорам
- •Создание процессов
- •Завершение процессов
- •Создание потоков
- •Завершение потоков
- •Wait функции
- •Синхронизация потоков
- •Синхронизация процессов
- •Взаимодействие между процессами
- •Создание внутренних серверов и контроллеров автоматизации Внутренний сервер автоматизации и передача данных
- •Создание внутреннего сервера автоматизации
- •Манипуляция ресурсами в dll
- •Работа внутреннего сервера автоматизации в многопоточном режиме Понятие многопоточности. Синхронизация
- •Класс tThread
- •Пример многопоточного приложения
- •Применение com-объектов, входящих в состав Windows Создание ярлыков
- •Использование Internet Explorer в приложениях
Создание элементов управления ActiveX на основе vcl-компонентов
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 представляет собой наиболее часто встречающееся средство разработки такого класса, так как входит в состав самого популярного в нашей стране офисного пакета.