Одной из проблем, возникающих перед программистом во время изучения нового компонента, становится поиск поясняющей документации. Переливающийся всеми цветами радуги программный продукт может оказаться бесполезным, если мы не понимаем, как с ним обращаться. Так, при разработке любого COM-проекта необходимо учесть, что клиентское приложение должно владеть полной информацией об интерфейсной части COM-сервера, иначе оно не сможет воспользоваться его услугами. В частности клиент COM должен знать:
• перечень COM-объектов, инкапсулированных в сервере;
• список интерфейсов, поддерживаемых каждым из объектов;
• состав функций в каждом из интерфейсов;
• перечень аргументов функций.
Наилучшим хранилищем знаний такого рода считается библиотека типов. Библиотека типов не является обязательной частью компонента COM, но она может значительно упростить работу пользователя COM-объекта, особенно если речь идет о компоненте, созданном сторонним производителем на другом языке программирования. Кроме того, помимо справочной информации на основании данных из библиотеки могут генерироваться необходимые заголовочные файлы.
Среда программирования Delphi вооружена утилитой - редактором библиотеки типов. Для вызова редактора в главном меню Delphi воспользуйтесь пунктом View - Type Library. Если вернуться к нашему примеру, то после обращения к редактору в дереве объектов библиотеки типов мы увидим два объекта: интерфейс IMyComObject и описание будущего COM-объекта - класс MyComObject.
Посмотрим, какую помощь может оказать библиотека типов при создании нового метода. Допустим, мы хотим описать метод, получающий два значения и возвращающий результат их сложения:
function Sum(Value1, Value2:
out Res: OleVariant): HResult;
Integer;
Выделите узел интерфейса IMyComObject и нажмите кнопку New Method. Под узлом IMyComObject появится дочерний элемент - прототип будущей функции. Переименуйте этот элемент в «Sum» - название новой функции. Для нового метода системой сразу назначается новый идентификатор ID = 101 (страница атрибутов метода Attributes). Для определения параметров перейдите на страницу Parameters. Используя кнопку Add, добавьте три строки с параметрами функции (рис. 24.6). Обратите внимание, что результат сложения мы возвращаем в третий выходной параметр Res. Сам метод возвращает значение типа HResult.
ОВне зависимости от решаемых задач все COM-методы должны возвращать значение типа HRESULT. Этот тип данных определен в модулях System, Types и Windows.
type HRESULT = type Longint;
В случае успешного завершения метод вернет S_OK. Значение S_FALSE свидетельствует о том, что метод не может выполнить операцию. Если интерфейс не поддерживается, будет возвращена константа E_INTERFACE. Катастрофическая ошибка -константа EUNEXPECTED и т. д.
На панели управления редактора нажмите кнопку Refresh Implementation и взгляните на модуль MyComObj. В секции protected листинга появилось объявление нашей новой функции, а в секции implementation описана заготовка ее реализации. Нам остается добавить лишь одну-единственную строку:
Res:=Value1+Value2;.
Научившись описывать методы, попробуем свои силы на свойствах. Допустим, требуется объявить новое свойство, способное обслуживать целочисленное значение. Чтобы определить новое свойство, в редакторе библиотеки типов выделите узел с интерфейсом IMyComObject и на панели управления нажмите кнопку New Property. В результате будут созданы два новых одноименных узла Property1. Такое раздвоение свойства объясняется тем, что один из узлов отвечает за чтение данных из свойства, а второй узел решает обратную задачу - записывает в свойство данные.
Переименуйте любой из узлов нового свойства, например в MyProperty. Тип данных, описываемых свойством, определяется на странице Attributes в ниспадающем списке Type. Для решения нашей задачи подойдет значение по умолчанию - целое число long.