Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Роджерсон Д. - Основы COM - 2000.pdf
Скачиваний:
412
Добавлен:
13.08.2013
Размер:
2.4 Mб
Скачать

145

Think();

// Освободить библиотеку COM

CoUninitialize();

return 0;

}

Листинг 9-2 Клиент 2 использует класс smart-указателей на интерфейсы IPtr

Обратите внимание, как в примере обрабатываются возможные ошибки инкапсулированных QueryInterface. Для проверки успешного завершения мы используем функцию преобразования в тип BOOL, которая возвращает TRUE, если IPtr::m_p есть не NULL. Для проверки на ошибку применяется operator!.

Проблемы smart-указателей

Большинство этих проблем незначительно. Вам необходимо избегать вызова Release для smart-указателей на интерфейсы. Доступ к методам класса smart-указателя осуществляется с помощью «точки», а не «стрелки», которая используется для доступа к методам интерфейса. Все эти проблемы компенсируются необычайной гибкостью классов smart-указателей. Вы можете написать один такой класс, который будет работать для всех интерфейсов (кроме IUnknown).

Однако это свойство smart-указателей является их универсальны, что инкапсулируют не используемый интерфейс. Для большинства простых интерфейсов инкапсулировать сам интерфейс.

главным недостатком. Smart-указатели настолько Вами интерфейс, но использование указателей на это идеально. Но в некоторых случаях лучше

Классы-оболочки C++

Smart-указатели прекрасно подходят, когда Вы хотите инкапсулировать группу интерфейсов. Для инкапсуляции конкретного интерфейса используйте класс-оболочку С++. Класс-оболочка (wrapper class) — это просто клиент одного или нескольких интерфейсов СОМ, предоставляющий абстракцию использования этих интерфейсов. Ваша программа вызывает методы класса-оболочки, которые вызывают методы интерфейса СОМ. Классыоболочки упрощают вызовы интерфейсов СОМ, подобно тому, как классы-оболочки MFC упрощают работу с

Win32 (рис. 9-2).

Важнейшая отличительная черта классов-оболочек — то, что они могут использовать такие средства С++, как совмещение имен функций, совмещение операторов и параметры по умолчанию; благодаря этому программиста на С++ может работать с классами-оболочками привычным способом. В Visual C++ имеется инструмент, автоматически генерирующий классы-оболочки для управляющих элементов ActiveX и многих других компонентов СОМ.

Клиент

 

 

Код клиента

Указатели на

Компонент

Методы

интерфейсы

 

 

m_pIX

IX

Код клиента

 

 

вызывает методы,

m_pIY

IY

которые работают

с интерфейсами

 

 

непосредственно

 

 

 

m_pIZ

IZ

Рис. 9-2 Классы-оболочки могут инкапсулировать интерфейсы компонента и значительно облегчить работу с ним

Классы-оболочки — аналог включения…

В отличие от smart-указателей, классы-оболочки должны повторно реализовывать все функции интерфейсов, оболочками которых они являются — даже в том случае, если они не добавляют к самим интерфейсам никакой новой функциональности. Другое существенное различие между классами-оболочками и smart-указателями — то, что первые могут добавить новый код перед вызовом функции интерфейса и после него. Если Вы сравните это с приемами повторного применения компонентов из предыдущей главы, то станет очевидно, что классы-оболочки являются аналогами включения, тогда как smart-указатели — агрегирования.

Соседние файлы в предмете Программирование на C++