Compartilhar via


Classe CComEnum

Essa classe define um objeto enumerador COM com base em uma matriz.

Sintaxe

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
Uma interface de enumerador do COM. Consulte IEnumString para obter um exemplo.

piid
Um ponteiro para a ID da interface do enumerador.

T
O tipo de item exposto pela interface do enumerador.

Copy
Uma classe de política de cópia homogênea.

ThreadModel
O modelo de threading da classe. Esse parâmetro é padrão para o modelo de thread de objeto global usado no seu projeto.

Comentários

CComEnum define um objeto enumerador COM com base em uma matriz. Essa classe é análoga a CComEnumOnSTL, que implementa um enumerador com base em um contêiner da Biblioteca Padrão C++. As etapas típicas para usar essa classe são descritas abaixo. Para obter mais informações, confira Enumeradores e Coleções da ATL.

Para usar esta classe:

  • typedef uma especialização dessa classe.

  • Use o typedef como argumento de modelo em uma especialização de CComObject.

  • Crie uma instância da especialização CComObject.

  • Inicialize o objeto do enumerador chamando CComEnumImpl::Init.

  • Retorne a interface do enumerador para o cliente.

Hierarquia de herança

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

CComEnum

Requisitos

Cabeçalho: atlcom.h

Exemplo

O código mostrado abaixo fornece uma função reutilizável para criar e inicializar um 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

Esse modelo de função pode ser usado para implementar a propriedade de uma interface de coleção, _NewEnum conforme mostrado abaixo:

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.

Esse código cria um typedef para CComEnum que expõe um vetor das VARIANTs por meio da interface IEnumVariant. A classe CVariantArrayCollection simplesmente especializa CreateEnumerator para trabalhar com objetos enumeradores desse tipo e passa os argumentos necessários.

Confira também

Visão geral da aula
CComObjectThreadModel
Classe CComEnumImpl
Classe CComObjectRootEx