Share via


Klasse CComPolyObject

Opmerking

De ATL (Active Template Library) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Deze klasse implementeert IUnknown voor een geaggregeerd of niet-geaggregeerd object.

Syntaxis

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

Parameterwaarden

ingesloten
Uw klasse, afgeleid van CComObjectRoot of CComObjectRootEx, evenals van andere interfaces die u voor het object wilt ondersteunen.

Leden

Openbare constructors

Naam Description
CComPolyObject::CComPolyObject De constructor.
CComPolyObject::~CComPolyObject De destructor.

Openbare methoden

Naam Description
CComPolyObject::AddRef Hiermee wordt het aantal verwijzingen van het object verhoogd.
CComPolyObject::CreateInstance (Statisch) Hiermee kunt u een nieuw CComPolyObject-object<contained> maken zonder de overhead van CoCreateInstance.
CComPolyObject::FinalConstruct Voert de laatste initialisatie van m_contained.
CComPolyObject::FinalRelease Voert definitieve vernietiging van m_contained.
CComPolyObject::QueryInterface Hiermee wordt een aanwijzer naar de aangevraagde interface opgehaald.
CComPolyObject::Release Hiermee wordt het verwijzingsaantal van het object afgeschroefd.

Publieke dataleden

Naam Description
CComPolyObject::m_contained Delegeert IUnknown aanroepen naar het buitenste onbekende als het object wordt samengevoegd of aan het IUnknown object als het object niet is samengevoegd.

Opmerkingen

CComPolyObject implementeert IUnknown voor een geaggregeerd of niet-geaggregeerd object.

Wanneer er een exemplaar van CComPolyObject wordt gemaakt, wordt de waarde van het buitenste onbekende gecontroleerd. Als het NULL is, IUnknown wordt deze geïmplementeerd voor een niet-samengevoegd object. Als de buitenste onbekende waarde niet NULL is, IUnknown wordt deze geïmplementeerd voor een geaggregeerd object.

Het voordeel van het gebruik CComPolyObject is dat u zowel CComAggObject als CComComObject in uw module vermijdt om de samengevoegde en niet-samengevoegde gevallen te verwerken. Een enkel CComPolyObject object verwerkt beide gevallen. Dit betekent dat er slechts één kopie van de vtable en één kopie van de functies in uw module aanwezig zijn. Als uw vtable groot is, kan dit de modulegrootte aanzienlijk verkleinen. Als uw vtable echter klein is, kan het gebruik CComPolyObject resulteren in een iets grotere module omdat deze niet is geoptimaliseerd voor een geaggregeerd of niet-samengevoegd object, zoals dat CComAggObject wel en CComObject.

Als de DECLARE_POLY_AGGREGATABLE macro is opgegeven in de klassedefinitie van uw object, CComPolyObject wordt deze gebruikt om uw object te maken. DECLARE_POLY_AGGREGATABLE wordt automatisch gedeclareerd als u de wizard ATL-project gebruikt om een volledig besturingselement of Internet Explorer-besturingselement te maken.

Als het object wordt samengevoegd, heeft het CComPolyObject een eigen IUnknownobject, gescheiden van het buitenste object IUnknownen onderhoudt het eigen referentieaantal. CComPolyObject gebruikt CComContainedObject om te delegeren aan het buitenste onbekende object.

Zie het artikel Basisprincipes van ATL COM-objecten voor meer informatie over aggregatie.

Overnamehiërarchie

CComObjectRootBase

CComObjectRootEx

IUnknown

CComPolyObject

Requirements

Koptekst: atlcom.h

CComPolyObject::AddRef

Hiermee wordt het aantal verwijzingen voor het object verhoogd.

STDMETHOD_(ULONG, AddRef)();

Retourwaarde

Een waarde die nuttig kan zijn voor diagnostische gegevens of tests.

CComPolyObject::CComPolyObject

De constructor.

CComPolyObject(void* pv);

Parameterwaarden

