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(__uuidof(iface), iface)
40#define IUNKNOWN_ADD_IID(iface) IUNKNOWN_ADD_IID2(__uuidof(iface), iface)
53 virtual void OnFinalRelease()
58 STDMETHODIMP_(ULONG) _AddRef(
void)
60 return (ULONG)InterlockedIncrement(&m_cRef);
63 STDMETHODIMP_(ULONG) _Release(
void)
65 LONG ret = InterlockedDecrement(&m_cRef);