На этом шаге мы рассмотрим создание библиотеки типов.
Что представляет собой библиотека типов и зачем она нужна? По существу, библиотека типов - это двоичный файл с описанием интерфейсов СОМ-объекта и их методов. Обычно языком таких описаний является специальный язык 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.
Тип данных IDL | Тип данных Pascal | Описание |
---|---|---|
Двухбайтовое целое число со знаком | ||
Четырехбайтовое целое число со знаком | ||
Четырехбайтовое действительное число | ||
Восьмибайтовое действительное число | ||
Двоичная строка | ||
Дата | ||
Логическое значение (Тrue =-1, False = 0) | ||
Указатель на вариантную переменную | ||
Целое (размер в байтах в общем случае зависит от разрядности операционной системы) |
Вернемся к описанию параметров методов нашего объекта автоматизации. Метод 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. Библиотека типов сервера автоматизации после описания свойств и методов объекта
Описав в библиотеке типов все параметры методов, можно приступить к их реализации.
На следующем шаге мы рассмотрим реализацию созданных методов.