Pv
[in] Een aanwijzer naar de buitenste onbekende als het object moet worden samengevoegd, of NULL als het object niet is samengevoegd.

Opmerkingen

Initialiseert het CComContainedObject gegevenslid, m_contained en incrementeert het aantal modulevergrendelingen.

Destructor degradeert het aantal modulevergrendelingen.

CComPolyObject::~CComPolyObject

De destructor.

~CComPolyObject();

Opmerkingen

Hiermee worden alle toegewezen resources vrijgemaakt, FinalRelease aanroepen en wordt het aantal modulevergrendelingen afgetrokken.

CComPolyObject::CreateInstance

Hiermee kunt u een nieuw CComPolyObject-object<contained> maken zonder de overhead van CoCreateInstance.

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

Parameterwaarden

Pp
[uit] Een aanwijzer naar een CComPolyObject-aanwijzer<contained> . Als CreateInstance dit niet lukt, wordt pp ingesteld op NULL.

Retourwaarde

Een standaard HRESULT-waarde.

Opmerkingen

Het geretourneerde object heeft een verwijzingsaantal nul, dus roep AddRef onmiddellijk aan en gebruik vervolgens om de verwijzing op de objectpointer vrij te maken Release wanneer u klaar bent.

Als u geen directe toegang tot het object nodig hebt, maar toch een nieuw object wilt maken zonder de overhead van, gebruikt u in plaats daarvan CoCreateInstanceCComCoClass::CreateInstance.

CComPolyObject::FinalConstruct

Deze methode wordt aangeroepen tijdens de laatste fasen van de objectconstructie en voert een definitieve initialisatie uit op het m_contained gegevenslid.

HRESULT FinalConstruct();

Retourwaarde

Een standaard HRESULT-waarde.

CComPolyObject::FinalRelease

Met deze methode die wordt aangeroepen tijdens de vernietiging van objecten, wordt het m_contained gegevenslid vrijgemaakt.

void FinalRelease();

CComPolyObject::m_contained

Een CComContainedObject-object dat is afgeleid van uw klasse.

CComContainedObject<contained> m_contained;

Parameterwaarden

ingesloten
[in] Uw klasse, afgeleid van CComObjectRoot of CComObjectRootEx, evenals van andere interfaces die u voor het object wilt ondersteunen.

Opmerkingen

IUnknown m_contained aanroepen worden gedelegeerd aan het buitenste onbekende als het object wordt samengevoegd of aan het IUnknown object als het object niet wordt samengevoegd.

CComPolyObject::QueryInterface

Hiermee wordt een aanwijzer naar de aangevraagde interface opgehaald.

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

Parameterwaarden

Q
De COM-interface.

iid
[in] De id van de interface die wordt aangevraagd.

ppvObject
[uit] Een aanwijzer naar de interfacepointer die wordt geïdentificeerd door iid. Als het object deze interface niet ondersteunt, is ppvObject ingesteld op NULL.

Pp
[uit] Een aanwijzer naar de interface geïdentificeerd door __uuidof(Q).

Retourwaarde

Een standaard HRESULT-waarde.

Opmerkingen

Als de aangevraagde interface voor een samengevoegd object is IUnknown, QueryInterface retourneert u een aanwijzer naar de eigen IUnknown waarde van het samengevoegde object en wordt het aantal verwijzingen verhoogd. Anders voert deze methode query's uit voor de interface via het CComContainedObject gegevenslid , m_contained.

CComPolyObject::Release

Hiermee wordt het aantal verwijzingen voor het object afgeschroefd.

STDMETHOD_(ULONG, Release)();

Retourwaarde

In builds Release voor foutopsporing wordt een waarde geretourneerd die nuttig kan zijn voor diagnostische gegevens of tests. In niet-foutopsporingsversies Release wordt altijd 0 geretourneerd.

Zie ook

CComObjectRootEx-klasse
DECLARE_POLY_AGGREGATABLE
Overzicht van klassen