Freigeben über


CComPolyObject-Klasse

Diese Klasse implementiert IUnknown ein aggregiertes oder nicht aggregiertes Objekt.

Syntax

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

Parameter

enthalten
Ihre Von CComObjectRoot oder CComObjectRootEx abgeleitete Klasse sowie alle anderen Schnittstellen, die Sie für das Objekt unterstützen möchten.

Member

Öffentliche Konstruktoren

Name Beschreibung
CComPolyObject::CComPolyObject Der Konstruktor.
CComPolyObject::~CComPolyObject Der Destruktor.

Öffentliche Methoden

Name Beschreibung
CComPolyObject::AddRef Erhöht die Referenzanzahl des Objekts.
CComPolyObject::CreateInstance (Statisch) Ermöglicht ihnen das Erstellen eines neuen CComPolyObject-Objekts contained ><ohne den Aufwand von CoCreateInstance.
CComPolyObject::FinalConstruct Führt die endgültige Initialisierung von m_contained.
CComPolyObject::FinalRelease Führt die endgültige Zerstörung von m_contained.
CComPolyObject::QueryInterface Ruft einen Zeiger auf die angeforderte Schnittstelle ab.
CComPolyObject::Release Erhöht die Referenzanzahl des Objekts.

Öffentliche Datenmember

Name Beschreibung
CComPolyObject::m_contained Delegiert Aufrufe IUnknown an das äußere Unbekannte, wenn das Objekt aggregiert oder an das IUnknown Objekt aggregatiert wird, wenn das Objekt nicht aggregiert wird.

Hinweise

CComPolyObjectimplementiert IUnknown für ein aggregiertes oder nicht aggregiertes Objekt.

Wenn eine Instanz erstellt CComPolyObject wird, wird der Wert des äußeren Unbekannten überprüft. Wenn es NULL ist, IUnknown wird für ein nicht aggregiertes Objekt implementiert. Wenn das äußere Unbekannte nicht NULL ist, IUnknown wird für ein aggregiertes Objekt implementiert.

Der Vorteil der Verwendung CComPolyObject besteht darin, dass Sie sowohl CComAggObject als auch CComObject in Ihrem Modul vermeiden, um die aggregierten und nicht aggregierten Fälle zu verarbeiten. Ein einzelnes CComPolyObject Objekt behandelt beide Fälle. Dies bedeutet, dass nur eine Kopie der vtable und eine Kopie der Funktionen in Ihrem Modul vorhanden ist. Wenn die vtable groß ist, kann dies die Modulgröße erheblich verringern. Wenn die vtable jedoch klein ist, kann die Verwendung CComPolyObject zu einer etwas größeren Modulgröße führen, da sie nicht für ein aggregiertes oder nicht aggregiertes Objekt optimiert ist, wie es sind CComAggObject und CComObject.

Wenn das DECLARE_POLY_AGGREGATABLE Makro in der Klassendefinition des Objekts angegeben ist, CComPolyObject wird das Objekt erstellt. DECLARE_POLY_AGGREGATABLE wird automatisch deklariert, wenn Sie den ATL-Projekt-Assistenten verwenden, um ein Vollzugriffs- oder Internet Explorer-Steuerelement zu erstellen.

Bei aggregierter Aggregatfunktion verfügt das CComPolyObject Objekt über einen eigenen IUnknown, getrennt vom äußeren Objekt IUnknownund verwaltet seine eigene Bezugsanzahl. CComPolyObject verwendet CComContainedObject , um an das äußere Unbekannte zu delegieren.

Weitere Informationen zur Aggregation finden Sie im Artikel Grundlagen von ATL COM-Objekten.

Vererbungshierarchie

CComObjectRootBase

CComObjectRootEx

IUnknown

CComPolyObject

Anforderungen

Kopfzeile: atlcom.h

CComPolyObject::AddRef

Erhöht die Verweisanzahl für das Objekt.

STDMETHOD_(ULONG, AddRef)();

Rückgabewert

Ein Wert, der für Diagnosen oder Tests nützlich sein kann.

CComPolyObject::CComPolyObject

Der Konstruktor.

