Интернет-журнал "Домашняя лаборатория", 2007 №6
Шрифт:
После описания всех интерфейсов описывается библиотека типов (ключевое слово library). В качестве атрибутов для библиотеки типов задаются уникальный идентификатор (GUID, который можно получить с помощью guidgen.exe), номер версии и helpstring.
Оператор importlib ("stdole32.tlb") должен быть первым среди всех операторов библиотеки. Он задает импорт стандартной двоичной библиотеки типов stdole32.tlb.
Далее описываются все коклассы, включаемые в данный
В данном примере отражены далеко не все возможности языка IDL и некоторые из них будут обсуждены далее. А сейчас рассмотрим использование сформированного idl-файла.
Добавим файл PubInProcServerTypeInfo.idl В проект PubInProcServer и откомпилируем. В результате будут получены несколько файлов. Для сервера в процессе клиента, который мы реализуем в данное время, прокси и заглушка не нужны. В связи с этим включим в проект из всех файлов, сгенерированных транслятором MILD, только PubInProcServerTypeInfo.h, содержащий определения всех интерфейсов на С++/С, и файл PubInProcServerTypeInfo_i.с, содержащий определения уникальных идентификаторов для всех интерфейсов и коклассов.
Далее надо модифицировать часть файлов проекта. Прежде всего из проекта удаляются все ранее использовавшиеся файлы, определявшие интерфейсы и GUID. Это файлы IPub.h, IBook,h, IJournal.h, iid.h, iid.cpp. Во всех оставшихся файлах надо удалить ссылки на удаленные файлы. В файлы CоBооk.h, CоJournal.h надо добавить строку
#include "PubInProcServerTypeInfo.h"
Аналогичные изменения необходимо сделать в клиенте CoPubClient.
Последнее действие — добавление новых данных в реестр. Именно, надо зарегистрировать библиотеку типов — PubInProcServerTypeInfo.tlb. Для этого в реестр системы необходимо внести следующую информацию:
• Под ключом HKEY_CLASSES_ROOT TypeLib надо создать раздел
{68A702C2-8283-11d5-98C7-000001223694} — GUID библиотеки ТИПОВ.
• Для нового раздела создать подраздел 1.0 — номер версии. В качестве значения параметра по умолчанию можно взять название компонента — PubInProcServer.
• Для только что созданного раздела 1.0 создать подраздел 0 — идентификатор языка (естественного).
• Для только что созданного раздела 0 создать 3 подраздела:
? Win32 — в качестве значения параметра по умолчанию надо указать путь к библиотеке типов (к файлу PubInProcServerTypeInfo.tlb)
? FLAGS — значение параметра по умолчанию ''0"
? HELPSTRING — значение параметра по умолчанию — путь к файлу помощи (если таковой имеется)
• И последнее, ссылку на библиотеку типов надо разместить под ключами
НКЕY_CLASSЕS_ROOT CLSID {49F00760-7238-11d5-98С7-000001223694} и
НКЕY_CLASSЕS_ROOT CLSID {49F00761-7238-11d5-98C7-000001223694}.
Для этого под указанными ключами создаются разделы TypeLib, где в качестве значения параметра по умолчанию указывается GUID библиотеки типов для компонента, в котором размещены оба класса.
Теперь компонент, созданные в проекте PubInProcServer, включает библиотеку типов PubInPrосServerTуреInfj.tlb и, следовательно, может использоваться клиентами, реализованными на других языках, поддерживающих СОМ. Например, в Visual Basic достаточно установить ссылку на библиотеку типов нашего компонента и можно создавать экземпляры коклассов CоBооk и CоJournal, получая по умолчанию ссылки на интерфейсы IBook и IJournal.
Для проверки того, что сформированная библиотека типов PubInPrосServerTуреInfj.tlb действительно содержит всю информацию, содержавшуюся ранее в idl-файле PubIinProcServerTypeInfo.idl, можно воспользоваться OLE/COM Object Viewer, С ПОМОЩЬЮ которого МОЖНО увидеть все классы ИЗ компонента PubinProcServer, их интерфейсы, методы этих интерфейсов и их сигнатуры.
Далее надо иметь ввиду, что разработка любого компонента должна начинаться с формирования соответствующего idl-файла. Нарушение этого требования в данном случае определялось методическими задачами.
Библиотека типов доступна для чтения не только OLE/COM Object Viewer. Имеются интерфейсы ITypeLib и ITypeInfо с большим числом методов, с помощью которых можно получить любую информацию из зарегистрированной в реестре библиотеке типов.
Интерфейс ITypeLib используется при получении информации общего характера о библиотеке типов. Интерфейс ITypeInfо позволяет получить информацию о каждом отдельном объекте, описанном в библиотеке типов.
Рассмотрим следующую задачу — по заданному GUID библиотеки типов вывести описание (helpstring) для всех описанных в библиотеке объектов.
// test.срр — чтение библиотеки типов PublnProcServerTypelnfо. tlb
#include <iostream.h>
#include <windows.h>
const GUID LIBID_PubInProcServer =
{0x68A7 02C2, 0x828 3, 0x11D5,
{0x98, 0xC7, 0x00, 0x00, 0x01, 0x22, 0x36, 0x94}};
int main
{
int count;
HRESULT hr;