Partager via


Classe de CComEnum

Cette classe définit un objet énumérateur COM selon un tableau.

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 >

Paramètres

  • Base
    Une interface d'énumérateur COM (IEnumXXXX).

  • piid
    Pointeur vers l'ID d'interface de l'interface d'énumérateur.

  • T
    Le type d'élément exposé par l'interface d'énumérateur.

  • Copy
    classe de stratégie de copiehomogène.

  • ThreadModel
    Le modèle de thread de la classe.Ce paramètre a la valeur par défaut au modèle de thread global d'objet utilisé dans votre projet.

Notes

CComEnum définit un objet énumérateur COM selon un tableau.Cette classe est analogue à CComEnumOnSTL qui implémente un énumérateur sur un conteneur STL.Les étapes standard pour l'utilisation de cette classe sont dessinées les grandes lignes ci-dessous.Pour plus d'informations, consultez Collections et énumérateurs ATL.

Pour utiliser cette classe :

  • typedef une spécialisation de cette classe.

  • Utilisez typedef comme argument template dans une spécialisation d' CComObject.

  • Créez une instance de la spécialisation d' CComObject .

  • Initialisez l'objet énumérateur en appelant CComEnumImpl::Init.

  • Retourne l'interface de l'énumérateur au client.

Hiérarchie d'héritage

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

CComEnum

Configuration requise

Header: atlcom.h

Exemple

Le code indiqué ci-dessous fournit une fonction réutilisable pour créer et initialiser un objet énumérateur.

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

Cette fonction de modèle peut être utilisée pour implémenter la propriété d' _NewEnum d'une interface de collection comme indiqué ci-dessous :

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.

Ce code crée typedef pour CComEnum qui expose un vecteur de variants via l'interface d' IEnumVariant .La classe de CVariantArrayCollection spécialise simplement CreateEnumerator pour utiliser les objets énumérateurs de ce type et passe les arguments nécessaires.

Voir aussi

Référence

CComObjectThreadModel

Classe de CComEnumImpl

Classe de CComObjectRootEx

Autres ressources

Vue d'ensemble de la classe ATL