1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/other-licenses/7zstub/src/Common/MyCom.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,203 @@ 1.4 +// MyCom.h 1.5 + 1.6 +#ifndef __MYCOM_H 1.7 +#define __MYCOM_H 1.8 + 1.9 +#include "MyWindows.h" 1.10 + 1.11 +#define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; } 1.12 + 1.13 +template <class T> 1.14 +class CMyComPtr 1.15 +{ 1.16 + T* _p; 1.17 +public: 1.18 + // typedef T _PtrClass; 1.19 + CMyComPtr() { _p = NULL;} 1.20 + CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); } 1.21 + CMyComPtr(const CMyComPtr<T>& lp) 1.22 + { 1.23 + if ((_p = lp._p) != NULL) 1.24 + _p->AddRef(); 1.25 + } 1.26 + ~CMyComPtr() { if (_p) _p->Release(); } 1.27 + void Release() { if (_p) { _p->Release(); _p = NULL; } } 1.28 + operator T*() const { return (T*)_p; } 1.29 + // T& operator*() const { return *_p; } 1.30 + T** operator&() { return &_p; } 1.31 + T* operator->() const { return _p; } 1.32 + T* operator=(T* p) 1.33 + { 1.34 + if (p != 0) 1.35 + p->AddRef(); 1.36 + if (_p) 1.37 + _p->Release(); 1.38 + _p = p; 1.39 + return p; 1.40 + } 1.41 + T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); } 1.42 + bool operator!() const { return (_p == NULL); } 1.43 + // bool operator==(T* pT) const { return _p == pT; } 1.44 + // Compare two objects for equivalence 1.45 + void Attach(T* p2) 1.46 + { 1.47 + Release(); 1.48 + _p = p2; 1.49 + } 1.50 + T* Detach() 1.51 + { 1.52 + T* pt = _p; 1.53 + _p = NULL; 1.54 + return pt; 1.55 + } 1.56 + #ifdef _WIN32 1.57 + HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) 1.58 + { 1.59 + return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p); 1.60 + } 1.61 + #endif 1.62 + /* 1.63 + HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) 1.64 + { 1.65 + CLSID clsid; 1.66 + HRESULT hr = CLSIDFromProgID(szProgID, &clsid); 1.67 + ATLASSERT(_p == NULL); 1.68 + if (SUCCEEDED(hr)) 1.69 + hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p); 1.70 + return hr; 1.71 + } 1.72 + */ 1.73 + template <class Q> 1.74 + HRESULT QueryInterface(REFGUID iid, Q** pp) const 1.75 + { 1.76 + return _p->QueryInterface(iid, (void**)pp); 1.77 + } 1.78 +}; 1.79 + 1.80 +////////////////////////////////////////////////////////// 1.81 + 1.82 +class CMyComBSTR 1.83 +{ 1.84 +public: 1.85 + BSTR m_str; 1.86 + CMyComBSTR() { m_str = NULL; } 1.87 + CMyComBSTR(LPCOLESTR pSrc) { m_str = ::SysAllocString(pSrc); } 1.88 + // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); } 1.89 + // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); } 1.90 + CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); } 1.91 + /* 1.92 + CMyComBSTR(REFGUID src) 1.93 + { 1.94 + LPOLESTR szGuid; 1.95 + StringFromCLSID(src, &szGuid); 1.96 + m_str = ::SysAllocString(szGuid); 1.97 + CoTaskMemFree(szGuid); 1.98 + } 1.99 + */ 1.100 + ~CMyComBSTR() { ::SysFreeString(m_str); } 1.101 + CMyComBSTR& operator=(const CMyComBSTR& src) 1.102 + { 1.103 + if (m_str != src.m_str) 1.104 + { 1.105 + if (m_str) 1.106 + ::SysFreeString(m_str); 1.107 + m_str = src.MyCopy(); 1.108 + } 1.109 + return *this; 1.110 + } 1.111 + CMyComBSTR& operator=(LPCOLESTR pSrc) 1.112 + { 1.113 + ::SysFreeString(m_str); 1.114 + m_str = ::SysAllocString(pSrc); 1.115 + return *this; 1.116 + } 1.117 + unsigned int Length() const { return ::SysStringLen(m_str); } 1.118 + operator BSTR() const { return m_str; } 1.119 + BSTR* operator&() { return &m_str; } 1.120 + BSTR MyCopy() const 1.121 + { 1.122 + int byteLen = ::SysStringByteLen(m_str); 1.123 + BSTR res = ::SysAllocStringByteLen(NULL, byteLen); 1.124 + memmove(res, m_str, byteLen); 1.125 + return res; 1.126 + } 1.127 + void Attach(BSTR src) { m_str = src; } 1.128 + BSTR Detach() 1.129 + { 1.130 + BSTR s = m_str; 1.131 + m_str = NULL; 1.132 + return s; 1.133 + } 1.134 + void Empty() 1.135 + { 1.136 + ::SysFreeString(m_str); 1.137 + m_str = NULL; 1.138 + } 1.139 + bool operator!() const { return (m_str == NULL); } 1.140 +}; 1.141 + 1.142 + 1.143 +////////////////////////////////////////////////////////// 1.144 + 1.145 +class CMyUnknownImp 1.146 +{ 1.147 +public: 1.148 + ULONG __m_RefCount; 1.149 + CMyUnknownImp(): __m_RefCount(0) {} 1.150 +}; 1.151 + 1.152 +#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \ 1.153 + (REFGUID iid, void **outObject) { 1.154 + 1.155 +#define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \ 1.156 + { *outObject = (void *)(i *)this; AddRef(); return S_OK; } 1.157 + 1.158 +#define MY_QUERYINTERFACE_END return E_NOINTERFACE; } 1.159 + 1.160 +#define MY_ADDREF_RELEASE \ 1.161 +STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \ 1.162 +STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \ 1.163 + return __m_RefCount; delete this; return 0; } 1.164 + 1.165 +#define MY_UNKNOWN_IMP_SPEC(i) \ 1.166 + MY_QUERYINTERFACE_BEGIN \ 1.167 + i \ 1.168 + MY_QUERYINTERFACE_END \ 1.169 + MY_ADDREF_RELEASE 1.170 + 1.171 + 1.172 +#define MY_UNKNOWN_IMP STDMETHOD(QueryInterface)(REFGUID, void **) { \ 1.173 + MY_QUERYINTERFACE_END \ 1.174 + MY_ADDREF_RELEASE 1.175 + 1.176 +#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \ 1.177 + MY_QUERYINTERFACE_ENTRY(i) \ 1.178 + ) 1.179 + 1.180 +#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \ 1.181 + MY_QUERYINTERFACE_ENTRY(i1) \ 1.182 + MY_QUERYINTERFACE_ENTRY(i2) \ 1.183 + ) 1.184 + 1.185 +#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \ 1.186 + MY_QUERYINTERFACE_ENTRY(i1) \ 1.187 + MY_QUERYINTERFACE_ENTRY(i2) \ 1.188 + MY_QUERYINTERFACE_ENTRY(i3) \ 1.189 + ) 1.190 + 1.191 +#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \ 1.192 + MY_QUERYINTERFACE_ENTRY(i1) \ 1.193 + MY_QUERYINTERFACE_ENTRY(i2) \ 1.194 + MY_QUERYINTERFACE_ENTRY(i3) \ 1.195 + MY_QUERYINTERFACE_ENTRY(i4) \ 1.196 + ) 1.197 + 1.198 +#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \ 1.199 + MY_QUERYINTERFACE_ENTRY(i1) \ 1.200 + MY_QUERYINTERFACE_ENTRY(i2) \ 1.201 + MY_QUERYINTERFACE_ENTRY(i3) \ 1.202 + MY_QUERYINTERFACE_ENTRY(i4) \ 1.203 + MY_QUERYINTERFACE_ENTRY(i5) \ 1.204 + ) 1.205 + 1.206 +#endif