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