CComPolyObject(void* pv);

Parameter

Pv
[in] Ein Zeiger auf das äußere Unbekannte, wenn das Objekt aggregiert werden soll, oder NULL, wenn das Objekt nicht aggregiert wird.

Hinweise

Initialisiert das CComContainedObject Datenelement, m_contained und erhöht die Modulsperranzahl.

Der Destruktor erhöht die Anzahl der Modulsperren.

CComPolyObject::~CComPolyObject

Der Destruktor.

~CComPolyObject();

Hinweise

Gibt alle zugeordneten Ressourcen frei, ruft FinalRelease auf und erhöht die Modulsperranzahl.

CComPolyObject::CreateInstance

Ermöglicht ihnen das Erstellen eines neuen CComPolyObject-Objektscontained>< ohne den Aufwand von CoCreateInstance.

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

Parameter

PP
[out] Ein Zeiger auf einen CComPolyObject-Zeiger><contained. Wenn CreateInstance dies nicht erfolgreich ist, wird pp auf NULL festgelegt.

Rückgabewert

Ein HRESULT-Standardwert.

Hinweise

Das zurückgegebene Objekt weist eine Bezugsanzahl von Null auf. Rufen Sie also sofort auf AddRef , um Release den Verweis auf den Objektzeiger freizugeben, wenn Sie fertig sind.

Wenn Sie keinen direkten Zugriff auf das Objekt benötigen, aber dennoch ein neues Objekt erstellen möchten, ohne den Aufwand CoCreateInstancezu haben, verwenden Sie stattdessen CComCoClass::CreateInstance .

CComPolyObject::FinalConstruct

Diese Methode wird während der letzten Phasen der Objekterstellung aufgerufen und führt alle endgültigen Initialisierungen für das m_contained-Datenmemm aus.

HRESULT FinalConstruct();

Rückgabewert

Ein HRESULT-Standardwert.

CComPolyObject::FinalRelease

Diese Methode wird während der Objektvernichtung aufgerufen und gibt das m_contained Datenelement frei.

void FinalRelease();

CComPolyObject::m_contained

Ein von Ihrer Klasse abgeleitetes CComContainedObject-Objekt .

CComContainedObject<contained> m_contained;

Parameter

enthalten
[in] Ihre Von CComObjectRoot oder CComObjectRootEx abgeleitete Klasse sowie alle anderen Schnittstellen, die Sie für das Objekt unterstützen möchten.

Hinweise

IUnknownm_contained Aufrufe werden an das äußere Unbekannte delegiert, wenn das Objekt aggregiert wird, oder an das IUnknown Objekt, wenn das Objekt nicht aggregiert wird.

CComPolyObject::QueryInterface

Ruft einen Zeiger auf die angeforderte Schnittstelle ab.

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

Parameter

Q
Die COM-Schnittstelle.

iid
[in] Der Bezeichner der angeforderten Schnittstelle.

ppvObject
[out] Ein Zeiger auf den Schnittstellenzeiger, der durch iid identifiziert wird. Wenn das Objekt diese Schnittstelle nicht unterstützt, wird ppvObject auf NULL festgelegt.

PP
[out] Ein Zeiger auf die schnittstelle, die durch __uuidof(Q).

Rückgabewert

Ein HRESULT-Standardwert.

Hinweise

Gibt für ein aggregiertes Objekt, wenn die angeforderte Schnittstelle lautet IUnknown, QueryInterface einen Zeiger auf das eigene IUnknown aggregierte Objekt zurück und erhöht die Referenzanzahl. Andernfalls fragt diese Methode die Schnittstelle über das CComContainedObject Datenelement m_contained ab.

CComPolyObject::Release

Erhöht die Verweisanzahl für das Objekt.

STDMETHOD_(ULONG, Release)();

Rückgabewert

Gibt in Debugbuilds einen Wert zurück, Release der für Diagnosen oder Tests nützlich sein kann. Gibt in Nichtfehlerbuilds Release immer "0" zurück.

Siehe auch

CComObjectRootEx-Klasse
DECLARE_POLY_AGGREGATABLE
Klassenübersicht