Compartir a través de


CComEnum (clase)

Esta clase define un objeto enumerador COM basado en una matriz.

Sintaxis

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>

Parámetros

Base
Una interfaz de enumerador COM. Consulte IEnumString para ver un ejemplo.

piid
Puntero al Id. de interfaz de la interfaz del enumerador.

T
El tipo de elemento expuesto por la interfaz del enumerador.

Copiar
Una clase de directiva de copia homogénea.

ThreadModel
Modelo de subprocesos de la clase. Este parámetro tiene como valor predeterminado el modelo de subprocesos de objetos global que se usa en el proyecto.

Comentarios

CComEnum define un objeto enumerador COM basado en una matriz. Esta clase es análoga a CComEnumOnSTL, que implementa un enumerador basado en un contenedor de biblioteca estándar de C++. Ahora se describen los pasos típicos para usar esta clase. Para más información, consulte Colecciones y enumeradores de ATL.

Para usar esta clase:

  • typedef una especialización de esta clase.

  • Use typedef como argumento de plantilla en una especialización de CComObject.

  • Cree una instancia de la especialización CComObject.

  • Inicialice el objeto enumerador llamando a CComEnumImpl::Init.

  • Devuelve la interfaz del enumerador al cliente.

Jerarquía de herencia

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

CComEnum

Requisitos

Encabezado: atlcom.h

Ejemplo

El código que se muestra a continuación proporciona una función reutilizable para crear e inicializar un objeto enumerador.

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

Esta plantilla de función se puede usar para implementar la _NewEnum propiedad de una interfaz de colección, como se muestra a continuación:

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.

Este código crea un typedef para CComEnum que expone un vector de VARIANT a través de la interfaz IEnumVariant. La clase CVariantArrayCollection simplemente se especializa CreateEnumerator para trabajar con objetos enumeradores de este tipo y pasa los argumentos necesarios.

Consulte también

Información general sobre la clase
CComObjectThreadModel
CComEnumImpl (clase)
CComObjectRootEx (clase)