Delen via


CComEnum-klasse

Opmerking

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

Deze klasse definieert een COM-enumerator-object op basis van een matrix.

Syntaxis

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>

Parameterwaarden

Base
Een COM-enumerator-interface. Zie IEnumString voor een voorbeeld.

piid
Een aanwijzer naar de interface-id van de enumerator-interface.

T
Het type item dat wordt weergegeven door de enumerator-interface.

Copy
Een homogene kopieerbeleidsklasse.

ThreadModel
Het threadingmodel van de klasse. Deze parameter is standaard ingesteld op het globale objectthreadmodel dat in uw project wordt gebruikt.

Opmerkingen

CComEnum definieert een COM-enumerator-object op basis van een matrix. Deze klasse is vergelijkbaar met CComEnumOnSTL waarmee een enumerator wordt geïmplementeerd op basis van een C++ Standard Library-container. Typische stappen voor het gebruik van deze klasse worden hieronder beschreven. Zie ATL Collections en Enumerators voor meer informatie.

Ga als volgt te werk om deze klasse te gebruiken:

  • typedef een specialisatie van deze klasse.

  • Gebruik het typedef argument als sjabloon in een specialisatie van CComObject.

  • Maak een exemplaar van de CComObject specialisatie.

  • Initialiseer het enumerator-object door CComEnumImpl::Init aan te roepen.

  • Retourneer de enumerator-interface naar de client.

Overnamehiërarchie

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

CComEnum

Requirements

Koptekst: atlcom.h

Example

De onderstaande code biedt een herbruikbare functie voor het maken en initialiseren van een enumerator-object.

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

Deze functiesjabloon kan worden gebruikt om de _NewEnum eigenschap van een verzamelingsinterface te implementeren, zoals hieronder wordt weergegeven:

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.

Met deze code maakt u een typedef for CComEnum waarmee een vector van VARIANT's beschikbaar wordt gemaakt via de IEnumVariant interface. De CVariantArrayCollection klasse is gewoon gespecialiseerd CreateEnumerator in het werken met enumerator-objecten van dit type en geeft de benodigde argumenten door.

Zie ook

Overzicht van klassen
CComObjectThreadModel
CComEnumImpl-klasse
CComObjectRootEx-klasse