Freigeben über


CComEnum-Klasse

Diese Klasse definiert ein COM-Enumerationsobjekt basierend auf einem Array.

Syntax

template <class Base,
    const IID* piid, class T, class Copy, class ThreadModel = CcomObjectThreadModel>
class ATL_NO_VTABLE CComEnum : public CComEnumImpl<Base, piid,
T,
    Copy>,
public CComObjectRootEx<ThreadModel>

Parameter

Bemessungsgrundlage
Eine COM-Enumerationsschnittstelle. Ein Beispiel finden Sie unter "IEnumString ".

piid
Ein Zeiger auf die Schnittstellen-ID der Enumeratorschnittstelle.

T
Der Typ des Elements, der von der Enumerationsschnittstelle verfügbar gemacht wird.

Kopieren
Eine homogene Kopierrichtlinienklasse.

ThreadModel
Das Threadingmodell der Klasse. Dieser Parameter entspricht standardmäßig dem globalen Objektthreadmodell, das in Ihrem Projekt verwendet wird.

Hinweise

CComEnum definiert ein COM-Enumerationsobjekt basierend auf einem Array. Diese Klasse ist analog zu CComEnumOnSTL , die einen Enumerator basierend auf einem C++-Standardbibliothekscontainer implementiert. Typische Schritte für die Verwendung dieser Klasse sind unten beschrieben. Weitere Informationen finden Sie unter ATL-Auflistungen und Enumerationen.

So verwenden Sie diese Klasse:

  • typedef eine Spezialisierung dieser Klasse.

  • Verwenden Sie das typedef Als Vorlagenargument in einer Spezialisierung von CComObject.

  • Erstellen Sie eine Instanz der CComObject Spezialisierung.

  • Initialisieren Sie das Enumerationsobjekt durch Aufrufen von CComEnumImpl::Init.

  • Gibt die Enumerationsschnittstelle an den Client zurück.

Vererbungshierarchie

CComObjectRootBase

Base

Ccomobjectrootex

CComEnumImpl

CComEnum

Anforderungen

Kopfzeile: atlcom.h

Beispiel

Der unten gezeigte Code stellt eine wiederverwendbare Funktion zum Erstellen und Initialisieren eines Enumeratorobjekts bereit.

template <class EnumType, class ElementType>
HRESULT CreateEnumerator(IUnknown** ppUnk, ElementType* begin, ElementType* end,
   IUnknown* pUnk, CComEnumFlags flags)
{
   if (ppUnk == NULL)
      return E_POINTER;
   *ppUnk = NULL;

   CComObject<EnumType>* pEnum = NULL;
   HRESULT hr = CComObject<EnumType>::CreateInstance(&pEnum);

   if (FAILED(hr))
      return hr;

   hr = pEnum->Init(begin, end, pUnk, flags);

   if (SUCCEEDED(hr))
      hr = pEnum->QueryInterface(ppUnk);

   if (FAILED(hr))
      delete pEnum;

   return hr;
} // CreateEnumerator

Diese Funktionsvorlage kann verwendet werden, um die _NewEnum Eigenschaft einer Sammlungsschnittstelle zu implementieren, wie unten dargestellt:

typedef CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > VarArrEnum;

class ATL_NO_VTABLE CVariantArrayCollection :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CVariantArrayCollection, &CLSID_VariantArrayCollection>,
   public IDispatchImpl<IVariantArrayCollection, &IID_IVariantArrayCollection, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
VARIANT m_arr[3];
public:
    STDMETHOD(get__NewEnum)(IUnknown** ppUnk)
    {
        return CreateEnumerator<VarArrEnum>(ppUnk, &m_arr[0], &m_arr[3], this, 
           AtlFlagNoCopy);
    }

    // Remainder of class declaration omitted.

Mit diesem Code wird ein typedefCComEnum Vektor von VARIANTs über die IEnumVariant Schnittstelle verfügbar gemacht. Die CVariantArrayCollection Klasse ist einfach auf die Arbeit mit Enumerationsobjekten dieses Typs CreateEnumerator spezialisiert und übergibt die erforderlichen Argumente.

Siehe auch

Klassenübersicht
CComObjectThreadModel
CComEnumImpl-Klasse
CComObjectRootEx-Klasse