Classe CComPolyObject

Questa classe implementa IUnknown per un oggetto aggregato o non aggregato.

Sintassi

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

Parametri

Contenuti
La classe, derivata da CComObjectRoot o CComObjectRootEx, nonché da qualsiasi altra interfaccia che si vuole supportare sull'oggetto.

Membri

Costruttori pubblici

Nome Descrizione
CComPolyObject::CComPolyObject Costruttore.
CComPolyObject::~CComPolyObject Distruttore.

Metodi pubblici

Nome Descrizione
CComPolyObject::AddRef Incrementa il conteggio dei riferimenti dell'oggetto.
CComPolyObject::CreateInstance (Statico) Consente di creare un nuovo oggetto CComPolyObject<>contained senza sovraccarico di CoCreateInstance.
CComPolyObject::FinalConstruct Esegue l'inizializzazione finale di m_contained.
CComPolyObject::FinalRelease Esegue la distruzione finale di m_contained.
CComPolyObject::QueryInterface Recupera un puntatore all'interfaccia richiesta.
CComPolyObject::Release Decrementa il conteggio dei riferimenti dell'oggetto.

Membri dati pubblici

Nome Descrizione
CComPolyObject::m_contained IUnknown I delegati chiamano all'oggetto sconosciuto esterno se l'oggetto viene aggregato o all'oggetto IUnknown se l'oggetto non è aggregato.

Osservazioni:

CComPolyObject implementa IUnknown per un oggetto aggregato o non aggregato.

Quando viene creata un'istanza di CComPolyObject , viene controllato il valore dell'elemento sconosciuto esterno. Se è NULL, IUnknown viene implementato per un oggetto nonaggregato. Se l'elemento sconosciuto esterno non è NULL, IUnknown viene implementato per un oggetto aggregato.

Il vantaggio dell'uso CComPolyObject consiste nell'evitare di avere sia CComAggObjectche CComObject nel modulo per gestire i casi aggregati e non aggregati. Un singolo CComPolyObject oggetto gestisce entrambi i casi. Ciò significa che nel modulo è presente una sola copia della tabella virtuale e una copia delle funzioni. Se la tabella virtuale è grande, questa operazione può ridurre notevolmente le dimensioni del modulo. Tuttavia, se la tabella virtuale è piccola, l'uso CComPolyObject di può comportare dimensioni del modulo leggermente maggiori perché non è ottimizzato per un oggetto aggregato o nonaggregato, come sono CComAggObject e CComObject.

Se la macro DECLARE_POLY_AGGREGATABLE viene specificata nella definizione della classe dell'oggetto, CComPolyObject verrà utilizzata per creare l'oggetto. DECLARE_POLY_AGGREGATABLE verrà dichiarata automaticamente se si utilizza la Creazione guidata progetto ATL per creare un controllo completo o un controllo Internet Explorer.

Se aggregato, l'oggetto CComPolyObject ha il proprio IUnknown, separato dall'oggetto IUnknownesterno e mantiene il proprio conteggio dei riferimenti. CComPolyObject usa CComContainedObject per delegare all'oggetto sconosciuto esterno.

Per altre informazioni sull'aggregazione, vedere l'articolo Nozioni fondamentali sugli oggetti COM ATL.

Gerarchia di ereditarietà

CComObjectRootBase

Ccomobjectrootex

IUnknown

CComPolyObject

Requisiti

Intestazione: atlcom.h

CComPolyObject::AddRef

Incrementa il conteggio dei riferimenti sull'oggetto .

STDMETHOD_(ULONG, AddRef)();

Valore restituito

Valore che può essere utile per la diagnostica o il test.

CComPolyObject::CComPolyObject

Costruttore.

CComPolyObject(void* pv);

Parametri

Pv
[in] Puntatore all'oggetto sconosciuto esterno se l'oggetto deve essere aggregato o NULL se l'oggetto non è aggregato.

Osservazioni:

Inizializza il CComContainedObject membro dati, m_contained e incrementa il conteggio dei blocchi del modulo.

Il distruttore decrementa il conteggio dei blocchi del modulo.

CComPolyObject::~CComPolyObject

Distruttore.

~CComPolyObject();

Osservazioni:

Libera tutte le risorse allocate, chiama FinalRelease e decrementa il conteggio dei blocchi del modulo.

CComPolyObject::CreateInstance

Consente di creare un nuovo oggetto CComPolyObject<>contained senza sovraccarico di CoCreateInstance.

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

Parametri

Pp
[out] Puntatore a un puntatore CComPolyObject><contained. Se CreateInstance ha esito negativo, pp è impostato su NULL.

Valore restituito

Valore HRESULT standard.

Osservazioni:

L'oggetto restituito ha un conteggio dei riferimenti pari a zero, quindi chiamare AddRef immediatamente, quindi usare Release per liberare il riferimento sul puntatore all'oggetto al termine.

Se non è necessario l'accesso diretto all'oggetto, ma si vuole comunque creare un nuovo oggetto senza il sovraccarico di CoCreateInstance, usare invece CComCoClass::CreateInstance .

CComPolyObject::FinalConstruct

Chiamato durante le fasi finali della costruzione di oggetti, questo metodo esegue qualsiasi inizializzazione finale sul membro dati m_contained .

HRESULT FinalConstruct();

Valore restituito

Valore HRESULT standard.

CComPolyObject::FinalRelease

Chiamato durante la distruzione dell'oggetto, questo metodo libera il membro dati m_contained .

void FinalRelease();

CComPolyObject::m_contained

Oggetto CComContainedObject derivato dalla classe.

CComContainedObject<contained> m_contained;

Parametri

Contenuti
[in] La classe, derivata da CComObjectRoot o CComObjectRootEx, nonché da qualsiasi altra interfaccia che si vuole supportare sull'oggetto.

Osservazioni:

IUnknown le chiamate tramite m_contained vengono delegate all'oggetto sconosciuto esterno se l'oggetto viene aggregato o a di IUnknown questo oggetto se l'oggetto non è aggregato.

CComPolyObject::QueryInterface

Recupera un puntatore all'interfaccia richiesta.

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

Parametri

Q
Interfaccia COM.

Iid
[in] Identificatore dell'interfaccia richiesta.

ppvObject
[out] Puntatore al puntatore dell'interfaccia identificato da iid. Se l'oggetto non supporta questa interfaccia, ppvObject è impostato su NULL.

Pp
[out] Puntatore all'interfaccia identificata da __uuidof(Q).

Valore restituito

Valore HRESULT standard.

Osservazioni:

Per un oggetto aggregato, se l'interfaccia richiesta è IUnknown, QueryInterface restituisce un puntatore al proprio IUnknown oggetto aggregato e incrementa il conteggio dei riferimenti. In caso contrario, questo metodo esegue una query per l'interfaccia tramite il CComContainedObject membro dati m_contained.

CComPolyObject::Release

Decrementa il conteggio dei riferimenti sull'oggetto .

STDMETHOD_(ULONG, Release)();

Valore restituito

Nelle compilazioni di debug restituisce Release un valore che può essere utile per la diagnostica o il test. Nelle compilazioni non di tipoebug restituisce Release sempre 0.

Vedi anche

Classe CComObjectRootEx
DECLARE_POLY_AGGREGATABLE
Cenni preliminari sulla classe