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; };