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