1#ifndef __SUNKNOWNIMPL__H__
2#define __SUNKNOWNIMPL__H__
4#define IUNKNOWN_BEGIN2(iid, cls) \
5 STDMETHODIMP_(ULONG) AddRef(void) \
9 STDMETHODIMP_(ULONG) Release(void) \
13 STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) \
16 return E_INVALIDARG; \
18 if (IsEqualIID(riid, iid) || IsEqualIID(riid, IID_IUnknown)) \
20 *ppvObj = (cls *)this; \
23#define IUNKNOWN_ADD_IID2(iid, cls) \
24 if (IsEqualIID(riid, iid)) \
26 *ppvObj = (cls *)this; \
29#define IUNKNOWN_END() \
35 return E_NOINTERFACE; \
38#define IUNKNOWN_BEGIN(iface) IUNKNOWN_BEGIN2(__suidof(iface), iface)
40#define IUNKNOWN_ADD_IID(iface) IUNKNOWN_ADD_IID2(__suidof(iface), iface)
43class SUnkImpl :
public T {
54 virtual void OnFinalRelease()
60 STDMETHODIMP_(ULONG) _AddRef(
void)
62 return (ULONG)InterlockedIncrement(&m_cRef);
65 STDMETHODIMP_(ULONG) _Release(
void)
67 LONG ret = InterlockedDecrement(&m_cRef);