Поделиться через


Класс CComPolyObject

Этот класс реализует IUnknown для агрегированного или негрегатированного объекта.

Синтаксис

template<class contained>
class CComPolyObject : public IUnknown,
      public CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>

Параметры

содержащийся
Класс, производный от CComObjectRoot или CComObjectRootEx, а также от любых других интерфейсов, которые требуется поддерживать в объекте.

Участники

Открытые конструкторы

Имя Описание
CComPolyObject::CComPolyObject Конструктор.
CComPolyObject::~CComPolyObject Деструктор

Открытые методы

Имя Описание
CComPolyObject::AddRef Увеличивает число ссылок объекта.
CComPolyObject::CreateInstance (статический) Позволяет создать новый объект CComPolyObject contained ><без дополнительных расходов CoCreateInstance.
CComPolyObject::FinalConstruct Выполняет окончательную инициализацию m_contained.
CComPolyObject::FinalRelease Выполняет окончательное m_containedуничтожение .
CComPolyObject::QueryInterface Извлекает указатель на запрошенный интерфейс.
CComPolyObject::Release Уменьшает количество ссылок объекта.

Открытые члены данных

Имя Описание
CComPolyObject::m_contained Делегирует IUnknown вызовы внешнему неизвестному, если объект агрегирован или IUnknown объекту, если объект не агрегирован.

Замечания

CComPolyObjectреализует IUnknown для агрегированного или негрегатированного объекта.

При создании экземпляра CComPolyObject проверяется значение внешнего неизвестного. Если значение NULL, IUnknown реализуется для негрегатированного объекта. Если внешний неизвестный не имеет значения NULL, IUnknown реализуется для агрегированного объекта.

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

Если макрос DECLARE_POLY_AGGREGATABLE указан в определении класса объекта, CComPolyObject будет использоваться для создания объекта. DECLARE_POLY_AGGREGATABLE автоматически объявляется, если вы используете мастер проектов ATL для создания полного элемента управления или элемента управления Internet Explorer.

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

Дополнительные сведения об агрегации см. в статье "Основы COM-объектов ATL".

Иерархия наследования

CComObjectRootBase

CComObjectRootEx

IUnknown

CComPolyObject

Требования

Заголовок: atlcom.h

CComPolyObject::AddRef

Увеличивает число ссылок для объекта.

STDMETHOD_(ULONG, AddRef)();

Возвращаемое значение

Значение, которое может быть полезно для диагностика или тестирования.

CComPolyObject::CComPolyObject

Конструктор.

CComPolyObject(void* pv);

Параметры

pv
[in] Указатель на внешний неизвестный, если объект должен быть агрегирован, или ЗНАЧЕНИЕ NULL, если объект не агрегирован.

Замечания

Инициализирует CComContainedObjectэлемент данных,m_containedиувеличиваетсчетчикблокировок модуля.

Деструктор уменьшает число блокировок модуля.

CComPolyObject::~CComPolyObject

Деструктор

~CComPolyObject();

Замечания

Освобождает все выделенные ресурсы, вызывает FinalRelease и уменьшает число блокировок модуля.

CComPolyObject::CreateInstance

Позволяет создать новый объект CComPolyObjectcontained>< без дополнительных расходов CoCreateInstance.

static HRESULT WINAPI CreateInstance(
    LPUNKNOWN pUnkOuter,
    CComPolyObject<contained>** pp);

Параметры

pp
[out] Указатель на указатель CComPolyObject><contained. Если CreateInstance ошибка не выполнена, для pp задано значение NULL.

Возвращаемое значение

Стандартное значение HRESULT.

Замечания

Возвращенный объект имеет число ссылок нулю, поэтому вызов AddRef немедленно используйте Release для освобождения ссылки на указатель объекта после завершения.

Если вам не нужен прямой доступ к объекту, но по-прежнему требуется создать новый объект без дополнительных CoCreateInstanceзатрат, используйте CComCoClass::CreateInstance .

CComPolyObject::FinalConstruct

Вызывается во время последних этапов построения объекта, этот метод выполняет любую окончательную инициализацию элемента данных m_contained .

HRESULT FinalConstruct();

Возвращаемое значение

Стандартное значение HRESULT.

CComPolyObject::FinalRelease

Вызывается во время уничтожения объекта, этот метод освобождает элемент данных m_contained .

void FinalRelease();

CComPolyObject::m_contained

Объект CComContainedObject, производный от класса.

CComContainedObject<contained> m_contained;

Параметры

содержащийся
[in] Класс, производный от CComObjectRoot или CComObjectRootEx, а также от любых других интерфейсов, которые требуется поддерживать в объекте.

Замечания

IUnknownm_contained вызовы делегируются внешнему неизвестному, если объект агрегирован или IUnknown объекту, если объект не агрегирован.

CComPolyObject::QueryInterface

Извлекает указатель на запрошенный интерфейс.

STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);
template <class Q>
HRESULT QueryInterface(Q** pp);

Параметры

Q
COM-интерфейс.

iid
[in] Идентификатор запрашиваемого интерфейса.

ppvObject
[out] Указатель на указатель интерфейса, определяемый iid. Если объект не поддерживает этот интерфейс, ppvObject имеет значение NULL.

pp
[out] Указатель на интерфейс, определенный по __uuidof(Q).

Возвращаемое значение

Стандартное значение HRESULT.

Замечания

Если запрошенный интерфейс имеет IUnknownагрегированный объект, QueryInterface возвращает указатель на собственный IUnknown агрегированный объект и увеличивает число ссылок. В противном случае этот метод запрашивает интерфейс через CComContainedObject элемент данных m_contained.

CComPolyObject::Release

Уменьшает количество ссылок для объекта.

STDMETHOD_(ULONG, Release)();

Возвращаемое значение

В отладочных сборках Release возвращает значение, которое может быть полезно для диагностика или тестирования. В сборках, отличных от примеси, Release всегда возвращается значение 0.

См. также

Класс CComObjectRootEx
DECLARE_POLY_AGGREGATABLE
Общие сведения о классе