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.