home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 March / CMCD0304.ISO / Software / Freeware / Programare / nullsoft / nsis20.exe / Source / 7zip / Common / MyCom.h < prev    next >
C/C++ Source or Header  |  2003-11-23  |  5KB  |  188 lines

  1. // MyCom.h
  2.  
  3. // #pragma once
  4.  
  5. #ifndef __MYCOM_H
  6. #define __MYCOM_H
  7.  
  8. #define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; }
  9.  
  10. template <class T>
  11. class CMyComPtr
  12. {
  13.   T* _p;
  14. public:
  15.   // typedef T _PtrClass;
  16.   CMyComPtr() { _p = NULL;}
  17.   CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); }
  18.   CMyComPtr(const CMyComPtr<T>& lp)
  19.   {
  20.     if ((_p = lp._p) != NULL)
  21.       _p->AddRef();
  22.   }
  23.   ~CMyComPtr() { if (_p) _p->Release(); }
  24.   void Release() { if (_p) { _p->Release(); _p = NULL; } }
  25.   operator T*() const {  return (T*)_p;  }
  26.   // T& operator*() const {  return *_p; }
  27.   T** operator&() { return &_p; }
  28.   T* operator->() const { return _p; }
  29.   T* operator=(T* p) 
  30.   { 
  31.     if (p != 0)
  32.       p->AddRef();
  33.     if (_p) 
  34.       _p->Release();
  35.     _p = p;
  36.     return p;
  37.   }
  38.   T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }
  39.   bool operator!() const { return (_p == NULL); }
  40.   // bool operator==(T* pT) const {  return _p == pT; }
  41.   // Compare two objects for equivalence
  42.   void Attach(T* p2)
  43.   {
  44.     Release();
  45.     _p = p2;
  46.   }
  47.   T* Detach()
  48.   {
  49.     T* pt = _p;
  50.     _p = NULL;
  51.     return pt;
  52.   }
  53.   HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
  54.   {
  55.     return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
  56.   }
  57.   /*
  58.   HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
  59.   {
  60.     CLSID clsid;
  61.     HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
  62.     ATLASSERT(_p == NULL);
  63.     if (SUCCEEDED(hr))
  64.       hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);
  65.     return hr;
  66.   }
  67.   */
  68.   template <class Q>
  69.   HRESULT QueryInterface(REFGUID iid, Q** pp) const
  70.   {
  71.     return _p->QueryInterface(iid, (void**)pp);
  72.   }
  73. };
  74.  
  75. //////////////////////////////////////////////////////////
  76.  
  77. class CMyComBSTR
  78. {
  79. public:
  80.   BSTR m_str;
  81.   CMyComBSTR() { m_str = NULL; }
  82.   CMyComBSTR(LPCOLESTR pSrc) {  m_str = ::SysAllocString(pSrc);  }
  83.   // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }
  84.   // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize);  }
  85.   CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
  86.   /*
  87.   CMyComBSTR(REFGUID src)
  88.   {
  89.     LPOLESTR szGuid;
  90.     StringFromCLSID(src, &szGuid);
  91.     m_str = ::SysAllocString(szGuid);
  92.     CoTaskMemFree(szGuid);
  93.   }
  94.   */
  95.   ~CMyComBSTR() { ::SysFreeString(m_str); }
  96.   CMyComBSTR& operator=(const CMyComBSTR& src)
  97.   {
  98.     if (m_str != src.m_str)
  99.     {
  100.       if (m_str)
  101.         ::SysFreeString(m_str);
  102.       m_str = src.MyCopy();
  103.     }
  104.     return *this;
  105.   }
  106.   CMyComBSTR& operator=(LPCOLESTR pSrc)
  107.   {
  108.     ::SysFreeString(m_str);
  109.     m_str = ::SysAllocString(pSrc);
  110.     return *this;
  111.   }
  112.   unsigned int Length() const { return ::SysStringLen(m_str); }
  113.   operator BSTR() const { return m_str; }
  114.   BSTR* operator&() { return &m_str; }
  115.   BSTR MyCopy() const 
  116.   { 
  117.     int byteLen = ::SysStringByteLen(m_str);
  118.     BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
  119.     memmove(res, m_str, byteLen);
  120.     return res;
  121.   }
  122.   void Attach(BSTR src) {  m_str = src; }
  123.   BSTR Detach()
  124.   {
  125.     BSTR s = m_str;
  126.     m_str = NULL;
  127.     return s;
  128.   }
  129.   void Empty()
  130.   {
  131.     ::SysFreeString(m_str);
  132.     m_str = NULL;
  133.   }
  134.   bool operator!() const {  return (m_str == NULL); }
  135. };
  136.  
  137.  
  138. //////////////////////////////////////////////////////////
  139.  
  140. class CMyUnknownImp
  141. {
  142. public:
  143.   ULONG __m_RefCount;
  144.   CMyUnknownImp(): __m_RefCount(0) {}
  145. };
  146.  
  147. #define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \
  148.     (REFGUID iid, void **outObject) { 
  149. #define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \
  150.     { *outObject = (void *)(i *)this; AddRef(); return S_OK; }
  151. #define MY_QUERYINTERFACE_END return E_NOINTERFACE; }
  152.  
  153. #define MY_ADDREF_RELEASE \
  154. STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \
  155. STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0)  \
  156.   return __m_RefCount; delete this; return 0; }
  157.  
  158. #define MY_UNKNOWN_IMP_SPEC(i) \
  159.   MY_QUERYINTERFACE_BEGIN \
  160.   i \
  161.   MY_QUERYINTERFACE_END \
  162.   MY_ADDREF_RELEASE
  163.  
  164.  
  165. #define MY_UNKNOWN_IMP MY_UNKNOWN_IMP_SPEC(;)
  166.  
  167. #define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \
  168.   MY_QUERYINTERFACE_ENTRY(i) \
  169.   )
  170.  
  171. #define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \
  172.   MY_QUERYINTERFACE_ENTRY(i1) \
  173.   MY_QUERYINTERFACE_ENTRY(i2) \
  174.   )
  175. #define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \
  176.   MY_QUERYINTERFACE_ENTRY(i1) \
  177.   MY_QUERYINTERFACE_ENTRY(i2) \
  178.   MY_QUERYINTERFACE_ENTRY(i3) \
  179.   )
  180. #define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \
  181.   MY_QUERYINTERFACE_ENTRY(i1) \
  182.   MY_QUERYINTERFACE_ENTRY(i2) \
  183.   MY_QUERYINTERFACE_ENTRY(i3) \
  184.   MY_QUERYINTERFACE_ENTRY(i4) \
  185.   )
  186.  
  187. #endif
  188.