MyCom.h 5.4 KB

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