Шаг 30.
Серверы и контроллеры автоматизации. Библиотека типов

    На этом шаге мы рассмотрим создание библиотеки типов.

    Что представляет собой библиотека типов и зачем она нужна? По существу, библиотека типов - это двоичный файл с описанием интерфейсов СОМ-объекта и их методов. Обычно языком таких описаний является специальный язык 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. Библиотека типов сервера автоматизации после описания свойств и методов объекта

    Описав в библиотеке типов все параметры методов, можно приступить к их реализации.

    На следующем шаге мы рассмотрим реализацию созданных методов.




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