Вход/Регистрация
Интернет-журнал "Домашняя лаборатория", 2007 №6
вернуться

Журнал «Домашняя лаборатория»

Шрифт:

• И последнее, ссылку на библиотеку типов надо разместить под ключами

НКЕ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;

char* pszName, *pszDoc;

BSTR bstrName, bstrDocString;

ITypeLib* pTypeLib;

CoInitialize(NULL);

hr=LoadRegTypeLib(LIBID_PubInProcServer, 1, 0, LANG_NEUTRAL, &pTypeLib);

if(SUCCEEDED(hr))

{

count = pTypeLib —> GetTypeInfoCount;

for (int index=-1; index < count; index++)

{

hr = pTypeLib —> GetDocumentation(index,&bstrName, &bstrDocString, NULL, NULL);

if (SUCCEEDED(hr))

{

pszName = (char*)malloc(2*SysStringLen(bstrName));

wcstombs(pszName, bstrName, 2*SysStringLen(bstrName));

cout << index << ": " << pszName;

free(pszName);

if (SysStringLen(bstrDocString) > 0)

{

pszDoc = (char*)malloc(2*SysStringLen(bstrDocString));

wcstombs(pszDoc, bstrDocString, 2*SysStringLen(bstrDocString));

cout <<": " << pszDoc;

free(pszDoc);

}

cout << endl;

SysFreeString(bstrName);

SysFreeString(bstrDocString);

}

}

pTypeLib — > Release ;

}

CoUnitialize ;

return 0;

}

Для определенности рассматривается библиотека типов, сформированная по IDL-файлу PubInProcServerTypeInfo.idl. В константе LIBID_PubinProcServer задается GUID данной библиотеки типов.

Функция LoadRegTypeLib загружает библиотеку типов с заданным GUID и, в случае успеха, в параметре pTypeLib возвращает указатель на интерфейс iTypeLib. В данном случае нам достаточно этого интерфейса, так как интересующая нас информация является информацией общего характера о библиотеке типов. Второй (старший номер версии) и третий (младший номер версии) параметры определяют ограничения на номер версии загружаемой библиотеки типов: загружается библиотека с указанной версией; если такой нет, то загружается библиотека, у которой старший номер версии равен запрашиваемому, а младший — максимальный из доступных и не меньше запрашиваемого. Если данное ограничение не выполняется, то возвращается ошибка. Четвертый параметр в данном случае указывает на то, что при построении описания библиотеки использовался нейтральный естественный язык.

В регистре всему этому соответствует ключ

НКЕ Y_CLASSЕS_ROOT TipeLib

{68A702C2-8283-22d5-98C7-000001223694} 1.0 0 Win32

значением которого является путь К файлу PubInProcServerTypeInfo.tlb.

В данной программе вызываются всего два метода из всего множества методов интерфейса ITypeLib:

• GetTypeInfoCount

Возвращает число описаний типов в библиотеке

• GetDocumentation

  • Читать дальше
  • 1
  • ...
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: