Freigeben über


CComEnum-Klasse

Diese Klasse definiert ein COM-Enumeratorobjekt auf einem Array.

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

  • Base
    Eine COM-Enumerator (IEnumXXXX)-Schnittstelle.

  • piid
    Ein Zeiger auf den Schnittstellen-ID der Enumeratorschnittstelle.

  • T
    Der Typ des Elements verfügbar gemacht die Enumeratorschnittstelle.

  • Copy
    Homogenes Kopierrichtlinienklasse.

  • ThreadModel
    Das Threadingmodell der Klasse.Dieser Parameter wird standardmäßig der globalen Objektthreadmodell, das im Projekt verwendet wird.

Hinweise

CComEnum definiert ein COM-Enumeratorobjekt auf einem Array.Diese Klasse ist CComEnumOnSTL analog, die einen Enumerator auf Grundlage eines STL-Container implementiert.Typische Schritte für die Verwendung dieser Klasse werden unten erläutert.Weitere Informationen finden Sie unter ATL-Auflistungen und -Enumeratoren.

Um diese Klasse verwenden:

  • typedef eine Spezialisierung dieser Klasse.

  • Verwenden Sie typedef als Vorlagenargument in einer Spezialisierung von CComObject.

  • Erstellen Sie eine Instanz der CComObject Spezialisierung.

  • Initialisieren Sie das Enumeratorobjekt, indem Sie CComEnumImpl::Init aufrufen.

  • Geben Sie die Enumeratorschnittstelle an den Client zurück.

Vererbungshierarchie

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

CComEnum

Anforderungen

Header: möchten

Beispiel

Der Code, der unten angezeigt wird, 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 Vorlagenfunktion kann verwendet werden, um die _NewEnum-Eigenschaft einer Auflistungsschnittstelle wie unten gezeigt zu implementieren:

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.

Dieser Code erstellt typedef für CComEnum, der einen Vektor von VARIANT s durch die IEnumVariant-Schnittstelle verfügbar macht.Die Klasse CVariantArrayCollection spezialisiert einfach CreateEnumerator, um mit Enumeratorobjekten dieses Typs zu arbeiten und führt die notwendigen Argumente an.

Siehe auch

Referenz

CComObjectThreadModel

CComEnumImpl-Klasse

CComObjectRootEx-Klasse

Weitere Ressourcen

ATL-Klassenübersicht