Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Этот класс реализует 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
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
Общие сведения о классе