Compartilhar via


Classe CComEnumOnSTL

Essa classe define um objeto enumerador COM com base em uma coleção da Biblioteca Padrão do C++.

Sintaxe

template <class Base,
    const IID* piid, class T, class Copy, class CollType, class ThreadModel = CComObjectThreadModel>
class ATL_NO_VTABLE CComEnumOnSTL : public IEnumOnSTLImpl<Base, piid,
T,
    Copy,
CollType>,
    public CComObjectRootEx<ThreadModel>

Parâmetros

Base
Um enumerador 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.

CollType
Uma classe de contêiner da Biblioteca Padrão do C++.

Comentários

O CComEnumOnSTL define um objeto enumerador COM com base em uma coleção da Biblioteca Padrão do C++. Essa classe pode ser usada por conta própria ou em conjunto com ICollectionOnSTLImpl. 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 essa classe com ICollectionOnSTLImpl:

  • typedef uma especialização dessa classe.

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

Confira Enumeradores e coleções da ATL para obter um exemplo.

Para usar essa classe independentemente de ICollectionOnSTLImpl:

  • 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 IEnumOnSTLImpl::Init.

  • Retorne a interface do enumerador para o cliente.

Hierarquia de herança

CComObjectRootBase

Base

CComObjectRootEx

IEnumOnSTLImpl

CComEnumOnSTL

Requisitos

Cabeçalho: atlcom.h

Exemplo

O código mostrado abaixo fornece uma função genérica para lidar com a criação e a inicialização de um objeto do enumerador:

template <class EnumType, class CollType>
HRESULT CreateSTLEnumerator(IUnknown** ppUnk, IUnknown* pUnkForRelease, 
   CollType& collection)
{
   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(pUnkForRelease, collection);

   if (SUCCEEDED(hr))
      hr = pEnum->QueryInterface(ppUnk);

   if (FAILED(hr))
      delete pEnum;

   return hr;
} // CreateSTLEnumerator

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

typedef CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT>,
   std::vector<CComVariant> > VarVarEnum;

class ATL_NO_VTABLE CVariantCollection :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CVariantCollection, &CLSID_VariantCollection>,
   public IDispatchImpl<IVariantCollection, &IID_IVariantCollection, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   std::vector<CComVariant> m_vec;

   STDMETHOD(get__NewEnum)(IUnknown** ppUnk)
   {
      return CreateSTLEnumerator<VarVarEnum>(ppUnk, this, m_vec);
   }

   // Remainder of class declaration omitted.

Esse código cria um typedef para CComEnumOnSTL que qual expõe um vetor de CComVariant por meio da interface IEnumVariant. A classe CVariantCollection simplesmente é especializada em CreateSTLEnumerator para trabalhar com objetos de enumeradores desse tipo.

Confira também

IEnumOnSTLImpl
Exemplo de ATLCollections: demonstra as classes ICollectionOnSTLImpl, CComEnumOnSTL e Custom Copy Policy
Visão geral da aula
Classe CComObjectRootEx
CComObjectThreadModel
Classe IEnumOnSTLImpl