soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SUnkImpl.h
1#ifndef __SUNKNOWNIMPL__H__
2#define __SUNKNOWNIMPL__H__
3
4#define IUNKNOWN_BEGIN2(iid, cls) \
5 STDMETHODIMP_(ULONG) AddRef(void) \
6 { \
7 return _AddRef(); \
8 } \
9 STDMETHODIMP_(ULONG) Release(void) \
10 { \
11 return _Release(); \
12 } \
13 STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) \
14 { \
15 if (ppvObj == NULL) \
16 return E_INVALIDARG; \
17 *ppvObj = NULL; \
18 if (IsEqualIID(riid, iid) || IsEqualIID(riid, IID_IUnknown)) \
19 { \
20 *ppvObj = (cls *)this; \
21 }
22
23#define IUNKNOWN_ADD_IID2(iid, cls) \
24 if (IsEqualIID(riid, iid)) \
25 { \
26 *ppvObj = (cls *)this; \
27 }
28
29#define IUNKNOWN_END() \
30 if (*ppvObj) \
31 { \
32 AddRef(); \
33 return S_OK; \
34 } \
35 return E_NOINTERFACE; \
36 }
37
38#define IUNKNOWN_BEGIN(iface) IUNKNOWN_BEGIN2(__suidof(iface), iface)
39
40#define IUNKNOWN_ADD_IID(iface) IUNKNOWN_ADD_IID2(__suidof(iface), iface)
41
42template <class T>
43class SUnkImpl : public T {
44 public:
45 SUnkImpl()
46 : m_cRef(1)
47 {
48 }
49
50 virtual ~SUnkImpl()
51 {
52 }
53
54 virtual void OnFinalRelease()
55 {
56 delete this;
57 }
58
59 protected:
60 STDMETHODIMP_(ULONG) _AddRef(void)
61 {
62 return (ULONG)InterlockedIncrement(&m_cRef);
63 }
64
65 STDMETHODIMP_(ULONG) _Release(void)
66 {
67 LONG ret = InterlockedDecrement(&m_cRef);
68 if (ret == 0)
69 {
70 OnFinalRelease();
71 }
72 return ret;
73 }
74
75 LONG GetRef() const
76 {
77 return m_cRef;
78 }
79
80 private:
81 LONG m_cRef;
82};
83#endif // __SUNKNOWNIMPL__H__