Класс 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
может привести к немного большему размеру модуля, так как он не оптимизирован для агрегированного или негрегатированного объекта, как и CComObject
CComAggObject
.
Если макрос DECLARE_POLY_AGGREGATABLE указан в определении класса объекта, CComPolyObject
будет использоваться для создания объекта. DECLARE_POLY_AGGREGATABLE автоматически объявляется, если вы используете мастер проектов ATL для создания полного элемента управления или элемента управления Internet Explorer.
При агрегированной CComPolyObject
обработке объект имеет свой собственный IUnknown
, отдельный от внешнего объекта IUnknown
, и поддерживает собственный счетчик ссылок. CComPolyObject
использует CComContainedObject для делегирования внешнему неизвестному объекту.
Дополнительные сведения об агрегации см. в статье "Основы COM-объектов ATL".
Иерархия наследования
CComObjectRootBase
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, а также от любых других интерфейсов, которые требуется поддерживать в объекте.
Замечания
IUnknown
m_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
Общие сведения о классе