Listing 5: EnumEntry definition.
class ATL_NO_VTABLE EnumEntry
: public CComObjectRootEx<CComSingleThreadModel>
, public IEnumVARIANT , public IEnumFileEntry
{
public:
EnumEntry()
: m_bIEnumVARIANT(false)
, m_bIEnumFileEntry(false)
{}
~EnumEntry();
...
static HRESULT WINAPI QueryFunc(void *pv,REFIID riid, LPVOID *ppv,DWORD dw);
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(EnumEntry)
COM_INTERFACE_ENTRY2(IUnknown, IEnumVARIANT)
COM_INTERFACE_ENTRY_FUNC(IID_IEnumVARIANT, 0, EnumEntry::QueryFunc)
COM_INTERFACE_ENTRY_FUNC(IID_IEnumFileEntry, 0, EnumEntry::QueryFunc)
END_COM_MAP()
// IEnumXXXX
public:
STDMETHOD(Skip)(/* [in] */ ULONG celt);
STDMETHOD(Reset)();
// IEnumVARIANT
public:
STDMETHOD(Next)(/* [in] */ ULONG celt,
/* [length_is][size_is][out] */ VARIANT *rgVar,
/* [out] */ ULONG *pceltFetched);
STDMETHOD(Clone)(/* [out] */ IEnumVARIANT **ppEnum);
// IEnumFileEntry
public:
STDMETHOD(Next)(/* [in] */ ULONG celt,
/* [length_is][size_is][out] */ PFILEENTRY *rgVar,
/* [out] */ ULONG *pceltFetched);
STDMETHOD(Clone)(/* [out] */ IEnumFileEntry **ppEnum);
// Implementation
private:
HRESULT DoSkip();
HRESULT DoNext(VARIANT *pvar);
HRESULT DoNext(PFILEENTRY *pvar);
// Members
private:
SearchInfo m_info;
bool m_bIEnumVARIANT;
bool m_bIEnumFileEntry;
};