soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SComHelper.h
1#ifndef __SCOMHELPER__H__
2#define __SCOMHELPER__H__
3
4#include <sdef.h>
5#include <unknwn.h>
6
7SNSBEGIN
8
9 #define COM_INTERFACE_BEGIN() \
10 public:\
11 virtual HRESULT STDMETHODCALLTYPE QueryInterface2( \
12 /* [in] */ REFIID riid,\
13 /* [iid_is][out] */ void * *ppvObject)\
14 {\
15 HRESULT hr = E_NOINTERFACE; \
16
17 #define COM_INTERFACE(IFACE) \
18 if(hr != S_OK && riid == __uuidof(IFACE)) \
19 {\
20 *ppvObject = static_cast<IFACE*>(this); \
21 hr = S_OK;\
22 }\
23
24 #define COM_INTERFACE_END() \
25 return hr; \
26 }
27
28
29 template<class T>
30 class SUnknownImpl: public T
31 {
32 public:
33 SUnknownImpl():m_cRef(1){}
34
35 template<typename P1>
36 SUnknownImpl(P1 p1):T(p1),m_cRef(1)
37 {
38 }
39
40 template<typename P1,typename P2>
41 SUnknownImpl(P1 p1,P2 p2):T(p1,p2),m_cRef(1)
42 {
43 }
44
45 virtual ~SUnknownImpl(){}
46
47 virtual HRESULT STDMETHODCALLTYPE QueryInterface2(
48 /* [in] */ REFIID riid,
49 /* [iid_is][out] */ void **ppvObject)
50 {
51 (riid);
52 (ppvObject);
53 return E_NOINTERFACE;
54 }
55
56 HRESULT STDMETHODCALLTYPE QueryInterface(
57 /* [in] */ REFIID riid,
58 /* [iid_is][out] */ void * *ppvObject)
59 {
60 HRESULT hr = E_NOINTERFACE;
61 if(riid == IID_IUnknown)
62 {
63 *ppvObject = this;
64 hr = S_OK;
65 }else
66 {
67 hr = QueryInterface2(riid,ppvObject);
68 }
69 if(hr == S_OK)
70 {
71 static_cast<IUnknown*>(*ppvObject)->AddRef();
72 }
73 return hr;
74 }
75
76 virtual ULONG STDMETHODCALLTYPE AddRef( void)
77 {
78 return (ULONG)::InterlockedIncrement(&m_cRef);
79 }
80
81 virtual ULONG STDMETHODCALLTYPE Release( void)
82 {
83 LONG uRet = ::InterlockedDecrement(&m_cRef);
84 if(uRet == 0)
85 {
86 OnFinialRelease();
87 }
88 return uRet;
89 }
90
91 public:
92
93 virtual void OnFinialRelease(){delete this;}
94
95 protected:
96 volatile LONG m_cRef;
97 };
98
99SNSEND
100
101#endif // __SCOMHELPER__H__