idmk.c
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 3k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "shellprv.h"
  2. #pragma  hdrstop
  3. typedef struct _DefEnum         // deunk
  4. {
  5.     IEnumIDList         eunk;
  6.     int                 cRef;
  7.     int                 iCur;
  8.     LPITEMIDLIST        pidlReturn;
  9.     LPVOID              lpData;
  10.     LPFNENUMCALLBACK    lpfn;
  11. } CDefEnum;
  12. extern IEnumIDListVtbl c_DefEnumVtbl;   // forward
  13. STDAPI SHCreateEnumObjects(HWND hwndOwner, LPVOID lpData, LPFNENUMCALLBACK lpfn, IEnumIDList **ppeunk)
  14. {
  15.     CDefEnum * pdeunk = (CDefEnum *)LocalAlloc( LPTR, SIZEOF(CDefEnum));
  16.     if (pdeunk)
  17.     {
  18.         pdeunk->eunk.lpVtbl = &c_DefEnumVtbl;
  19.         pdeunk->cRef = 1;
  20.         pdeunk->lpData = lpData;
  21.         pdeunk->lpfn   = lpfn;
  22.         ASSERT(pdeunk->iCur == 0);
  23.         ASSERT(pdeunk->pidlReturn == NULL);
  24.         *ppeunk = &pdeunk->eunk;
  25.         return NOERROR;
  26.     }
  27.     *ppeunk = NULL;
  28.     return E_OUTOFMEMORY;
  29. }
  30. void CDefEnum_SetReturn(LPARAM lParam, LPITEMIDLIST pidl)
  31. {
  32.     CDefEnum *pdeunk = (CDefEnum *)lParam;
  33.     pdeunk->pidlReturn = pidl;
  34. }
  35. STDMETHODIMP CDefEnum_QueryInterface(IEnumIDList *peunk, REFIID riid, LPVOID *ppvObj)
  36. {
  37.     CDefEnum * this = IToClass(CDefEnum, eunk, peunk);
  38.     if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IEnumIDList))
  39.     {
  40.         *ppvObj = &this->eunk;
  41.         InterlockedIncrement(&this->cRef);
  42.         return NOERROR;
  43.     }
  44.     *ppvObj = NULL;
  45.     return E_NOINTERFACE;
  46. }
  47. STDMETHODIMP_(ULONG) CDefEnum_AddRef(IEnumIDList *peunk)
  48. {
  49.     CDefEnum * this = IToClass(CDefEnum, eunk, peunk);
  50.     return InterlockedIncrement(&this->cRef);
  51. }
  52. STDMETHODIMP_(ULONG) CDefEnum_Release(IEnumIDList *peunk)
  53. {
  54.     CDefEnum * this = IToClass(CDefEnum, eunk, peunk);
  55.     if (InterlockedDecrement(&this->cRef))
  56.         return this->cRef;
  57.     this->lpfn((LPARAM)this, this->lpData, ECID_RELEASE, 0);
  58.     LocalFree((HLOCAL)this);
  59.     return 0;
  60. }
  61. STDMETHODIMP CDefEnum_Next(IEnumIDList *peunk, ULONG celt, LPITEMIDLIST *ppidlOut, ULONG *pceltFetched)
  62. {
  63.     CDefEnum * this = IToClass(CDefEnum, eunk, peunk);
  64.     HRESULT hres;
  65.     this->pidlReturn = NULL;
  66.     hres = this->lpfn((LPARAM)this, this->lpData, ECID_SETNEXTID, this->iCur);
  67.     if (hres == NOERROR)
  68.     {
  69.         this->iCur++;
  70.         ASSERT(this->pidlReturn);
  71.         *ppidlOut = this->pidlReturn;
  72.         if (pceltFetched)
  73.             *pceltFetched = 1;
  74.     }
  75.     else
  76.     {
  77.         ASSERT(this->pidlReturn == NULL);
  78.         *ppidlOut = NULL;
  79.         if (pceltFetched)
  80.             *pceltFetched = 0;
  81.     }
  82.     return hres;
  83. }
  84. ///// These will be used by all enums that aren't yet implemented
  85. STDMETHODIMP CDefEnum_Skip(IEnumIDList *peunk, ULONG celt)
  86. {
  87.     // REVIEW: Implement it later.
  88.     return E_NOTIMPL;
  89. }
  90. STDMETHODIMP CDefEnum_Reset(IEnumIDList *peunk)
  91. {
  92.     // REVIEW: Implement it later.
  93.     return E_NOTIMPL;
  94. }
  95. STDMETHODIMP CDefEnum_Clone(IEnumIDList *peunk, IEnumIDList ** ppenm)
  96. {
  97.     // We'll never support this function.
  98.     return E_FAIL;
  99. }
  100. IEnumIDListVtbl c_DefEnumVtbl =
  101. {
  102.     CDefEnum_QueryInterface, CDefEnum_AddRef, CDefEnum_Release,
  103.     CDefEnum_Next,
  104.     CDefEnum_Skip,
  105.     CDefEnum_Reset,
  106.     CDefEnum_Clone
  107. };