soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SUnknown.h
1#ifndef __SUNKNOWN__H__
2#define __SUNKNOWN__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(__uuidof(iface), iface)
39
40#define IUNKNOWN_ADD_IID(iface) IUNKNOWN_ADD_IID2(__uuidof(iface), iface)
41
42class SUnknown {
43 public:
44 SUnknown()
45 : m_cRef(1)
46 {
47 }
48
49 virtual ~SUnknown()
50 {
51 }
52
53 virtual void OnFinalRelease()
54 {
55 }
56
57 protected:
58 STDMETHODIMP_(ULONG) _AddRef(void)
59 {
60 return (ULONG)InterlockedIncrement(&m_cRef);
61 }
62
63 STDMETHODIMP_(ULONG) _Release(void)
64 {
65 LONG ret = InterlockedDecrement(&m_cRef);
66 if (ret == 0)
67 {
68 OnFinalRelease();
69 delete this;
70 }
71 return ret;
72 }
73
74 LONG GetRef() const
75 {
76 return m_cRef;
77 }
78
79 private:
80 volatile LONG m_cRef;
81};
82#endif // __SUNKNOWN__H__