Partilhar via


Classe CComEnum

Observação

A Active Template Library (ATL) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

Esta classe define um objeto enumerador COM baseado num array.

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 COM. Veja IEnumString para um exemplo.

Piid
Um apontador para o 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 rosca da classe. Este parâmetro corresponde por defeito ao modelo global de object thread usado no seu projeto.

Observações

CComEnum define um objeto enumerador COM baseado num array. Esta classe é análoga ao CComEnumOnSTL , que implementa um enumerador baseado num contentor de Biblioteca Padrão C++. Os passos típicos para utilizar esta aula são descritos abaixo. Para mais informações, consulte Coleções e Enumeradores ATL.

Para usar esta classe:

  • typedef uma especialização desta disciplina.

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

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

  • Inicialize o objeto enumerador chamando CComEnumImpl::Init.

  • Devolva a interface do enumerador ao cliente.

Hierarquia de herança

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

CComEnum

Requerimentos

Cabeçalho: atlcom.h

Example

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

Este modelo de função pode ser usado para implementar a _NewEnum propriedade de uma interface de coleção, como 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.

Este código cria um typedef for CComEnum que expõe um vetor de VARIANTs através da IEnumVariant interface. A CVariantArrayCollection classe simplesmente se especializa CreateEnumerator em trabalhar com objetos enumeradores deste tipo e passa os argumentos necessários.

Consulte também

Visão geral da classe
CComObjectThreadModel
Classe CComEnumImpl
Classe CComObjectRootEx