| 1 | 
 /** | 
 
 
 
 
 
 | 2 | 
  * This file has no copyright assigned and is placed in the Public Domain. | 
 
 
 
 
 
 | 3 | 
  * This file is part of the mingw-w64 runtime package. | 
 
 
 
 
 
 | 4 | 
  * No warranty is given; refer to the file DISCLAIMER.PD within this package. | 
 
 
 
 
 
 | 5 | 
  */ | 
 
 
 
 
 
 | 6 | 
 #ifndef _INC_COMIP | 
 
 
 
 
 
 | 7 | 
 #define _INC_COMIP | 
 
 
 
 
 
 | 8 | 
  | 
 
 
 
 
 
 | 9 | 
 #include <_mingw.h> | 
 
 
 
 
 
 | 10 | 
  | 
 
 
 
 
 
 | 11 | 
 #include <ole2.h> | 
 
 
 
 
 
 | 12 | 
 #include <malloc.h> | 
 
 
 
 
 
 | 13 | 
  | 
 
 
 
 
 
 | 14 | 
 #include <comutil.h> | 
 
 
 
 
 
 | 15 | 
  | 
 
 
 
 
 
 | 16 | 
 #ifdef __cplusplus | 
 
 
 
 
 
 | 17 | 
  | 
 
 
 
 
 
 | 18 | 
 #pragma push_macro("new") | 
 
 
 
 
 
 | 19 | 
 #undef new | 
 
 
 
 
 
 | 20 | 
  | 
 
 
 
 
 
 | 21 | 
 #include <new.h> | 
 
 
 
 
 
 | 22 | 
  | 
 
 
 
 
 
 | 23 | 
 class _com_error; | 
 
 
 
 
 
 | 24 | 
  | 
 
 
 
 
 
 | 25 | 
 #ifndef WINAPI | 
 
 
 
 
 
 | 26 | 
 #if defined(_ARM_) | 
 
 
 
 
 
 | 27 | 
 #define WINAPI | 
 
 
 
 
 
 | 28 | 
 #else | 
 
 
 
 
 
 | 29 | 
 #define WINAPI __stdcall | 
 
 
 
 
 
 | 30 | 
 #endif | 
 
 
 
 
 
 | 31 | 
 #endif | 
 
 
 
 
 
 | 32 | 
  | 
 
 
 
 
 
 | 33 | 
 void WINAPI _com_issue_error(HRESULT); | 
 
 
 
 
 
 | 34 | 
 struct IUnknown; | 
 
 
 
 
 
 | 35 | 
  | 
 
 
 
 
 
 | 36 | 
 template<typename _Interface,const IID *_IID > | 
 
 
 
 
 
 | 37 | 
 class _com_IIID { | 
 
 
 
 
 
 | 38 | 
 public: | 
 
 
 
 
 
 | 39 | 
   typedef _Interface Interface; | 
 
 
 
 
 
 | 40 | 
   static _Interface *GetInterfacePtr() throw() { return NULL; } | 
 
 
 
 
 
 | 41 | 
   static _Interface& GetInterface() throw() { return *GetInterfacePtr(); } | 
 
 
 
 
 
 | 42 | 
   static const IID& GetIID() throw() { return *_IID; } | 
 
 
 
 
 
 | 43 | 
 }; | 
 
 
 
 
 
 | 44 | 
  | 
 
 
 
 
 
 | 45 | 
 /* This is needed for _COM_SMARTPTR_TYPEDEF using emulated __uuidof. Since we can't pass | 
 
 
 
 
 
 | 46 | 
  * IID as a template argument, it's passed as a wrapper function. */ | 
 
 
 
 
 
 | 47 | 
 template<typename _Interface,const IID &(*iid_getter)() > | 
 
 
 
 
 
 | 48 | 
 class _com_IIID_getter { | 
 
 
 
 
 
 | 49 | 
 public: | 
 
 
 
 
 
 | 50 | 
   typedef _Interface Interface; | 
 
 
 
 
 
 | 51 | 
   static _Interface *GetInterfacePtr() throw() { return NULL; } | 
 
 
 
 
 
 | 52 | 
   static _Interface& GetInterface() throw() { return *GetInterfacePtr(); } | 
 
 
 
 
 
 | 53 | 
   static const IID& GetIID() throw() { return iid_getter(); } | 
 
 
 
 
 
 | 54 | 
 }; | 
 
 
 
 
 
 | 55 | 
  | 
 
 
 
 
 
 | 56 | 
 template<typename _IIID> class _com_ptr_t { | 
 
 
 
 
 
 | 57 | 
 public: | 
 
 
 
 
 
 | 58 | 
   typedef _IIID ThisIIID; | 
 
 
 
 
 
 | 59 | 
   typedef typename _IIID::Interface Interface; | 
 
 
 
 
 
 | 60 | 
   static const IID& GetIID() throw() { return ThisIIID::GetIID(); } | 
 
 
 
 
 
 | 61 | 
   template<typename _OtherIID> _com_ptr_t(const _com_ptr_t<_OtherIID> &p) : m_pInterface(NULL) { | 
 
 
 
 
 
 | 62 | 
     HRESULT hr = _QueryInterface(p); | 
 
 
 
 
 
 | 63 | 
     if(FAILED(hr) && (hr!=E_NOINTERFACE)) { _com_issue_error(hr); } | 
 
 
 
 
 
 | 64 | 
   } | 
 
 
 
 
 
 | 65 | 
   template<typename _InterfaceType> _com_ptr_t(_InterfaceType *p) : m_pInterface(NULL) { | 
 
 
 
 
 
 | 66 | 
     HRESULT hr = _QueryInterface(p); | 
 
 
 
 
 
 | 67 | 
     if(FAILED(hr) && (hr!=E_NOINTERFACE)) { _com_issue_error(hr); } | 
 
 
 
 
 
 | 68 | 
   } | 
 
 
 
 
 
 | 69 | 
   _com_ptr_t(LPSTR str) { new(this) _com_ptr_t(static_cast<LPCSTR> (str),NULL); } | 
 
 
 
 
 
 | 70 | 
   _com_ptr_t(LPWSTR str) { new(this) _com_ptr_t(static_cast<LPCWSTR> (str),NULL); } | 
 
 
 
 
 
 | 71 | 
   explicit _com_ptr_t(_com_ptr_t *p) : m_pInterface(NULL) { | 
 
 
 
 
 
 | 72 | 
     if(!p) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 73 | 
     else { | 
 
 
 
 
 
 | 74 | 
       m_pInterface = p->m_pInterface; | 
 
 
 
 
 
 | 75 | 
       AddRef(); | 
 
 
 
 
 
 | 76 | 
     } | 
 
 
 
 
 
 | 77 | 
   } | 
 
 
 
 
 
 | 78 | 
   _com_ptr_t() throw() : m_pInterface(NULL) { } | 
 
 
 
 
 
 | 79 | 
   _com_ptr_t(int null) : m_pInterface(NULL) { | 
 
 
 
 
 
 | 80 | 
     if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 81 | 
   } | 
 
 
 
 
 
 | 82 | 
  | 
 
 
 
 
 
 | 83 | 
 #ifdef _NATIVE_NULLPTR_SUPPORTED | 
 
 
 
 
 
 | 84 | 
   _com_ptr_t(decltype(nullptr)) : m_pInterface(NULL) {} | 
 
 
 
 
 
 | 85 | 
 #endif | 
 
 
 
 
 
 | 86 | 
  | 
 
 
 
 
 
 | 87 | 
   _com_ptr_t(const _com_ptr_t &cp) throw() : m_pInterface(cp.m_pInterface) { _AddRef(); } | 
 
 
 
 
 
 | 88 | 
   _com_ptr_t(Interface *pInterface) throw() : m_pInterface(pInterface) { _AddRef(); } | 
 
 
 
 
 
 | 89 | 
   _com_ptr_t(Interface *pInterface,bool fAddRef) throw() : m_pInterface(pInterface) { | 
 
 
 
 
 
 | 90 | 
     if(fAddRef) _AddRef(); | 
 
 
 
 
 
 | 91 | 
   } | 
 
 
 
 
 
 | 92 | 
   _com_ptr_t(const _variant_t& varSrc) : m_pInterface(NULL) { | 
 
 
 
 
 
 | 93 | 
     HRESULT hr = QueryStdInterfaces(varSrc); | 
 
 
 
 
 
 | 94 | 
     if(FAILED(hr) && (hr!=E_NOINTERFACE)) { _com_issue_error(hr); } | 
 
 
 
 
 
 | 95 | 
   } | 
 
 
 
 
 
 | 96 | 
   explicit _com_ptr_t(const CLSID &clsid,IUnknown *pOuter = NULL,DWORD dwClsContext = CLSCTX_ALL) : m_pInterface(NULL) { | 
 
 
 
 
 
 | 97 | 
     HRESULT hr = CreateInstance(clsid,pOuter,dwClsContext); | 
 
 
 
 
 
 | 98 | 
     if(FAILED(hr) && (hr!=E_NOINTERFACE)) { _com_issue_error(hr); } | 
 
 
 
 
 
 | 99 | 
   } | 
 
 
 
 
 
 | 100 | 
   explicit _com_ptr_t(LPCWSTR str,IUnknown *pOuter = NULL,DWORD dwClsContext = CLSCTX_ALL) : m_pInterface(NULL) { | 
 
 
 
 
 
 | 101 | 
     HRESULT hr = CreateInstance(str,pOuter,dwClsContext); | 
 
 
 
 
 
 | 102 | 
     if(FAILED(hr) && (hr!=E_NOINTERFACE)) { _com_issue_error(hr); } | 
 
 
 
 
 
 | 103 | 
   } | 
 
 
 
 
 
 | 104 | 
   explicit _com_ptr_t(LPCSTR str,IUnknown *pOuter = NULL,DWORD dwClsContext = CLSCTX_ALL) : m_pInterface(NULL) { | 
 
 
 
 
 
 | 105 | 
     HRESULT hr = CreateInstance(str,pOuter,dwClsContext); | 
 
 
 
 
 
 | 106 | 
     if(FAILED(hr) && (hr!=E_NOINTERFACE)) { _com_issue_error(hr); } | 
 
 
 
 
 
 | 107 | 
   } | 
 
 
 
 
 
 | 108 | 
   template<typename _OtherIID> _com_ptr_t &operator=(const _com_ptr_t<_OtherIID> &p) { | 
 
 
 
 
 
 | 109 | 
     HRESULT hr = _QueryInterface(p); | 
 
 
 
 
 
 | 110 | 
     if(FAILED(hr) && (hr!=E_NOINTERFACE)) { _com_issue_error(hr); } | 
 
 
 
 
 
 | 111 | 
     return *this; | 
 
 
 
 
 
 | 112 | 
   } | 
 
 
 
 
 
 | 113 | 
   template<typename _InterfaceType> _com_ptr_t &operator=(_InterfaceType *p) { | 
 
 
 
 
 
 | 114 | 
     HRESULT hr = _QueryInterface(p); | 
 
 
 
 
 
 | 115 | 
     if(FAILED(hr) && (hr!=E_NOINTERFACE)) { _com_issue_error(hr); } | 
 
 
 
 
 
 | 116 | 
     return *this; | 
 
 
 
 
 
 | 117 | 
   } | 
 
 
 
 
 
 | 118 | 
   _com_ptr_t &operator=(Interface *pInterface) throw() { | 
 
 
 
 
 
 | 119 | 
     if(m_pInterface!=pInterface) { | 
 
 
 
 
 
 | 120 | 
       Interface *pOldInterface = m_pInterface; | 
 
 
 
 
 
 | 121 | 
       m_pInterface = pInterface; | 
 
 
 
 
 
 | 122 | 
       _AddRef(); | 
 
 
 
 
 
 | 123 | 
       if(pOldInterface!=NULL) pOldInterface->Release(); | 
 
 
 
 
 
 | 124 | 
     } | 
 
 
 
 
 
 | 125 | 
     return *this; | 
 
 
 
 
 
 | 126 | 
   } | 
 
 
 
 
 
 | 127 | 
   _com_ptr_t &operator=(const _com_ptr_t &cp) throw() { return operator=(cp.m_pInterface); } | 
 
 
 
 
 
 | 128 | 
   _com_ptr_t &operator=(int null) { | 
 
 
 
 
 
 | 129 | 
     if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 130 | 
     return operator=(reinterpret_cast<Interface*>(NULL)); | 
 
 
 
 
 
 | 131 | 
   } | 
 
 
 
 
 
 | 132 | 
   _com_ptr_t &operator=(long long null) { | 
 
 
 
 
 
 | 133 | 
     if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 134 | 
     return operator=(reinterpret_cast<Interface*>(NULL)); | 
 
 
 
 
 
 | 135 | 
   } | 
 
 
 
 
 
 | 136 | 
   _com_ptr_t &operator=(const _variant_t& varSrc) { | 
 
 
 
 
 
 | 137 | 
     HRESULT hr = QueryStdInterfaces(varSrc); | 
 
 
 
 
 
 | 138 | 
     if(FAILED(hr) && (hr!=E_NOINTERFACE)) { _com_issue_error(hr); } | 
 
 
 
 
 
 | 139 | 
     return *this; | 
 
 
 
 
 
 | 140 | 
   } | 
 
 
 
 
 
 | 141 | 
   ~_com_ptr_t() throw() { _Release(); } | 
 
 
 
 
 
 | 142 | 
   void Attach(Interface *pInterface) throw() { | 
 
 
 
 
 
 | 143 | 
     _Release(); | 
 
 
 
 
 
 | 144 | 
     m_pInterface = pInterface; | 
 
 
 
 
 
 | 145 | 
   } | 
 
 
 
 
 
 | 146 | 
   void Attach(Interface *pInterface,bool fAddRef) throw() { | 
 
 
 
 
 
 | 147 | 
     _Release(); | 
 
 
 
 
 
 | 148 | 
     m_pInterface = pInterface; | 
 
 
 
 
 
 | 149 | 
     if(fAddRef) { | 
 
 
 
 
 
 | 150 | 
       if(!pInterface) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 151 | 
       else pInterface->AddRef(); | 
 
 
 
 
 
 | 152 | 
     } | 
 
 
 
 
 
 | 153 | 
   } | 
 
 
 
 
 
 | 154 | 
   Interface *Detach() throw() { | 
 
 
 
 
 
 | 155 | 
     Interface *const old = m_pInterface; | 
 
 
 
 
 
 | 156 | 
     m_pInterface = NULL; | 
 
 
 
 
 
 | 157 | 
     return old; | 
 
 
 
 
 
 | 158 | 
   } | 
 
 
 
 
 
 | 159 | 
   operator Interface*() const throw() { return m_pInterface; } | 
 
 
 
 
 
 | 160 | 
   operator Interface&() const { | 
 
 
 
 
 
 | 161 | 
     if(!m_pInterface) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 162 | 
     return *m_pInterface; | 
 
 
 
 
 
 | 163 | 
   } | 
 
 
 
 
 
 | 164 | 
   Interface& operator*() const { | 
 
 
 
 
 
 | 165 | 
     if(!m_pInterface) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 166 | 
     return *m_pInterface; | 
 
 
 
 
 
 | 167 | 
   } | 
 
 
 
 
 
 | 168 | 
   Interface **operator&() throw() { | 
 
 
 
 
 
 | 169 | 
     _Release(); | 
 
 
 
 
 
 | 170 | 
     m_pInterface = NULL; | 
 
 
 
 
 
 | 171 | 
     return &m_pInterface; | 
 
 
 
 
 
 | 172 | 
   } | 
 
 
 
 
 
 | 173 | 
   Interface *operator->() const { | 
 
 
 
 
 
 | 174 | 
     if(!m_pInterface) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 175 | 
     return m_pInterface; | 
 
 
 
 
 
 | 176 | 
   } | 
 
 
 
 
 
 | 177 | 
   operator bool() const throw() { return m_pInterface!=NULL; } | 
 
 
 
 
 
 | 178 | 
   template<typename _OtherIID> bool operator==(const _com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)==0; } | 
 
 
 
 
 
 | 179 | 
   template<typename _OtherIID> bool operator==(_com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)==0; } | 
 
 
 
 
 
 | 180 | 
   template<typename _InterfaceType> bool operator==(_InterfaceType *p) { return _CompareUnknown(p)==0; } | 
 
 
 
 
 
 | 181 | 
   bool operator==(Interface *p) { return (m_pInterface==p) ? true : _CompareUnknown(p)==0; } | 
 
 
 
 
 
 | 182 | 
   bool operator==(const _com_ptr_t &p) throw() { return operator==(p.m_pInterface); } | 
 
 
 
 
 
 | 183 | 
   bool operator==(_com_ptr_t &p) throw() { return operator==(p.m_pInterface); } | 
 
 
 
 
 
 | 184 | 
   bool operator==(int null) { | 
 
 
 
 
 
 | 185 | 
     if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 186 | 
     return !m_pInterface; | 
 
 
 
 
 
 | 187 | 
   } | 
 
 
 
 
 
 | 188 | 
   bool operator==(long long null) { | 
 
 
 
 
 
 | 189 | 
     if(null) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 190 | 
     return !m_pInterface; | 
 
 
 
 
 
 | 191 | 
   } | 
 
 
 
 
 
 | 192 | 
   template<typename _OtherIID> bool operator!=(const _com_ptr_t<_OtherIID> &p) { return !(operator==(p)); } | 
 
 
 
 
 
 | 193 | 
   template<typename _OtherIID> bool operator!=(_com_ptr_t<_OtherIID> &p) { return !(operator==(p)); } | 
 
 
 
 
 
 | 194 | 
   template<typename _InterfaceType> bool operator!=(_InterfaceType *p) { return !(operator==(p)); } | 
 
 
 
 
 
 | 195 | 
   bool operator!=(int null) { return !(operator==(null)); } | 
 
 
 
 
 
 | 196 | 
   bool operator!=(long long null) { return !(operator==(null)); } | 
 
 
 
 
 
 | 197 | 
   template<typename _OtherIID> bool operator<(const _com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)<0; } | 
 
 
 
 
 
 | 198 | 
   template<typename _OtherIID> bool operator<(_com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)<0; } | 
 
 
 
 
 
 | 199 | 
   template<typename _InterfaceType> bool operator<(_InterfaceType *p) { return _CompareUnknown(p)<0; } | 
 
 
 
 
 
 | 200 | 
   template<typename _OtherIID> bool operator>(const _com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)>0; } | 
 
 
 
 
 
 | 201 | 
   template<typename _OtherIID> bool operator>(_com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)>0; } | 
 
 
 
 
 
 | 202 | 
   template<typename _InterfaceType> bool operator>(_InterfaceType *p) { return _CompareUnknown(p)>0; } | 
 
 
 
 
 
 | 203 | 
   template<typename _OtherIID> bool operator<=(const _com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)<=0; } | 
 
 
 
 
 
 | 204 | 
   template<typename _OtherIID> bool operator<=(_com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)<=0; } | 
 
 
 
 
 
 | 205 | 
   template<typename _InterfaceType> bool operator<=(_InterfaceType *p) { return _CompareUnknown(p)<=0; } | 
 
 
 
 
 
 | 206 | 
   template<typename _OtherIID> bool operator>=(const _com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)>=0; } | 
 
 
 
 
 
 | 207 | 
   template<typename _OtherIID> bool operator>=(_com_ptr_t<_OtherIID> &p) { return _CompareUnknown(p)>=0; } | 
 
 
 
 
 
 | 208 | 
   template<typename _InterfaceType> bool operator>=(_InterfaceType *p) { return _CompareUnknown(p)>=0; } | 
 
 
 
 
 
 | 209 | 
   void Release() { | 
 
 
 
 
 
 | 210 | 
     if(!m_pInterface) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 211 | 
     else { | 
 
 
 
 
 
 | 212 | 
       m_pInterface->Release(); | 
 
 
 
 
 
 | 213 | 
       m_pInterface = NULL; | 
 
 
 
 
 
 | 214 | 
     } | 
 
 
 
 
 
 | 215 | 
   } | 
 
 
 
 
 
 | 216 | 
   void AddRef() { | 
 
 
 
 
 
 | 217 | 
     if(!m_pInterface) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 218 | 
     else m_pInterface->AddRef(); | 
 
 
 
 
 
 | 219 | 
   } | 
 
 
 
 
 
 | 220 | 
   Interface *GetInterfacePtr() const throw() { return m_pInterface; } | 
 
 
 
 
 
 | 221 | 
   Interface*& GetInterfacePtr() throw() { return m_pInterface; } | 
 
 
 
 
 
 | 222 | 
   HRESULT CreateInstance(const CLSID &rclsid,IUnknown *pOuter = NULL,DWORD dwClsContext = CLSCTX_ALL) throw() { | 
 
 
 
 
 
 | 223 | 
     HRESULT hr; | 
 
 
 
 
 
 | 224 | 
     _Release(); | 
 
 
 
 
 
 | 225 | 
     if(dwClsContext & (CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)) { | 
 
 
 
 
 
 | 226 | 
       IUnknown *pIUnknown; | 
 
 
 
 
 
 | 227 | 
       hr = CoCreateInstance(rclsid,pOuter,dwClsContext,__uuidof(IUnknown),reinterpret_cast<void**>(&pIUnknown)); | 
 
 
 
 
 
 | 228 | 
       if(SUCCEEDED(hr)) { | 
 
 
 
 
 
 | 229 | 
         hr = OleRun(pIUnknown); | 
 
 
 
 
 
 | 230 | 
         if(SUCCEEDED(hr)) hr = pIUnknown->QueryInterface(GetIID(),reinterpret_cast<void**>(&m_pInterface)); | 
 
 
 
 
 
 | 231 | 
         pIUnknown->Release(); | 
 
 
 
 
 
 | 232 | 
       } | 
 
 
 
 
 
 | 233 | 
     } else hr = CoCreateInstance(rclsid,pOuter,dwClsContext,GetIID(),reinterpret_cast<void**>(&m_pInterface)); | 
 
 
 
 
 
 | 234 | 
     if(FAILED(hr)) m_pInterface = NULL; | 
 
 
 
 
 
 | 235 | 
     return hr; | 
 
 
 
 
 
 | 236 | 
   } | 
 
 
 
 
 
 | 237 | 
   HRESULT CreateInstance(LPCWSTR clsidString,IUnknown *pOuter = NULL,DWORD dwClsContext = CLSCTX_ALL) throw() { | 
 
 
 
 
 
 | 238 | 
     if(!clsidString) return E_INVALIDARG; | 
 
 
 
 
 
 | 239 | 
     CLSID clsid; | 
 
 
 
 
 
 | 240 | 
     HRESULT hr; | 
 
 
 
 
 
 | 241 | 
     if(clsidString[0]==L'{') hr = CLSIDFromString(const_cast<LPWSTR> (clsidString),&clsid); | 
 
 
 
 
 
 | 242 | 
     else hr = CLSIDFromProgID(const_cast<LPWSTR> (clsidString),&clsid); | 
 
 
 
 
 
 | 243 | 
     if(FAILED(hr)) return hr; | 
 
 
 
 
 
 | 244 | 
     return CreateInstance(clsid,pOuter,dwClsContext); | 
 
 
 
 
 
 | 245 | 
   } | 
 
 
 
 
 
 | 246 | 
   HRESULT CreateInstance(LPCSTR clsidStringA,IUnknown *pOuter = NULL,DWORD dwClsContext = CLSCTX_ALL) throw() { | 
 
 
 
 
 
 | 247 | 
     if(!clsidStringA) return E_INVALIDARG; | 
 
 
 
 
 
 | 248 | 
     int size = lstrlenA(clsidStringA) + 1; | 
 
 
 
 
 
 | 249 | 
     int destSize = MultiByteToWideChar(CP_ACP,0,clsidStringA,size,NULL,0); | 
 
 
 
 
 
 | 250 | 
     if(destSize==0) return HRESULT_FROM_WIN32(GetLastError()); | 
 
 
 
 
 
 | 251 | 
     LPWSTR clsidStringW; | 
 
 
 
 
 
 | 252 | 
     clsidStringW = static_cast<LPWSTR>(_malloca(destSize*sizeof(WCHAR))); | 
 
 
 
 
 
 | 253 | 
     if(!clsidStringW) return E_OUTOFMEMORY; | 
 
 
 
 
 
 | 254 | 
     if(MultiByteToWideChar(CP_ACP,0,clsidStringA,size,clsidStringW,destSize)==0) { | 
 
 
 
 
 
 | 255 | 
       _freea(clsidStringW); | 
 
 
 
 
 
 | 256 | 
       return HRESULT_FROM_WIN32(GetLastError()); | 
 
 
 
 
 
 | 257 | 
     } | 
 
 
 
 
 
 | 258 | 
     HRESULT hr=CreateInstance(clsidStringW,pOuter,dwClsContext); | 
 
 
 
 
 
 | 259 | 
     _freea(clsidStringW); | 
 
 
 
 
 
 | 260 | 
     return hr; | 
 
 
 
 
 
 | 261 | 
   } | 
 
 
 
 
 
 | 262 | 
   HRESULT GetActiveObject(const CLSID &rclsid) throw() { | 
 
 
 
 
 
 | 263 | 
     _Release(); | 
 
 
 
 
 
 | 264 | 
     IUnknown *pIUnknown; | 
 
 
 
 
 
 | 265 | 
     HRESULT hr = ::GetActiveObject(rclsid,NULL,&pIUnknown); | 
 
 
 
 
 
 | 266 | 
     if(SUCCEEDED(hr)) { | 
 
 
 
 
 
 | 267 | 
       hr = pIUnknown->QueryInterface(GetIID(),reinterpret_cast<void**>(&m_pInterface)); | 
 
 
 
 
 
 | 268 | 
       pIUnknown->Release(); | 
 
 
 
 
 
 | 269 | 
     } | 
 
 
 
 
 
 | 270 | 
     if(FAILED(hr)) m_pInterface = NULL; | 
 
 
 
 
 
 | 271 | 
     return hr; | 
 
 
 
 
 
 | 272 | 
   } | 
 
 
 
 
 
 | 273 | 
   HRESULT GetActiveObject(LPCWSTR clsidString) throw() { | 
 
 
 
 
 
 | 274 | 
     if(!clsidString) return E_INVALIDARG; | 
 
 
 
 
 
 | 275 | 
     CLSID clsid; | 
 
 
 
 
 
 | 276 | 
     HRESULT hr; | 
 
 
 
 
 
 | 277 | 
     if(clsidString[0]=='{') hr = CLSIDFromString(const_cast<LPWSTR> (clsidString),&clsid); | 
 
 
 
 
 
 | 278 | 
     else hr = CLSIDFromProgID(const_cast<LPWSTR> (clsidString),&clsid); | 
 
 
 
 
 
 | 279 | 
     if(FAILED(hr)) return hr; | 
 
 
 
 
 
 | 280 | 
     return GetActiveObject(clsid); | 
 
 
 
 
 
 | 281 | 
   } | 
 
 
 
 
 
 | 282 | 
   HRESULT GetActiveObject(LPCSTR clsidStringA) throw() { | 
 
 
 
 
 
 | 283 | 
     if(!clsidStringA) return E_INVALIDARG; | 
 
 
 
 
 
 | 284 | 
     int size = lstrlenA(clsidStringA) + 1; | 
 
 
 
 
 
 | 285 | 
     int destSize = MultiByteToWideChar(CP_ACP,0,clsidStringA,size,NULL,0); | 
 
 
 
 
 
 | 286 | 
     LPWSTR clsidStringW; | 
 
 
 
 
 
 | 287 | 
     try { | 
 
 
 
 
 
 | 288 | 
       clsidStringW = static_cast<LPWSTR>(_alloca(destSize*sizeof(WCHAR))); | 
 
 
 
 
 
 | 289 | 
     } catch (...) { | 
 
 
 
 
 
 | 290 | 
       clsidStringW = NULL; | 
 
 
 
 
 
 | 291 | 
     } | 
 
 
 
 
 
 | 292 | 
     if(!clsidStringW) return E_OUTOFMEMORY; | 
 
 
 
 
 
 | 293 | 
     if(MultiByteToWideChar(CP_ACP,0,clsidStringA,size,clsidStringW,destSize)==0) return HRESULT_FROM_WIN32(GetLastError()); | 
 
 
 
 
 
 | 294 | 
     return GetActiveObject(clsidStringW); | 
 
 
 
 
 
 | 295 | 
   } | 
 
 
 
 
 
 | 296 | 
   template<typename _InterfaceType> HRESULT QueryInterface(const IID& iid,_InterfaceType*& p) throw () { | 
 
 
 
 
 
 | 297 | 
     if(m_pInterface!=NULL) return m_pInterface->QueryInterface(iid,reinterpret_cast<void**>(&p)); | 
 
 
 
 
 
 | 298 | 
     return E_POINTER; | 
 
 
 
 
 
 | 299 | 
   } | 
 
 
 
 
 
 | 300 | 
   template<typename _InterfaceType> HRESULT QueryInterface(const IID& iid,_InterfaceType **p) throw() { return QueryInterface(iid,*p); } | 
 
 
 
 
 
 | 301 | 
 private: | 
 
 
 
 
 
 | 302 | 
   Interface *m_pInterface; | 
 
 
 
 
 
 | 303 | 
   void _Release() throw() { | 
 
 
 
 
 
 | 304 | 
     if(m_pInterface!=NULL) m_pInterface->Release(); | 
 
 
 
 
 
 | 305 | 
   } | 
 
 
 
 
 
 | 306 | 
   void _AddRef() throw() { | 
 
 
 
 
 
 | 307 | 
     if(m_pInterface!=NULL) m_pInterface->AddRef(); | 
 
 
 
 
 
 | 308 | 
   } | 
 
 
 
 
 
 | 309 | 
   template<typename _InterfacePtr> HRESULT _QueryInterface(_InterfacePtr p) throw() { | 
 
 
 
 
 
 | 310 | 
     HRESULT hr; | 
 
 
 
 
 
 | 311 | 
     if(p!=NULL) { | 
 
 
 
 
 
 | 312 | 
       Interface *pInterface; | 
 
 
 
 
 
 | 313 | 
       hr = p->QueryInterface(GetIID(),reinterpret_cast<void**>(&pInterface)); | 
 
 
 
 
 
 | 314 | 
       Attach(SUCCEEDED(hr)? pInterface: NULL); | 
 
 
 
 
 
 | 315 | 
     } else { | 
 
 
 
 
 
 | 316 | 
       operator=(static_cast<Interface*>(NULL)); | 
 
 
 
 
 
 | 317 | 
       hr = E_NOINTERFACE; | 
 
 
 
 
 
 | 318 | 
     } | 
 
 
 
 
 
 | 319 | 
     return hr; | 
 
 
 
 
 
 | 320 | 
   } | 
 
 
 
 
 
 | 321 | 
   template<typename _InterfacePtr> int _CompareUnknown(_InterfacePtr p) { | 
 
 
 
 
 
 | 322 | 
     IUnknown *pu1,*pu2; | 
 
 
 
 
 
 | 323 | 
     if(m_pInterface!=NULL) { | 
 
 
 
 
 
 | 324 | 
       HRESULT hr = m_pInterface->QueryInterface(__uuidof(IUnknown),reinterpret_cast<void**>(&pu1)); | 
 
 
 
 
 
 | 325 | 
       if(FAILED(hr)) { | 
 
 
 
 
 
 | 326 | 
         _com_issue_error(hr); | 
 
 
 
 
 
 | 327 | 
         pu1 = NULL; | 
 
 
 
 
 
 | 328 | 
       } else pu1->Release(); | 
 
 
 
 
 
 | 329 | 
     } else pu1 = NULL; | 
 
 
 
 
 
 | 330 | 
     if(p!=NULL) { | 
 
 
 
 
 
 | 331 | 
       HRESULT hr = p->QueryInterface(__uuidof(IUnknown),reinterpret_cast<void**>(&pu2)); | 
 
 
 
 
 
 | 332 | 
       if(FAILED(hr)) { | 
 
 
 
 
 
 | 333 | 
         _com_issue_error(hr); | 
 
 
 
 
 
 | 334 | 
         pu2 = NULL; | 
 
 
 
 
 
 | 335 | 
       } else pu2->Release(); | 
 
 
 
 
 
 | 336 | 
     } else pu2 = NULL; | 
 
 
 
 
 
 | 337 | 
     return pu1 - pu2; | 
 
 
 
 
 
 | 338 | 
   } | 
 
 
 
 
 
 | 339 | 
   HRESULT QueryStdInterfaces(const _variant_t& varSrc) throw() { | 
 
 
 
 
 
 | 340 | 
     if(V_VT(&varSrc)==VT_DISPATCH) return _QueryInterface(V_DISPATCH(&varSrc)); | 
 
 
 
 
 
 | 341 | 
     if(V_VT(&varSrc)==VT_UNKNOWN) return _QueryInterface(V_UNKNOWN(&varSrc)); | 
 
 
 
 
 
 | 342 | 
     VARIANT varDest; | 
 
 
 
 
 
 | 343 | 
     VariantInit(&varDest); | 
 
 
 
 
 
 | 344 | 
     HRESULT hr = VariantChangeType(&varDest,const_cast<VARIANT*>(static_cast<const VARIANT*>(&varSrc)),0,VT_DISPATCH); | 
 
 
 
 
 
 | 345 | 
     if(SUCCEEDED(hr)) hr = _QueryInterface(V_DISPATCH(&varSrc)); | 
 
 
 
 
 
 | 346 | 
     if(hr==E_NOINTERFACE) { | 
 
 
 
 
 
 | 347 | 
       VariantInit(&varDest); | 
 
 
 
 
 
 | 348 | 
       hr = VariantChangeType(&varDest,const_cast<VARIANT*>(static_cast<const VARIANT*>(&varSrc)),0,VT_UNKNOWN); | 
 
 
 
 
 
 | 349 | 
       if(SUCCEEDED(hr)) hr = _QueryInterface(V_UNKNOWN(&varSrc)); | 
 
 
 
 
 
 | 350 | 
     } | 
 
 
 
 
 
 | 351 | 
     VariantClear(&varDest); | 
 
 
 
 
 
 | 352 | 
     return hr; | 
 
 
 
 
 
 | 353 | 
   } | 
 
 
 
 
 
 | 354 | 
 }; | 
 
 
 
 
 
 | 355 | 
  | 
 
 
 
 
 
 | 356 | 
 template<typename _InterfaceType> bool operator==(int null,_com_ptr_t<_InterfaceType> &p) { | 
 
 
 
 
 
 | 357 | 
   if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 358 | 
   return !p; | 
 
 
 
 
 
 | 359 | 
 } | 
 
 
 
 
 
 | 360 | 
  | 
 
 
 
 
 
 | 361 | 
 template<typename _Interface,typename _InterfacePtr> bool operator==(_Interface *i,_com_ptr_t<_InterfacePtr> &p) { return p==i; } | 
 
 
 
 
 
 | 362 | 
  | 
 
 
 
 
 
 | 363 | 
 template<typename _Interface> bool operator!=(int null,_com_ptr_t<_Interface> &p) { | 
 
 
 
 
 
 | 364 | 
   if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 365 | 
   return p!=NULL; | 
 
 
 
 
 
 | 366 | 
 } | 
 
 
 
 
 
 | 367 | 
  | 
 
 
 
 
 
 | 368 | 
 template<typename _Interface,typename _InterfacePtr> bool operator!=(_Interface *i,_com_ptr_t<_InterfacePtr> &p) { return p!=i; } | 
 
 
 
 
 
 | 369 | 
  | 
 
 
 
 
 
 | 370 | 
 template<typename _Interface> bool operator<(int null,_com_ptr_t<_Interface> &p) { | 
 
 
 
 
 
 | 371 | 
   if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 372 | 
   return p>NULL; | 
 
 
 
 
 
 | 373 | 
 } | 
 
 
 
 
 
 | 374 | 
  | 
 
 
 
 
 
 | 375 | 
 template<typename _Interface,typename _InterfacePtr> bool operator<(_Interface *i,_com_ptr_t<_InterfacePtr> &p) { return p>i; } | 
 
 
 
 
 
 | 376 | 
  | 
 
 
 
 
 
 | 377 | 
 template<typename _Interface> bool operator>(int null,_com_ptr_t<_Interface> &p) { | 
 
 
 
 
 
 | 378 | 
   if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 379 | 
   return p<NULL; | 
 
 
 
 
 
 | 380 | 
 } | 
 
 
 
 
 
 | 381 | 
  | 
 
 
 
 
 
 | 382 | 
 template<typename _Interface,typename _InterfacePtr> bool operator>(_Interface *i,_com_ptr_t<_InterfacePtr> &p) { return p<i; } | 
 
 
 
 
 
 | 383 | 
  | 
 
 
 
 
 
 | 384 | 
 template<typename _Interface> bool operator<=(int null,_com_ptr_t<_Interface> &p) { | 
 
 
 
 
 
 | 385 | 
   if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 386 | 
   return p>=NULL; | 
 
 
 
 
 
 | 387 | 
 } | 
 
 
 
 
 
 | 388 | 
  | 
 
 
 
 
 
 | 389 | 
 template<typename _Interface,typename _InterfacePtr> bool operator<=(_Interface *i,_com_ptr_t<_InterfacePtr> &p) { return p>=i; } | 
 
 
 
 
 
 | 390 | 
  | 
 
 
 
 
 
 | 391 | 
 template<typename _Interface> bool operator>=(int null,_com_ptr_t<_Interface> &p) { | 
 
 
 
 
 
 | 392 | 
   if(null!=0) { _com_issue_error(E_POINTER); } | 
 
 
 
 
 
 | 393 | 
   return p<=NULL; | 
 
 
 
 
 
 | 394 | 
 } | 
 
 
 
 
 
 | 395 | 
  | 
 
 
 
 
 
 | 396 | 
 template<typename _Interface,typename _InterfacePtr> bool operator>=(_Interface *i,_com_ptr_t<_InterfacePtr> &p) { return p<=i; } | 
 
 
 
 
 
 | 397 | 
  | 
 
 
 
 
 
 | 398 | 
 #pragma pop_macro("new") | 
 
 
 
 
 
 | 399 | 
  | 
 
 
 
 
 
 | 400 | 
 #endif /* __cplusplus */ | 
 
 
 
 
 
 | 401 | 
  | 
 
 
 
 
 
 | 402 | 
 #endif /* _INC_COMIP */ |