На этом шаге мы рассмотрим создание библиотеки типов.
Что представляет собой библиотека типов и зачем она нужна? По существу, библиотека типов - это двоичный файл с описанием интерфейсов СОМ-объекта и их методов.
Обычно языком таких описаний является специальный язык IDL, а используются они для того, чтобы разработчики знали, как создать код, реализующий методы СОМ-объекта
(или вообще методы объекта, расположенного за пределами адресного пространства разрабатываемого приложения, так как IDL используется не только в СОМ-технологии, но
и в иных технологиях, реализующих вызовы удаленных процедур или функций, например, CORBA). Помимо этого, описания методов на языке IDL могут потребоваться
для автоматической генерации (с помощью соответствующих утилит) серверного и клиентского кода для объектов, реализующих маршалинг (marshalling), которыми
являются так называемые прокси (proxy) и стаб (stub).
С другой стороны, код для прокси и стаба может генерироваться динамически. В этом случае клиент должен динамически получать информацию о свойствах и методах интерфейсов СОМ-объекта,
и наличие библиотеки типов, содержащей такую информацию, может быть весьма удобным. Отметим, что библиотеку типов на основе описания на языке IDL можно в принципе
сгенерировать с помощью специального компилятора MIDL, но в данном случае в этом нет необходимости.
Для редактирования библиотеки типов используется разработанный компанией Borland редактор (рисунок 1).
Рис.1. Редактор библиотеки типов вновь созданного сервера
В этом редакторе необходимо определить свойства и методы интерфейсов, а также константы. Возникает вопрос - зачем потребовался отдельный редактор? Не проще
ли описывать свойства и методы в редакторе кода, как это делается при редактировании классов? Ответ заключается в том, что при добавлении или изменении
кода в редакторе библиотеки типов новый код попадает в три интерфейса одновременно: в интерфейс ITypeLibrary, в редактируемый интерфейс и
в интерфейс IDispatch (при установленном флажке Dual на странице Flags окна редактора библиотеки типов).
Итак, приступим к редактированию библиотеки типов. Предположим, что мы хотим автоматизировать загрузку файла в окно редактора, сохранение набранного текста,
очистку окна редактирования, определение и изменение ширины и параметров видимости формы, а также хотим узнать содержимое компонента Memo1.
Создадим также метод, добавляющий строку к редактируемому тексту. С этой целью опишем для нашего сервера методы FileNew, FileOpen, FileSave,
AddLine и их параметры, а также свойства Text, Width и Visible.
Отметим, что для описания параметров методов можно использовать синтаксис и типы данных IDL либо синтаксис и совместимые с СОМ типы данных Delphi. Для выбора
синтаксиса следует обратиться к странице Type Library диалогового окна Environment Options (открывается командой Tools | Environment Options) среды разработки
Delphi.
Рис.2. Страница Type Library
Отметим также, что наряду с типами данных IDL можно использовать все типы данных, определенные в самой библиотеке типов, а также в других библиотеках,
на которые она ссылается.
Наиболее часто используемые типы языка IDL приведены в таблице 1.
Таблица 1. Наиболее часто используемые типы языка IDL
Тип данных IDL | Тип данных Pascal | Описание |
---|---|---|
Short | ShortInt | Двухбайтовое целое число со знаком |
Long | LongInt | Четырехбайтовое целое число со знаком |
Single | Single | Четырехбайтовое действительное число |
Double | Double | Восьмибайтовое действительное число |
BSTR | WideString | Двоичная строка |
DATE | DATE | Дата |
VARIANT_BOOL | WordBool | Логическое значение (Тrue =-1, False = 0) |
VARIANT | OleVariant | Указатель на вариантную переменную |
Int | Integer | Целое (размер в байтах в общем случае зависит от разрядности операционной системы) |
Вернемся к описанию параметров методов нашего объекта автоматизации. Метод NewFile параметров не имеет. Методы OpenFile и SaveFile имеют один строковый параметр
типа BSTR (WideString) - имя файла. Метод AddLine также имеет один строковый параметр, задающий добавляемую строку. Свойство Text доступно для чтения и записи и
имеет тип BSTR (WideString). Свойство Visible имеет логический тип VARIANT_BOOL (WordBool) и тоже доступно для чтения и записи.
Свойство Width имеет целый тип long (integer), определяет число пикселей и также доступно как для чтения, так и для записи.
Для задания свойств и методов нужно выделить интерфейс ITest и воспользоваться кнопками, приведенными на рисунке 3.
Рис.3. Кнопки задания свойств и методов
Обратите внимание, что для каждого свойства сгенерирована пара методов: один для чтения свойства, а второй - для его изменения.
Описанный процесс создания методов можно увидеть
здесь (260 Кб), а взять этот клип здесь (43,6 Кб).
Описанный процесс создания свойств можно увидеть
здесь (533 Кб), а взять этот клип здесь (82,7 Кб).
После добавления всех свойств и методов библиотека типов должна выглядеть примерно так, как показано на рисунке 4.
Рис.4. Библиотека типов сервера автоматизации после описания свойств и методов объекта
Описав в библиотеке типов все параметры методов, можно приступить к их реализации.
На следующем шаге мы рассмотрим реализацию созданных методов.