00001
00002
00003
00004
00005 #ifndef __MYCOM_H
00006 #define __MYCOM_H
00007
00008 #include "MyWindows.h"
00009
00010 #define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; }
00011
00012 template <class T>
00013 class CMyComPtr
00014 {
00015 T* _p;
00016 public:
00017
00018 CMyComPtr() { _p = NULL;}
00019 CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); }
00020 CMyComPtr(const CMyComPtr<T>& lp)
00021 {
00022 if ((_p = lp._p) != NULL)
00023 _p->AddRef();
00024 }
00025 ~CMyComPtr() { if (_p) _p->Release(); }
00026 void Release() { if (_p) { _p->Release(); _p = NULL; } }
00027 operator T*() const { return (T*)_p; }
00028
00029 T** operator&() { return &_p; }
00030 T* operator->() const { return _p; }
00031 T* operator=(T* p)
00032 {
00033 if (p != 0)
00034 p->AddRef();
00035 if (_p)
00036 _p->Release();
00037 _p = p;
00038 return p;
00039 }
00040 T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }
00041 bool operator!() const { return (_p == NULL); }
00042
00043
00044 void Attach(T* p2)
00045 {
00046 Release();
00047 _p = p2;
00048 }
00049 T* Detach()
00050 {
00051 T* pt = _p;
00052 _p = NULL;
00053 return pt;
00054 }
00055 #ifdef _WIN32
00056 HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
00057 {
00058 return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
00059 }
00060 #endif
00061
00062 template <class Q>
00063 HRESULT QueryInterface(REFGUID iid, Q** pp) const
00064 {
00065 return _p->QueryInterface(iid, (void**)pp);
00066 }
00067 };
00068
00069 class CMyComBSTR
00070 {
00071 public:
00072 BSTR m_str;
00073 CMyComBSTR() { m_str = NULL; }
00074 CMyComBSTR(LPCOLESTR pSrc) { m_str = ::SysAllocString(pSrc); }
00075
00076
00077 CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
00078
00079 ~CMyComBSTR() { ::SysFreeString(m_str); }
00080 CMyComBSTR& operator=(const CMyComBSTR& src)
00081 {
00082 if (m_str != src.m_str)
00083 {
00084 if (m_str)
00085 ::SysFreeString(m_str);
00086 m_str = src.MyCopy();
00087 }
00088 return *this;
00089 }
00090 CMyComBSTR& operator=(LPCOLESTR pSrc)
00091 {
00092 ::SysFreeString(m_str);
00093 m_str = ::SysAllocString(pSrc);
00094 return *this;
00095 }
00096 unsigned int Length() const { return ::SysStringLen(m_str); }
00097 operator BSTR() const { return m_str; }
00098 BSTR* operator&() { return &m_str; }
00099 BSTR MyCopy() const
00100 {
00101 int byteLen = ::SysStringByteLen(m_str);
00102 BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
00103 memmove(res, m_str, byteLen);
00104 return res;
00105 }
00106 void Attach(BSTR src) { m_str = src; }
00107 BSTR Detach()
00108 {
00109 BSTR s = m_str;
00110 m_str = NULL;
00111 return s;
00112 }
00113 void Empty()
00114 {
00115 ::SysFreeString(m_str);
00116 m_str = NULL;
00117 }
00118 bool operator!() const { return (m_str == NULL); }
00119 };
00120
00121 class CMyUnknownImp
00122 {
00123 public:
00124 ULONG __m_RefCount;
00125 CMyUnknownImp(): __m_RefCount(0) {}
00126 };
00127
00128 #define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \
00129 (REFGUID iid, void **outObject) {
00130
00131 #define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \
00132 { *outObject = (void *)(i *)this; AddRef(); return S_OK; }
00133
00134 #define MY_QUERYINTERFACE_END return E_NOINTERFACE; }
00135
00136 #define MY_ADDREF_RELEASE \
00137 STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \
00138 STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \
00139 return __m_RefCount; delete this; return 0; }
00140
00141 #define MY_UNKNOWN_IMP_SPEC(i) \
00142 MY_QUERYINTERFACE_BEGIN \
00143 i \
00144 MY_QUERYINTERFACE_END \
00145 MY_ADDREF_RELEASE
00146
00147 #define MY_UNKNOWN_IMP STDMETHOD(QueryInterface)(REFGUID, void **) { \
00148 MY_QUERYINTERFACE_END \
00149 MY_ADDREF_RELEASE
00150
00151 #define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \
00152 MY_QUERYINTERFACE_ENTRY(i) \
00153 )
00154
00155 #define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \
00156 MY_QUERYINTERFACE_ENTRY(i1) \
00157 MY_QUERYINTERFACE_ENTRY(i2) \
00158 )
00159
00160 #define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \
00161 MY_QUERYINTERFACE_ENTRY(i1) \
00162 MY_QUERYINTERFACE_ENTRY(i2) \
00163 MY_QUERYINTERFACE_ENTRY(i3) \
00164 )
00165
00166 #define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \
00167 MY_QUERYINTERFACE_ENTRY(i1) \
00168 MY_QUERYINTERFACE_ENTRY(i2) \
00169 MY_QUERYINTERFACE_ENTRY(i3) \
00170 MY_QUERYINTERFACE_ENTRY(i4) \
00171 )
00172
00173 #define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \
00174 MY_QUERYINTERFACE_ENTRY(i1) \
00175 MY_QUERYINTERFACE_ENTRY(i2) \
00176 MY_QUERYINTERFACE_ENTRY(i3) \
00177 MY_QUERYINTERFACE_ENTRY(i4) \
00178 MY_QUERYINTERFACE_ENTRY(i5) \
00179 )
00180
00181 #endif