Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Библиотека активных шаблонов (ATL) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Классы шаблонов CComObject, CComAggObject и CComPolyObject всегда являются наиболее производными классами в цепочке наследования. Это их ответственность за обработку всех методов в IUnknown: QueryInterface, AddRefи Release. Кроме того, CComAggObject и CComPolyObject (при использовании для агрегированных объектов) предоставляют специальное подсчет ссылок и QueryInterface семантику, необходимые для внутреннего неизвестного.
Использование CComObject, CComAggObject или CComPolyObject зависит от того, объявляете ли вы один из следующих макросов (или ни одного):
| Макрос | Действие |
|---|---|
| DECLARE_NOT_AGGREGATABLE | Всегда используется CComObject. |
| ОБЪЯВЛЕНИЕ_АГРЕГАТИРУЕМОСТИ | Используется CComAggObject , если объект агрегирован и CComObject если он отсутствует.
CComCoClass содержит этот макрос, поэтому, если в вашем классе ни один из макросов DECLARE_*_AGGREGATABLE не объявлен, будет использоваться он по умолчанию. |
| DECLARE_ONLY_AGGREGATABLE | Всегда используется CComAggObject. Возвращает ошибку, если объект не агрегирован. |
| DECLARE_POLY_AGGREGATABLE | ATL создает экземпляр CComPolyObject<CYourClass> при вызове IClassFactory::CreateInstance. Во время создания проверяется значение внешней переменной с неизвестным значением. Если значение NULL, IUnknown реализуется для негрегатированного объекта. Если внешний неизвестный не имеет значения NULL, IUnknown реализуется для агрегированного объекта. |
Преимущество использования CComAggObject и CComObject заключается в том, что реализация IUnknown оптимизирована для типа создаваемого объекта. Например, негрегатированный объект нуждается только в подсчете ссылок, в то время как агрегатный объект нуждается как в счетчике ссылок для внутреннего неизвестного, так и указателя на внешний неизвестный.
Преимущество использования CComPolyObject заключается в том, что вы избегаете использования как CComAggObject в модуле, так и CComObject в модуле для обработки агрегированных и негрегатированных случаев. Один CComPolyObject объект обрабатывает оба случая. Это означает, что в модуле существует только одна копия vtable и одна копия функций. Если ваша vtable большая, это может существенно уменьшить размер вашего модуля. Тем не менее, если ваша vtable небольшая, использование CComPolyObject может привести к немного большему размеру модуля, так как он не оптимизирован для агрегированного или негрегатированного объекта, как и CComAggObjectCComObject .
См. также
Основы COM-объектов ATL
Макросы агрегирования и фабрики классов