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 deICollectionOnSTLImpl
.
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 deCComObject
.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
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