Classe de CComEnum
Esta classe define um objeto enumerator COM com base em uma matriz.
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 (IEnumXXXX).piid
Um ponteiro para o interface identificação da interface de enumeração.T
O tipo de item exposto pela interface de enumeração.Copy
copie a classe da diretivahomogêneo.ThreadModel
O modelo de threads da classe.Este parâmetro tem como padrão o modelo de threads do objeto global usado em seu projeto.
Comentários
CComEnum define um objeto enumerator COM com base em uma matriz.Essa classe é análogo a CComEnumOnSTL que implementa um enumerador baseia-se em um recipiente de STL.As etapas típicas para usar essa classe são descritas abaixo.Para obter mais informações, consulte coleções e enumeradores de ATL.
Para usar esta classe:
typedef uma especialização de essa classe.
Use typedef como o argumento do modelo em uma especialização de CComObject.
Crie uma instância de especialização de CComObject .
Inicializar o objeto enumerator chamando CComEnumImpl::Init.
Retornar 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 enumerator.
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
Essa função de modelo pode ser usada para implementar como mostrado a propriedade de _NewEnum de uma interface de coleção 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 typedef para CComEnum que expõe um vetor de VARIANTs através da interface de IEnumVariant .A classe de CVariantArrayCollection especializa simplesmente CreateEnumerator para trabalhar com objetos de enumerador de esse tipo e passa os argumentos necessários.