1#ifndef __SCOMHELPER__H__
2#define __SCOMHELPER__H__
9 #define COM_INTERFACE_BEGIN() \
11 virtual HRESULT STDMETHODCALLTYPE QueryInterface2( \
15 HRESULT hr = E_NOINTERFACE; \
17 #define COM_INTERFACE(IFACE) \
18 if(hr != S_OK && riid == __uuidof(IFACE)) \
20 *ppvObject = static_cast<IFACE*>(this); \
24 #define COM_INTERFACE_END() \
30 class SUnknownImpl:
public T
33 SUnknownImpl():m_cRef(1){}
36 SUnknownImpl(P1 p1):T(p1),m_cRef(1)
40 template<
typename P1,
typename P2>
41 SUnknownImpl(P1 p1,P2 p2):T(p1,p2),m_cRef(1)
45 virtual ~SUnknownImpl(){}
47 virtual HRESULT STDMETHODCALLTYPE QueryInterface2(
56 HRESULT STDMETHODCALLTYPE QueryInterface(
60 HRESULT hr = E_NOINTERFACE;
61 if(riid == IID_IUnknown)
67 hr = QueryInterface2(riid,ppvObject);
71 static_cast<IUnknown*
>(*ppvObject)->AddRef();
76 virtual ULONG STDMETHODCALLTYPE AddRef(
void)
78 return (ULONG)::InterlockedIncrement(&m_cRef);
81 virtual ULONG STDMETHODCALLTYPE Release(
void)
83 LONG uRet = ::InterlockedDecrement(&m_cRef);
93 virtual void OnFinialRelease(){
delete this;}