Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы Мартын 1(ComCorbaLab2004).doc
Скачиваний:
30
Добавлен:
10.02.2016
Размер:
1.81 Mб
Скачать

1.7.2 Регистрация компонентов

Перед использованием компонентов их нужно зарегистрировать в системе. Обычно регистрация выполняется автоматически при инсталляции программы или на этапе сборки программы при ее разработке в Visual C++. Если скомпилировать проект, содержащий демонстрационные компоненты, Visual C++ сам зарегистрирует компоненты на заключительном этапе сборки приложения. Однако, если когда-либо понадобится самостоятельно зарегистрировать компонент, содержащийся в библиотеке DLL, нужно будет просто запустить утилиту Windows regsvr32.exe и указать в командной строке путь к DLL-файлу. Например, если взять файл DemoComponents.dll и расположить его в папке C:\MyComponents, то можно зарегистрировать его, набрав в командной строке:

c:\windows\system\regsvr32 c:\mycomponents\democomponents.dll

(подразумевается, что Windows установлена в каталог C:\Windows).

Можно также отменить регистрацию компонента и удалить записи о нем из реестра, запустив regsvr32.exe с ключом -u, предваряющим путь к библиотеке, содержащей компоненты.

Если воспроизводится анализ демонстрационной программы, то надо откомпилировать проект DemoComponents, чтобы создать и зарегистрировать в системе используемые компоненты.

1.7.3 Импортирование библиотеки типов

Первый шаг интеграции COM-компонента в приложение состоит в обеспечении приложения достаточным количеством информации для создания компонента. Это можно сделать включением файла заголовков, содержащего глобально уникальные идентификаторы компонента (GUID) и определения классов интерфейсов. Но все же лучше использовать по отношению к библиотеке типов директиву #import, которая сделает то же самое, но кроме этого сгенерирует еще и классы-оболочки для интерфейсов.

Сложным моментом в этом процессе может стать поиск импортируемых компонентов или библиотек. Это не составит труда, если компонент разрабатывался самостоятельно, поскольку библиотека является частью проекта. А вот если, к примеру, нужно импортировать библиотеку типов Microsoft Outlook, найти ее не так просто. Один простых методов поиска нужной информации заключается в использовании программы OLE/COM Object Viewer, которая входит в комплект поставки Visual C++. Эта программа поможет обнаружить компоненты, интерфейсы и библиотеки типов, а также укажет путь к файлам библиотек, если только компоненты были зарегистрированы в системе. Чтобы импортировать информацию о компонентах из библиотеки типов, нужно добавить в начало файла заголовков DemoView.h строку

#import "..\DemoComponents\DemoComponents.tlb" no_namespace

Для указания пути используются те же соглашения, что для директивы #include, и в данном случае подразумевается, что папка проекта DemoComponents содержится в том же каталоге, что и папка проекта DemoClient. Библиотеки типов содержатся либо в отдельном файле TLB, либо в библиотеке DLL. Атрибут no_namespace указывает компилятору игнорировать любое определение пространства имен из библиотеки. Определения в большинстве библиотек заключаются в свои пространства имен с тем, чтобы избежать конфликтов имен с другими определениями в текущем пространстве имен. Директиву no_namespace можно использовать, если есть уверенность в отсутствии конфликтов определений; в противном случае можно использовать директиву rename_attribute для переименования конфликтующих определений. Подробнее о всех возможностях можно прочитать в разделе MSDN, посвященном #import.

После того, как импортирована информация из библиотек типов и откомпилирован проект, компилятор попытается прочесть информацию из указанного файла. Если эта операция выполнится успешно, он сгенерирует классы оболочки, основанные на шаблоне _com_ptr_t<>, для интерфейсов, определенных в библиотеке типов. Эта информация будет размещена в двух файлах: файле заголовков с расширением TLH и файле реализации с расширением TLI. Эти файлы неявно включаются в проект в области видимости директивы #import, так что можно использовать сгенерированные классы. Возможно также явно подключить файл TLH, если надо, чтобы сгенерированные классы отображались в окне ClassView. Если используется Visual C++ 6.0 или более поздний, информация о сгенерированных классах будет сохранена в проекте. В результате об этих классах узнает IntelliSense и сможет показывать подсказки для методов и свойств членов интерфейсов и для параметров методов во время их ввода. Он также добавляет определения в сгенерированный TLH-файл заголовков с тем, чтобы можно было использовать имена компонентов и интерфейсов вместо их GUID для таких методов, как CWnd::CreateControl().

Применительно к данным демонстрационным компонентам, после компиляции проекта созданы классы-оболочки для интерфейсов IDemoModelPtr, IDemoViewPtr, IDemoControllerPtr, IDemoModelConnectionPtr и _IDemoControllerEventsPtr. Название каждого сгенерированного класса содержит название интерфейса, к которому добавлено окончание "Ptr". Интерфейсы IDemoModelConnection и _IDemoControllerEvents - исходящие (outgoing), так что это просто базовые классы, в использовании которых напрямую особого смысла нет. Далее рассмотрено как при помощи остальных трех классов-оболочек получить доступ к методам интерфейсов, и как использовать два оставшихся интерфейса.