-// MyCom.h\r
-\r
-#ifndef __MYCOM_H\r
-#define __MYCOM_H\r
-\r
-#include "MyWindows.h"\r
-\r
-#define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; }\r
-\r
-template <class T>\r
-class CMyComPtr\r
-{\r
- T* _p;\r
-public:\r
- // typedef T _PtrClass;\r
- CMyComPtr() { _p = NULL;}\r
- CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); }\r
- CMyComPtr(const CMyComPtr<T>& lp)\r
- {\r
- if ((_p = lp._p) != NULL)\r
- _p->AddRef();\r
- }\r
- ~CMyComPtr() { if (_p) _p->Release(); }\r
- void Release() { if (_p) { _p->Release(); _p = NULL; } }\r
- operator T*() const { return (T*)_p; }\r
- // T& operator*() const { return *_p; }\r
- T** operator&() { return &_p; }\r
- T* operator->() const { return _p; }\r
- T* operator=(T* p) \r
- { \r
- if (p != 0)\r
- p->AddRef();\r
- if (_p) \r
- _p->Release();\r
- _p = p;\r
- return p;\r
- }\r
- T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }\r
- bool operator!() const { return (_p == NULL); }\r
- // bool operator==(T* pT) const { return _p == pT; }\r
- // Compare two objects for equivalence\r
- void Attach(T* p2)\r
- {\r
- Release();\r
- _p = p2;\r
- }\r
- T* Detach()\r
- {\r
- T* pt = _p;\r
- _p = NULL;\r
- return pt;\r
- }\r
- #ifdef _WIN32\r
- HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)\r
- {\r
- return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);\r
- }\r
- #endif\r
- /*\r
- HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)\r
- {\r
- CLSID clsid;\r
- HRESULT hr = CLSIDFromProgID(szProgID, &clsid);\r
- ATLASSERT(_p == NULL);\r
- if (SUCCEEDED(hr))\r
- hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);\r
- return hr;\r
- }\r
- */\r
- template <class Q>\r
- HRESULT QueryInterface(REFGUID iid, Q** pp) const\r
- {\r
- return _p->QueryInterface(iid, (void**)pp);\r
- }\r
-};\r
-\r
-//////////////////////////////////////////////////////////\r
-\r
-class CMyComBSTR\r
-{\r
-public:\r
- BSTR m_str;\r
- CMyComBSTR() { m_str = NULL; }\r
- CMyComBSTR(LPCOLESTR pSrc) { m_str = ::SysAllocString(pSrc); }\r
- // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }\r
- // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); }\r
- CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }\r
- /*\r
- CMyComBSTR(REFGUID src)\r
- {\r
- LPOLESTR szGuid;\r
- StringFromCLSID(src, &szGuid);\r
- m_str = ::SysAllocString(szGuid);\r
- CoTaskMemFree(szGuid);\r
- }\r
- */\r
- ~CMyComBSTR() { ::SysFreeString(m_str); }\r
- CMyComBSTR& operator=(const CMyComBSTR& src)\r
- {\r
- if (m_str != src.m_str)\r
- {\r
- if (m_str)\r
- ::SysFreeString(m_str);\r
- m_str = src.MyCopy();\r
- }\r
- return *this;\r
- }\r
- CMyComBSTR& operator=(LPCOLESTR pSrc)\r
- {\r
- ::SysFreeString(m_str);\r
- m_str = ::SysAllocString(pSrc);\r
- return *this;\r
- }\r
- unsigned int Length() const { return ::SysStringLen(m_str); }\r
- operator BSTR() const { return m_str; }\r
- BSTR* operator&() { return &m_str; }\r
- BSTR MyCopy() const \r
- { \r
- int byteLen = ::SysStringByteLen(m_str);\r
- BSTR res = ::SysAllocStringByteLen(NULL, byteLen);\r
- memmove(res, m_str, byteLen);\r
- return res;\r
- }\r
- void Attach(BSTR src) { m_str = src; }\r
- BSTR Detach()\r
- {\r
- BSTR s = m_str;\r
- m_str = NULL;\r
- return s;\r
- }\r
- void Empty()\r
- {\r
- ::SysFreeString(m_str);\r
- m_str = NULL;\r
- }\r
- bool operator!() const { return (m_str == NULL); }\r
-};\r
-\r
-\r
-//////////////////////////////////////////////////////////\r
-\r
-class CMyUnknownImp\r
-{\r
-public:\r
- ULONG __m_RefCount;\r
- CMyUnknownImp(): __m_RefCount(0) {}\r
-};\r
-\r
-#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \\r
- (REFGUID iid, void **outObject) { \r
-\r
-#define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \\r
- { *outObject = (void *)(i *)this; AddRef(); return S_OK; }\r
-\r
-#define MY_QUERYINTERFACE_END return E_NOINTERFACE; }\r
-\r
-#define MY_ADDREF_RELEASE \\r
-STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \\r
-STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \\r
- return __m_RefCount; delete this; return 0; }\r
-\r
-#define MY_UNKNOWN_IMP_SPEC(i) \\r
- MY_QUERYINTERFACE_BEGIN \\r
- i \\r
- MY_QUERYINTERFACE_END \\r
- MY_ADDREF_RELEASE\r
-\r
-\r
-#define MY_UNKNOWN_IMP STDMETHOD(QueryInterface)(REFGUID, void **) { \\r
- MY_QUERYINTERFACE_END \\r
- MY_ADDREF_RELEASE\r
-\r
-#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \\r
- MY_QUERYINTERFACE_ENTRY(i) \\r
- )\r
-\r
-#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \\r
- MY_QUERYINTERFACE_ENTRY(i1) \\r
- MY_QUERYINTERFACE_ENTRY(i2) \\r
- )\r
-\r
-#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \\r
- MY_QUERYINTERFACE_ENTRY(i1) \\r
- MY_QUERYINTERFACE_ENTRY(i2) \\r
- MY_QUERYINTERFACE_ENTRY(i3) \\r
- )\r
-\r
-#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \\r
- MY_QUERYINTERFACE_ENTRY(i1) \\r
- MY_QUERYINTERFACE_ENTRY(i2) \\r
- MY_QUERYINTERFACE_ENTRY(i3) \\r
- MY_QUERYINTERFACE_ENTRY(i4) \\r
- )\r
-\r
-#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \\r
- MY_QUERYINTERFACE_ENTRY(i1) \\r
- MY_QUERYINTERFACE_ENTRY(i2) \\r
- MY_QUERYINTERFACE_ENTRY(i3) \\r
- MY_QUERYINTERFACE_ENTRY(i4) \\r
- MY_QUERYINTERFACE_ENTRY(i5) \\r
- )\r
-\r
-#endif\r
+// MyCom.h
+
+#ifndef __MYCOM_H
+#define __MYCOM_H
+
+#include "MyWindows.h"
+
+#define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; }
+
+template <class T>
+class CMyComPtr
+{
+ T* _p;
+public:
+ // typedef T _PtrClass;
+ CMyComPtr() { _p = NULL;}
+ CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); }
+ CMyComPtr(const CMyComPtr<T>& lp)
+ {
+ if ((_p = lp._p) != NULL)
+ _p->AddRef();
+ }
+ ~CMyComPtr() { if (_p) _p->Release(); }
+ void Release() { if (_p) { _p->Release(); _p = NULL; } }
+ operator T*() const { return (T*)_p; }
+ // T& operator*() const { return *_p; }
+ T** operator&() { return &_p; }
+ T* operator->() const { return _p; }
+ T* operator=(T* p)
+ {
+ if (p != 0)
+ p->AddRef();
+ if (_p)
+ _p->Release();
+ _p = p;
+ return p;
+ }
+ T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }
+ bool operator!() const { return (_p == NULL); }
+ // bool operator==(T* pT) const { return _p == pT; }
+ // Compare two objects for equivalence
+ void Attach(T* p2)
+ {
+ Release();
+ _p = p2;
+ }
+ T* Detach()
+ {
+ T* pt = _p;
+ _p = NULL;
+ return pt;
+ }
+ #ifdef _WIN32
+ HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
+ {
+ return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
+ }
+ #endif
+ /*
+ HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
+ {
+ CLSID clsid;
+ HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
+ ATLASSERT(_p == NULL);
+ if (SUCCEEDED(hr))
+ hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);
+ return hr;
+ }
+ */
+ template <class Q>
+ HRESULT QueryInterface(REFGUID iid, Q** pp) const
+ {
+ return _p->QueryInterface(iid, (void**)pp);
+ }
+};
+
+//////////////////////////////////////////////////////////
+
+class CMyComBSTR
+{
+public:
+ BSTR m_str;
+ CMyComBSTR() { m_str = NULL; }
+ CMyComBSTR(LPCOLESTR pSrc) { m_str = ::SysAllocString(pSrc); }
+ // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }
+ // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); }
+ CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
+ /*
+ CMyComBSTR(REFGUID src)
+ {
+ LPOLESTR szGuid;
+ StringFromCLSID(src, &szGuid);
+ m_str = ::SysAllocString(szGuid);
+ CoTaskMemFree(szGuid);
+ }
+ */
+ ~CMyComBSTR() { ::SysFreeString(m_str); }
+ CMyComBSTR& operator=(const CMyComBSTR& src)
+ {
+ if (m_str != src.m_str)
+ {
+ if (m_str)
+ ::SysFreeString(m_str);
+ m_str = src.MyCopy();
+ }
+ return *this;
+ }
+ CMyComBSTR& operator=(LPCOLESTR pSrc)
+ {
+ ::SysFreeString(m_str);
+ m_str = ::SysAllocString(pSrc);
+ return *this;
+ }
+ unsigned int Length() const { return ::SysStringLen(m_str); }
+ operator BSTR() const { return m_str; }
+ BSTR* operator&() { return &m_str; }
+ BSTR MyCopy() const
+ {
+ int byteLen = ::SysStringByteLen(m_str);
+ BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
+ memmove(res, m_str, byteLen);
+ return res;
+ }
+ void Attach(BSTR src) { m_str = src; }
+ BSTR Detach()
+ {
+ BSTR s = m_str;
+ m_str = NULL;
+ return s;
+ }
+ void Empty()
+ {
+ ::SysFreeString(m_str);
+ m_str = NULL;
+ }
+ bool operator!() const { return (m_str == NULL); }
+};
+
+
+//////////////////////////////////////////////////////////
+
+class CMyUnknownImp
+{
+public:
+ ULONG __m_RefCount;
+ CMyUnknownImp(): __m_RefCount(0) {}
+};
+
+#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \
+ (REFGUID iid, void **outObject) {
+
+#define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \
+ { *outObject = (void *)(i *)this; AddRef(); return S_OK; }
+
+#define MY_QUERYINTERFACE_END return E_NOINTERFACE; }
+
+#define MY_ADDREF_RELEASE \
+STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \
+STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \
+ return __m_RefCount; delete this; return 0; }
+
+#define MY_UNKNOWN_IMP_SPEC(i) \
+ MY_QUERYINTERFACE_BEGIN \
+ i \
+ MY_QUERYINTERFACE_END \
+ MY_ADDREF_RELEASE
+
+
+#define MY_UNKNOWN_IMP STDMETHOD(QueryInterface)(REFGUID, void **) { \
+ MY_QUERYINTERFACE_END \
+ MY_ADDREF_RELEASE
+
+#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \
+ MY_QUERYINTERFACE_ENTRY(i) \
+ )
+
+#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \
+ MY_QUERYINTERFACE_ENTRY(i1) \
+ MY_QUERYINTERFACE_ENTRY(i2) \
+ )
+
+#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \
+ MY_QUERYINTERFACE_ENTRY(i1) \
+ MY_QUERYINTERFACE_ENTRY(i2) \
+ MY_QUERYINTERFACE_ENTRY(i3) \
+ )
+
+#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \
+ MY_QUERYINTERFACE_ENTRY(i1) \
+ MY_QUERYINTERFACE_ENTRY(i2) \
+ MY_QUERYINTERFACE_ENTRY(i3) \
+ MY_QUERYINTERFACE_ENTRY(i4) \
+ )
+
+#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \
+ MY_QUERYINTERFACE_ENTRY(i1) \
+ MY_QUERYINTERFACE_ENTRY(i2) \
+ MY_QUERYINTERFACE_ENTRY(i3) \
+ MY_QUERYINTERFACE_ENTRY(i4) \
+ MY_QUERYINTERFACE_ENTRY(i5) \
+ )
+
+#endif