Annotation of elwix/tools/oldlzma/SRC/Common/MyCom.h, revision 1.1
1.1 ! misho 1: // MyCom.h
! 2:
! 3: #ifndef __MYCOM_H
! 4: #define __MYCOM_H
! 5:
! 6: #include "MyWindows.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: #ifdef _WIN32
! 54: HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
! 55: {
! 56: return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
! 57: }
! 58: #endif
! 59: /*
! 60: HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
! 61: {
! 62: CLSID clsid;
! 63: HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
! 64: ATLASSERT(_p == NULL);
! 65: if (SUCCEEDED(hr))
! 66: hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);
! 67: return hr;
! 68: }
! 69: */
! 70: template <class Q>
! 71: HRESULT QueryInterface(REFGUID iid, Q** pp) const
! 72: {
! 73: return _p->QueryInterface(iid, (void**)pp);
! 74: }
! 75: };
! 76:
! 77: //////////////////////////////////////////////////////////
! 78:
! 79: class CMyComBSTR
! 80: {
! 81: public:
! 82: BSTR m_str;
! 83: CMyComBSTR() { m_str = NULL; }
! 84: CMyComBSTR(LPCOLESTR pSrc) { m_str = ::SysAllocString(pSrc); }
! 85: // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }
! 86: // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); }
! 87: CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
! 88: /*
! 89: CMyComBSTR(REFGUID src)
! 90: {
! 91: LPOLESTR szGuid;
! 92: StringFromCLSID(src, &szGuid);
! 93: m_str = ::SysAllocString(szGuid);
! 94: CoTaskMemFree(szGuid);
! 95: }
! 96: */
! 97: ~CMyComBSTR() { ::SysFreeString(m_str); }
! 98: CMyComBSTR& operator=(const CMyComBSTR& src)
! 99: {
! 100: if (m_str != src.m_str)
! 101: {
! 102: if (m_str)
! 103: ::SysFreeString(m_str);
! 104: m_str = src.MyCopy();
! 105: }
! 106: return *this;
! 107: }
! 108: CMyComBSTR& operator=(LPCOLESTR pSrc)
! 109: {
! 110: ::SysFreeString(m_str);
! 111: m_str = ::SysAllocString(pSrc);
! 112: return *this;
! 113: }
! 114: unsigned int Length() const { return ::SysStringLen(m_str); }
! 115: operator BSTR() const { return m_str; }
! 116: BSTR* operator&() { return &m_str; }
! 117: BSTR MyCopy() const
! 118: {
! 119: int byteLen = ::SysStringByteLen(m_str);
! 120: BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
! 121: memmove(res, m_str, byteLen);
! 122: return res;
! 123: }
! 124: void Attach(BSTR src) { m_str = src; }
! 125: BSTR Detach()
! 126: {
! 127: BSTR s = m_str;
! 128: m_str = NULL;
! 129: return s;
! 130: }
! 131: void Empty()
! 132: {
! 133: ::SysFreeString(m_str);
! 134: m_str = NULL;
! 135: }
! 136: bool operator!() const { return (m_str == NULL); }
! 137: };
! 138:
! 139:
! 140: //////////////////////////////////////////////////////////
! 141:
! 142: class CMyUnknownImp
! 143: {
! 144: public:
! 145: ULONG __m_RefCount;
! 146: CMyUnknownImp(): __m_RefCount(0) {}
! 147: };
! 148:
! 149: #define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \
! 150: (REFGUID iid, void **outObject) {
! 151:
! 152: #define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \
! 153: { *outObject = (void *)(i *)this; AddRef(); return S_OK; }
! 154:
! 155: #define MY_QUERYINTERFACE_END return E_NOINTERFACE; }
! 156:
! 157: #define MY_ADDREF_RELEASE \
! 158: STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \
! 159: STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \
! 160: return __m_RefCount; delete this; return 0; }
! 161:
! 162: #define MY_UNKNOWN_IMP_SPEC(i) \
! 163: MY_QUERYINTERFACE_BEGIN \
! 164: i \
! 165: MY_QUERYINTERFACE_END \
! 166: MY_ADDREF_RELEASE
! 167:
! 168:
! 169: #define MY_UNKNOWN_IMP MY_UNKNOWN_IMP_SPEC(;)
! 170:
! 171: #define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \
! 172: MY_QUERYINTERFACE_ENTRY(i) \
! 173: )
! 174:
! 175: #define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \
! 176: MY_QUERYINTERFACE_ENTRY(i1) \
! 177: MY_QUERYINTERFACE_ENTRY(i2) \
! 178: )
! 179:
! 180: #define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \
! 181: MY_QUERYINTERFACE_ENTRY(i1) \
! 182: MY_QUERYINTERFACE_ENTRY(i2) \
! 183: MY_QUERYINTERFACE_ENTRY(i3) \
! 184: )
! 185:
! 186: #define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \
! 187: MY_QUERYINTERFACE_ENTRY(i1) \
! 188: MY_QUERYINTERFACE_ENTRY(i2) \
! 189: MY_QUERYINTERFACE_ENTRY(i3) \
! 190: MY_QUERYINTERFACE_ENTRY(i4) \
! 191: )
! 192:
! 193: #define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \
! 194: MY_QUERYINTERFACE_ENTRY(i1) \
! 195: MY_QUERYINTERFACE_ENTRY(i2) \
! 196: MY_QUERYINTERFACE_ENTRY(i3) \
! 197: MY_QUERYINTERFACE_ENTRY(i4) \
! 198: MY_QUERYINTERFACE_ENTRY(i5) \
! 199: )
! 200:
! 201: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>