21#define SASSERT(x) assert(x);
25#pragma warning (disable: 4127)
26#pragma warning (disable: 4571)
36inline IUnknown* SComPtrAssign(IUnknown** pp, IUnknown* lp)
49inline IUnknown* SComQIPtrAssign(IUnknown** pp, IUnknown* lp, REFIID riid)
54 IUnknown* pTemp = *pp;
57 lp->QueryInterface(riid, (
void**)pp);
68class _SNoAddRefReleaseOnCComPtr :
public T
71 STDMETHOD_(ULONG, AddRef)()=0;
72 STDMETHOD_(ULONG, Release)()=0;
85 SComPtrBase(
int nNull)
throw()
91 SComPtrBase( T* lp, BOOL bAddRef)
throw()
94 if (p != NULL && bAddRef)
104 operator T*()
const throw()
115 T** operator&() throw()
120 _SNoAddRefReleaseOnCComPtr<T>* operator->()
const throw()
123 return (_SNoAddRefReleaseOnCComPtr<T>*)p;
125 bool operator!()
const throw()
129 bool operator<( T* pT)
const throw()
133 bool operator!=( T* pT)
const
135 return !operator==(pT);
137 bool operator==( T* pT)
const throw()
143 void Release() throw()
153 bool IsEqualObject( IUnknown* pOther)
throw()
155 if (p == NULL && pOther == NULL)
158 if (p == NULL || pOther == NULL)
163 p->QueryInterface(__uuidof(IUnknown), (
void**)&punk1);
164 pOther->QueryInterface(__uuidof(IUnknown), (
void**)&punk2);
165 bool bEqual = punk1 == punk2;
171 void Attach( T* p2)
throw()
184 HRESULT CopyTo( T** ppT)
throw()
186 SASSERT(ppT != NULL);
194 HRESULT CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
throw()
197 return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (
void**)&p);
199 HRESULT CoCreateInstance( LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
throw()
202 HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
205 hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (
void**)&p);
209 HRESULT QueryInterface( Q** pp)
const throw()
212 return p->QueryInterface(__uuidof(Q), (
void**)pp);
218class SComPtr :
public SComPtrBase<T>
224 SComPtr(
int nNull)
throw() :
225 SComPtrBase<T>(nNull)
228 SComPtr(T* lp, BOOL bAddRef = TRUE)
throw() :
229 SComPtrBase<T>(lp,bAddRef)
233 SComPtr(
const SComPtr<T>& lp)
throw() :
234 SComPtrBase<T>(lp.p,TRUE)
237 T* operator=( T* lp)
throw()
241 return static_cast<T*
>(SComPtrAssign((IUnknown**)&this->p, lp));
245 template <
typename Q>
246 T* operator=(
const SComPtr<Q>& lp)
throw()
248 if( !SComPtrBase<T>::IsEqualObject(lp) )
250 return static_cast<T*
>(SComQIPtrAssign((IUnknown**)&this->p, lp, __uuidof(T)));
254 T* operator=(
const SComPtr<T>& lp)
throw()
258 return static_cast<T*
>(SComPtrAssign((IUnknown**)&this->p, lp));
266class SComPtr<IDispatch> :
public SComPtrBase<IDispatch>
272 SComPtr(IDispatch* lp, BOOL bAddRef = TRUE)
throw() :
273 SComPtrBase<IDispatch>(lp,bAddRef)
276 SComPtr(
const SComPtr<IDispatch>& lp)
throw() :
277 SComPtrBase<IDispatch>(lp.p,TRUE)
280 IDispatch* operator=(IDispatch* lp)
throw()
284 return static_cast<IDispatch*
>(SComPtrAssign((IUnknown**)&p, lp));
288 IDispatch* operator=(
const SComPtr<IDispatch>& lp)
throw()
292 return static_cast<IDispatch*
>(SComPtrAssign((IUnknown**)&p, lp.p));
298 HRESULT GetPropertyByName( LPCOLESTR lpsz, VARIANT* pVar)
throw()
303 HRESULT hr = GetIDOfName(lpsz, &dwDispID);
305 hr = GetProperty(dwDispID, pVar);
308 HRESULT GetProperty( DISPID dwDispID, VARIANT* pVar)
throw()
310 return GetProperty(p, dwDispID, pVar);
312 HRESULT PutPropertyByName( LPCOLESTR lpsz, VARIANT* pVar)
throw()
317 HRESULT hr = GetIDOfName(lpsz, &dwDispID);
319 hr = PutProperty(dwDispID, pVar);
322 HRESULT PutProperty( DISPID dwDispID, VARIANT* pVar)
throw()
324 return PutProperty(p, dwDispID, pVar);
326 HRESULT GetIDOfName( LPCOLESTR lpsz, DISPID* pdispid)
throw()
328 return p->GetIDsOfNames(IID_NULL,
const_cast<LPOLESTR*
>(&lpsz), 1, LOCALE_USER_DEFAULT, pdispid);
331 HRESULT Invoke0( DISPID dispid, VARIANT* pvarRet = NULL)
throw()
333 DISPPARAMS dispparams = { NULL, NULL, 0, 0};
334 return p->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL);
337 HRESULT Invoke0( LPCOLESTR lpszName, VARIANT* pvarRet = NULL)
throw()
341 hr = GetIDOfName(lpszName, &dispid);
343 hr = Invoke0(dispid, pvarRet);
347 HRESULT Invoke1( DISPID dispid, VARIANT* pvarParam1, VARIANT* pvarRet = NULL)
throw()
349 DISPPARAMS dispparams = { pvarParam1, NULL, 1, 0};
350 return p->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL);
353 HRESULT Invoke1( LPCOLESTR lpszName, VARIANT* pvarParam1, VARIANT* pvarRet = NULL)
throw()
357 hr = GetIDOfName(lpszName, &dispid);
359 hr = Invoke1(dispid, pvarParam1, pvarRet);
363 HRESULT Invoke2( DISPID dispid, VARIANT* pvarParam1, VARIANT* pvarParam2, VARIANT* pvarRet = NULL)
throw();
365 HRESULT Invoke2( LPCOLESTR lpszName, VARIANT* pvarParam1, VARIANT* pvarParam2, VARIANT* pvarRet = NULL)
throw()
369 hr = GetIDOfName(lpszName, &dispid);
371 hr = Invoke2(dispid, pvarParam1, pvarParam2, pvarRet);
375 HRESULT InvokeN(DISPID dispid, VARIANT* pvarParams,
int nParams, VARIANT* pvarRet = NULL)
throw()
377 DISPPARAMS dispparams = { pvarParams, NULL, (UINT)nParams, 0};
378 return p->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL);
381 HRESULT InvokeN(LPCOLESTR lpszName, VARIANT* pvarParams,
int nParams, VARIANT* pvarRet = NULL)
throw()
385 hr = GetIDOfName(lpszName, &dispid);
387 hr = InvokeN(dispid, pvarParams, nParams, pvarRet);
390 static HRESULT PutProperty( IDispatch* p, DISPID dwDispID, VARIANT* pVar)
throw()
393 SASSERT(pVar != NULL);
400 DISPPARAMS dispparams = {NULL, NULL, 1, 1};
401 dispparams.rgvarg = pVar;
402 DISPID dispidPut = DISPID_PROPERTYPUT;
403 dispparams.rgdispidNamedArgs = &dispidPut;
405 if (pVar->vt == VT_UNKNOWN || pVar->vt == VT_DISPATCH ||
406 (pVar->vt & VT_ARRAY) || (pVar->vt & VT_BYREF))
408 HRESULT hr = p->Invoke(dwDispID, IID_NULL,
409 LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUTREF,
410 &dispparams, NULL, NULL, NULL);
414 return p->Invoke(dwDispID, IID_NULL,
415 LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT,
416 &dispparams, NULL, NULL, NULL);
418 static HRESULT GetProperty( IDispatch* p, DISPID dwDispID, VARIANT* pVar)
throw()
421 SASSERT(pVar != NULL);
428 DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
429 return p->Invoke(dwDispID, IID_NULL,
430 LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
431 &dispparamsNoArgs, pVar, NULL, NULL);
435template <
class T, const IID* pi
id = &__uu
idof(T)>
436class SComQIPtr :
public SComPtr<T>
442 SComQIPtr( T* lp, BOOL bAddRef = TRUE)
throw() :
443 SComPtr<T>(lp,bAddRef)
446 SComQIPtr(
const SComQIPtr<T,piid>& lp)
throw() :
450 SComQIPtr( IUnknown* lp)
throw()
453 lp->QueryInterface(*piid, (
void **)&this->p);
455 T* operator=( T* lp)
throw()
459 return static_cast<T*
>(SComPtrAssign((IUnknown**)&this->p, lp));
463 T* operator=(
const SComQIPtr<T,piid>& lp)
throw()
467 return static_cast<T*
>(SComPtrAssign((IUnknown**)&this->p, lp.p));
471 T* operator=( IUnknown* lp)
throw()
475 return static_cast<T*
>(SComQIPtrAssign((IUnknown**)&this->p, lp, *piid));
483class SComQIPtr<IUnknown, &IID_IUnknown> :
public SComPtr<IUnknown>
489 SComQIPtr( IUnknown* lp)
throw()
493 lp->QueryInterface(__uuidof(IUnknown), (
void **)&p);
495 SComQIPtr(
const SComQIPtr<IUnknown,&IID_IUnknown>& lp)
throw() :
496 SComPtr<IUnknown>(lp.p)
499 IUnknown* operator=( IUnknown* lp)
throw()
504 return SComQIPtrAssign((IUnknown**)&p, lp, __uuidof(IUnknown));
509 IUnknown* operator=(
const SComQIPtr<IUnknown,&IID_IUnknown>& lp)
throw()
513 return SComPtrAssign((IUnknown**)&p, lp.p);
519typedef SComQIPtr<IDispatch, &IID_IDispatch> CComDispatchDriver;