Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.3 KiB

  1. //*******************************************************************************************
  2. //
  3. // Filename : Unknown.h
  4. //
  5. // Definitions for some customized routines
  6. //
  7. // Copyright (c) 1994 - 1996 Microsoft Corporation. All rights reserved
  8. //
  9. //*******************************************************************************************
  10. #ifndef _UNKNOWN_H_
  11. #define _UNKNOWN_H_
  12. class CUnknown
  13. {
  14. public:
  15. CUnknown() {}
  16. virtual ~CUnknown(); // virtual destructor called from Release
  17. HRESULT QIHelper(REFIID riid, LPVOID *ppvObj, const IID *apiid[], LPUNKNOWN aobj[]);
  18. ULONG AddRefHelper();
  19. ULONG ReleaseHelper();
  20. private:
  21. CRefCount m_cRef;
  22. CRefDll m_cRefDll;
  23. } ;
  24. // Only for ensuring Release in all control paths
  25. class CEnsureRelease
  26. {
  27. public:
  28. CEnsureRelease(IUnknown *pUnk) : m_pUnk(pUnk) {}
  29. ~CEnsureRelease() {if (m_pUnk) m_pUnk->Release();}
  30. operator IUnknown*() {return(m_pUnk);}
  31. void Attach(IUnknown *pUnk) {m_pUnk = pUnk;}
  32. private:
  33. IUnknown *m_pUnk;
  34. } ;
  35. class CObjTemp
  36. {
  37. public:
  38. CObjTemp() : m_hObj(0) {}
  39. ~CObjTemp() {}
  40. operator HANDLE() const {return(m_hObj);}
  41. HANDLE Attach(HANDLE hObjNew) {HANDLE hObj=m_hObj; m_hObj=hObjNew; return(hObj);}
  42. HANDLE Detach() {return(Attach(0));}
  43. protected:
  44. HANDLE m_hObj;
  45. } ;
  46. class CMenuTemp : public CObjTemp
  47. {
  48. public:
  49. CMenuTemp() : CObjTemp() {}
  50. CMenuTemp(HMENU hm) : CObjTemp() {Attach(hm);}
  51. ~CMenuTemp() {if (m_hObj) DestroyMenu(Detach());}
  52. operator HMENU() const {return((HMENU)m_hObj);}
  53. HMENU Attach(HMENU hObjNew) {return((HMENU)CObjTemp::Attach((HANDLE)hObjNew));}
  54. HMENU Detach() {return((HMENU)CObjTemp::Detach());}
  55. BOOL CreatePopupMenu() {Attach(::CreatePopupMenu()); return(m_hObj!=NULL);}
  56. } ;
  57. class CGotGlobal : public CObjTemp
  58. {
  59. public:
  60. CGotGlobal(HGLOBAL hData, IUnknown *pUnk) : m_erData(pUnk) {Attach(hData);}
  61. ~CGotGlobal() {if (!(IUnknown*)m_erData) GlobalFree(m_hObj);}
  62. private:
  63. CEnsureRelease m_erData;
  64. } ;
  65. class CHIDA : public CGotGlobal
  66. {
  67. public:
  68. CHIDA(HGLOBAL hIDA, IUnknown *pUnk) : CGotGlobal(hIDA, pUnk)
  69. {
  70. m_lpIDA = (LPIDA)GlobalLock(hIDA);
  71. }
  72. ~CHIDA() {GlobalUnlock(m_hObj);}
  73. LPCITEMIDLIST operator [](UINT nIndex)
  74. {
  75. if (!m_lpIDA || nIndex>m_lpIDA->cidl)
  76. {
  77. return(NULL);
  78. }
  79. return((LPCITEMIDLIST)(((LPSTR)m_lpIDA)+m_lpIDA->aoffset[nIndex]));
  80. }
  81. int GetCount() {return(m_lpIDA ? m_lpIDA->cidl : 0);}
  82. private:
  83. LPIDA m_lpIDA;
  84. } ;
  85. #endif // _UNKNOWN_H_