Sdílet prostřednictvím


CComPolyObject – třída

Tato třída implementuje IUnknown agregovaný nebo neagregovaný objekt.

Syntaxe

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

Parametry

obsahoval
Třída odvozená z CComObjectRoot nebo CComObjectRootEx, stejně jako z jakéhokoli jiného rozhraní, které chcete podporovat u objektu.

Členové

Veřejné konstruktory

Název Popis
CComPolyObject::CComPolyObject Konstruktor
CComPolyObject::~CComPolyObject Destruktor.

Veřejné metody

Název Popis
CComPolyObject::AddRef Zvýší počet odkazů objektu.
CComPolyObject::CreateInstance (Statické) Umožňuje vytvořit nový objekt CComPolyObject contained ><bez režie CoCreateInstance.
CComPolyObject::FinalConstruct Provede konečnou inicializaci .m_contained
CComPolyObject::FinalRelease Provádí konečné zničení m_contained.
CComPolyObject::QueryInterface Načte ukazatel na požadované rozhraní.
CComPolyObject::Release Sníží počet odkazů objektu.

Veřejné datové členy

Název Popis
CComPolyObject::m_contained Deleguje IUnknown volání na vnější neznámé, pokud je objekt agregován nebo na IUnknown objekt, pokud objekt není agregován.

Poznámky

CComPolyObject implementuje IUnknown pro agregovaný nebo neagregovaný objekt.

Při vytvoření instance CComPolyObject je zaškrtnutá hodnota vnější neznámé. Pokud má hodnotu NULL, IUnknown implementuje se pro neagregovaný objekt. Pokud vnější neznámý není NULL, IUnknown je implementováno pro agregovaný objekt.

Výhodou použití CComPolyObject je, že se v modulu vyhněte tomu, aby se v modulu zpracovávaly agregované a neagregované případy jak CComAggObject, tak CComObject. Jeden CComPolyObject objekt zpracovává oba případy. To znamená, že v modulu existuje jenom jedna kopie virtuální tabulky a jedna kopie funkcí. Pokud je vaše virtuální tabulka velká, může se tím podstatně zmenšit velikost modulu. Pokud je však tabulka vtable malá, může použití CComPolyObject vést k mírně větší velikosti modulu, protože není optimalizovaná pro agregovaný nebo neagregovaný objekt, jak jsou CComAggObject a CComObject.

Pokud je v definici třídy objektu zadáno DECLARE_POLY_AGGREGATABLE makro, CComPolyObject použije se k vytvoření objektu. DECLARE_POLY_AGGREGATABLE se automaticky deklarují, pokud použijete Průvodce projektem ATL k vytvoření úplného ovládacího prvku nebo ovládacího prvku Aplikace Internet Explorer.

Pokud je objekt agregovaný, CComPolyObject má svůj vlastní IUnknown, oddělený od vnějšího objektu IUnknowna udržuje svůj vlastní referenční počet. CComPolyObject používá objekt CComContainedObject k delegování na vnější neznámý objekt.

Další informace o agregaci najdete v článku Základy objektů MODELU COM ATL.

Hierarchie dědičnosti

CComObjectRootBase

CComObjectRootEx

IUnknown

CComPolyObject

Požadavky

Hlavička: atlcom.h

CComPolyObject::AddRef

Zvýší počet odkazů na objekt.

STDMETHOD_(ULONG, AddRef)();

Návratová hodnota

Hodnota, která může být užitečná pro diagnostiku nebo testování.

CComPolyObject::CComPolyObject

Konstruktor

CComPolyObject(void* pv);

Parametry

Pv
[v] Ukazatel na vnější neznámý, pokud má být objekt agregován, nebo NULL, pokud objekt není agregován.

Poznámky

Inicializuje CComContainedObject datový člen, m_contained a zvýší počet zámků modulu.

Destruktor dekrementuje počet zámků modulu.

CComPolyObject::~CComPolyObject

Destruktor.

~CComPolyObject();

Poznámky

Uvolní všechny přidělené prostředky, zavolá FinalRelease a sníží počet zámků modulu.

CComPolyObject::CreateInstance

Umožňuje vytvořit nový objekt CComPolyObjectcontained>< bez režie CoCreateInstance.

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

Parametry

Pp
[ven] Ukazatel na ukazatel CComPolyObject><contained. Pokud CreateInstance je neúspěšný, hodnota pp je nastavena na hodnotu NULL.

Návratová hodnota

Standardní hodnota HRESULT.

Poznámky

Vrácený objekt má počet odkazů na nulu, takže volání AddRef okamžitě použijte Release k uvolnění odkazu na ukazatel objektu, jakmile budete hotovi.

Pokud nepotřebujete přímý přístup k objektu, ale přesto chcete vytvořit nový objekt bez režie CoCreateInstance, použijte místo toho CComCoClass::CreateInstance .

CComPolyObject::FinalConstruct

Volá se během konečných fází konstrukce objektu, tato metoda provádí všechny konečné inicializace u m_contained datového členu .

HRESULT FinalConstruct();

Návratová hodnota

Standardní hodnota HRESULT.

CComPolyObject::FinalRelease

Volá se při zničení objektu , tato metoda uvolní m_contained datový člen.

void FinalRelease();

CComPolyObject::m_contained

A CComContainedObject objekt odvozený z vaší třídy.

CComContainedObject<contained> m_contained;

Parametry

obsahoval
[v] Třída odvozená z CComObjectRoot nebo CComObjectRootEx, stejně jako z jakéhokoli jiného rozhraní, které chcete podporovat u objektu.

Poznámky

IUnknown volání jsou m_contained delegována na vnější neznámé, pokud je objekt agregován, nebo na IUnknown tento objekt, pokud objekt není agregován.

CComPolyObject::QueryInterface

Načte ukazatel na požadované rozhraní.

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

Parametry

Q
Rozhraní MODELU COM.

iid
[v] Identifikátor požadovaného rozhraní.

ppvObject
[ven] Ukazatel na ukazatel rozhraní identifikovaný pomocí iid. Pokud objekt nepodporuje toto rozhraní, ppvObject je nastaven na HODNOTU NULL.

Pp
[ven] Ukazatel na rozhraní identifikovaný .__uuidof(Q)

Návratová hodnota

Standardní hodnota HRESULT.

Poznámky

U agregovaného objektu, pokud je IUnknownpožadované rozhraní , QueryInterface vrátí ukazatel na vlastní IUnknown agregovaný objekt a zvýší počet odkazů. V opačném případě se tato metoda dotazuje na rozhraní prostřednictvím datového členu CComContainedObject m_contained.

CComPolyObject::Release

Sníží počet odkazů na objekt.

STDMETHOD_(ULONG, Release)();

Návratová hodnota

V buildech ladění vrátí hodnotu, Release která může být užitečná pro diagnostiku nebo testování. V nedebugních buildech Release vždy vrátí hodnotu 0.

Viz také

CComObjectRootEx – třída
DECLARE_POLY_AGGREGATABLE
Přehled třídy