temp&latelt; классThreadModel >
класс CComObjectRootEx: государственные CComObjectRootBase
Параметры
ThreadModel
Класс, методы которого реализации желаемой модели потоков. Вы можете явно выбрать модель потоков, установив ThreadModel CComSingleThreadModel, CComMultiThreadModelили CComMultiThreadModelNoCS. Вы можете принять модель потоков сервера по умолчанию, установив ThreadModel CComObjectThreadModel или CComGlobalsThreadModel.
CComObjectRootEx обрабатывает объект ссылки граф управления для объектов неагрегированные и агрегированы. Он содержит счетчик ссылок объекта, если ваш объект не агрегируются и удерживает указатель внешнее неизвестного, если ваш объект агрегатом. Для агрегированных объектов CComObjectRootEx методы могут использоваться для обработки не внутреннего объекта строительства и защиты внешний объект от удаления, когда выпускаются внутренние интерфейсы или внутренний объект удаляется.
Класс, реализующий сервер COM должны наследовать от CComObjectRootEx или CComObjectRoot.
Если определение класса указывает макрос DECLARE_POLY_AGGREGATABLE , ATL создает экземпляр CComPolyObjectlt;CYourClass > при вызове IClassFactory::CreateInstance . Во время создания проверяется значение внешнее неизвестного. Если это значение NULL, для объекта неагрегированные реализован IUnknown . Если внешнее неизвестного не является NULL, Реализовано IUnknown для объекта агрегированных.
Если ваш класс не указан макрос DECLARE_POLY_AGGREGATABLE , ATL создает экземпляр CComObjectlt;CYourClass > для агрегированных объектов или экземпляра CComAggObject <CYourClass> для неагрегированные объектов.
Преимуществом использования CComPolyObject является, что вам избежать CComAggObject и CComObject в вашем модуле для обработки агрегированных и неагрегированные случаев. Объект CComPolyObject обрабатывает обоих случаях. Таким образом в вашем модуле существует только одна копия vtable и одну копию функций. Если ваш vtable большой, это может существенно уменьшить размер вашего модуля. Однако если ваш vtable невелико, использование CComPolyObject может привести к несколько больших размеров модуль потому, что он не оптимизирован для объекта агрегированных или неагрегированные, как CComAggObject и CComObject.
DECLARE_POLY_AGGREGATABLE макрос автоматически добавляется к определению класса объекта мастером ATL при создании полного контроля или управления Internet Explorer.
Если ваш объект агрегатом, IUnknown осуществляется CComAggObject или CComPolyObject. Эти классы делегировать QueryInterface, AddRefи выпуска вызовы, CComObjectRootEx OuterQueryInterface, OuterAddRefи OuterRelease направить внешнее неизвестного. Как правило можно переопределить CComObjectRootEx::FinalConstruct в вашем классе для создания любых агрегированных объектов и переопределить CComObjectRootEx::FinalRelease освободить агрегированные объекты.
Если ваш объект не агрегатом, IUnknown осуществляется CComObject или CComPolyObject. В этом случае вызовы QueryInterface, AddRefи выпуска делегированы, CComObjectRootEx InternalQueryInterface, InternalAddRefи InternalRelease для выполнения фактических операций.
# include lt;atlcom.h>
См. также CComAggObject, CComObject, CComPolyObject