Реализация CComObject, CComAggObject и CComPolyObject

Классы-шаблоны, CComObject, CComAggObjectи CComPolyObject всегда являются наиболее производные классы в цепочке наследования. Это их обязанность обрабатывать все методы IUnknown: QueryInterface, AddRefи выпуска. Кроме того CComAggObject и CComPolyObject (при использовании для агрегированных объектов) обеспечивают подсчет специальных ссылок и семантика QueryInterface для внутренней неизвестно.

Используется ли CComObject, CComAggObjectили CComPolyObject зависит от ли вы объявить макро DECLARE_POLY_AGGREGATABLE и ли ваш объект агрегатом:

Преимуществом использования CComAggObject и CComObject является, что осуществление IUnknown оптимизирован для типа создаваемого объекта. К примеру неагрегированные объекта требуется только счетчик ссылок, в то время как агрегированных объект должен счетчик ссылок для внутренней неизвестного и указатель на внешнее неизвестного.

Преимуществом использования CComPolyObject является, что вам избежать CComAggObject и CComObject в вашем модуле для обработки агрегированных и неагрегированные случаев. Объект CComPolyObject обрабатывает обоих случаях. Это означает, что только одна копия vtable и один экземпляр функции существуют в вашем модуле. Если ваш vtable большой, это может существенно уменьшить размер вашего модуля. Однако если ваш vtable невелико, использование CComPolyObject может привести к несколько больших размеров модуль потому, что он не оптимизирован для объекта агрегированных или неагрегированные, как CComAggObject и CComObject.

DECLARE_POLY_AGGREGATABLE макрос автоматически добавляется к определению класса объекта мастером ATL при создании полного контроля или управления Internet Explorer. Для получения дополнительных сведений о мастере см. Создание проекта ATL.

Index