Атрибут helpstring позволяет приписать описываемому интерфейсу некоторую строку, которая будет храниться в библиотеке
типов и может использоваться различными программами для представления пользователю информации о семантике данного
интерфейса.
При описании методов интерфейсов используются атрибуты
in, out, retval, позволяющие указать направление передачи
значения параметра. Атрибут
in назначается по умолчанию и означает, что значение данного параметра передается серверу.
Напротив, атрибут
out говорит о необходимости передачи значения параметра клиенту. Атрибут retval означает, что для
данный параметр является возвращаемым значением для соответствующей функции при использовании, например, Visual Basic.
Указание этих атрибутов (возможны их сочетания) оптимизирует трафик в сети при выполнении удаленного вызова процедур.
После описания всех интерфейсов описывается библиотека типов (ключевое слово
library). В качестве атрибутов для
библиотеки типов задаются уникальный идентификатор (GUID, который можно получить с помощью
guidgen.exe), номер
версии и
helpstring.
Оператор
importlib("stdole32.tlb") должен быть первым среди всех операторов библиотеки. Он задает импорт стандартной
двоичной библиотеки типов
stdole32.tlb.
Далее описываются все коклассы, включаемые в данный компонент. Для каждого кокласса с помощью атрибута
uuid задается его
GUID и перечисляются все его интерфейсы (последние в иерархии интерфейсов). Один из интерфейсов каждого кокласса
объявляется как интерфейс по умолчанию (с помощью атрибута default). Это необходимо для Visual Basic. При инициализации
экземпляра данного класса именно ссылка на интерфейс по умолчанию будет возвращена клиенту. При отсутствии атрибута
default, интерфейсом по умолчанию становится первый интерфейс в списке интерфейсов данного кокласса.
В данном примере отражены далеко не все возможности языка IDL и некоторые из них будут обсуждены далее. А сейчас
рассмотрим использование сформированного idl-файла.
Добавим файл
PubInProcServerTypeInfo.idl в проект PubInProcServer и откомпилируем. В результате будут получены
несколько файлов. Для сервера в процессе клиента, который мы реализуем в данное время, прокси и заглушка не нужны. В связи
с этим включим в проект из всех файлов, сгенерированных транслятором MILD, только PubInProcServerTypeInfo.h,
содержащий определения всех интерфейсов на C++/C, и файл
PubInProcServerTypeInfo_i.c, содержащий определения уникальных идентификаторов для всех интерфейсов и коклассов.
Далее надо модифицировать часть файлов проекта. Прежде всего из проекта удаляются все ранее использовавшиеся файлы,
определявшие интерфейсы и GUID. Это файлы
IPub.h, IBook.h, IJournal.h, iid.h, iid.cpp. Во всех оставшихся файлах
надо удалить ссылки на удаленные файлы. В файлы
CoBook.h, CoJournal.h надо добавить строку
#include "PubInProcServerTypeInfo.h"
Аналогичные изменения необходимо сделать в клиенте CoPubClient.
Последнее действие - добавление новых данных в реестр. Именно, надо зарегистрировать библиотеку типов -
PubInProcServerTypeInfo.tlb. Для этого в реестр системы необходимо внести следующую информацию:
z Под ключом HKEY_CLASSES_ROOT TypeLib надо создать раздел
{68A702C2-8283-11d5-98C7-000001223694} - GUID библиотеки типов.
z Для нового раздела создать подраздел 1.0 - номер версии. В качестве значения параметра по умолчанию можно взять
название компонента -
PubInProcServer.
z Для только что созданного раздела 1.0 создать подраздел 0 - идентификатор языка (естественного).
z Для только что созданного раздела 0 создать 3 подраздела:
{ Win32 - в качестве значения параметра по умолчанию надо указать путь к библиотеке типов (к файлу
PubInProcServerTypeInfo.tlb)
{ FLAGS - значение параметра по умолчанию ``0''
{ HELPSTRING - значение параметра по умолчанию - путь к файлу помощи (если таковой имеется)
z И последнее, ссылку на библиотеку типов надо разместить под ключами
HKEY_CLASSES_ROOT CLSID {49F00760-7238-11d5-98C7-000001223694} и
HKEY_CLASSES_ROOT CLSID {49F00761-7238-11d5-98C7-000001223694}. Для этого под указанными ключами создаются
разделы
TypeLib, где в качестве значения параметра по умолчанию указывается GUID библиотеки типов для компонента, в
котором размещены оба класса.
Теперь компонент, созданные в проекте
PubInProcServer, включает библиотеку типов PubInProcServerTypeInfo.tlb и,
следовательно, может использоваться клиентами, реализованными на других языках, поддерживающих COM. Например, в Visual
Basic достаточно установить ссылку на библиотеку типов нашего компонента и можно создавать экземпляры коклассов CoBook и
CoJournal, получая по умолчанию ссылки на интерфейсы IBook и IJournal.
Для проверки того, что сформированная библиотека типов
PubInProcServerTypeInfo.tlb действительно содержит всю информацию, содержавшуюся ранее в idl-файле
PubInProcServerTypeInfo.idl, можно воспользоваться OLE/COM Object Viewer, с помощью которого можно увидеть все классы
из компонента
PubInProcServer, их интерфейсы, методы этих интерфейсов и их сигнатуры.
Далее надо иметь ввиду, что разработка любого компонента должна начинаться с формирования соответствующего idl-файла.
Нарушение этого требования в данном случае определялось методическими задачами.
Библиотека типов доступна для чтения не только OLE/COM Object Viewer. Имеются интерфейсы
ITypeLib и ITypeInfo с