1*f6dc9357SAndroid Build Coastguard Worker // MyCom.h
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_MY_COM_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_MY_COM_H
5*f6dc9357SAndroid Build Coastguard Worker
6*f6dc9357SAndroid Build Coastguard Worker #include "MyWindows.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "MyTypes.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker template <class T>
10*f6dc9357SAndroid Build Coastguard Worker class CMyComPtr
11*f6dc9357SAndroid Build Coastguard Worker {
12*f6dc9357SAndroid Build Coastguard Worker T* _p;
13*f6dc9357SAndroid Build Coastguard Worker public:
CMyComPtr()14*f6dc9357SAndroid Build Coastguard Worker CMyComPtr(): _p(NULL) {}
throw()15*f6dc9357SAndroid Build Coastguard Worker CMyComPtr(T* p) throw() { if ((_p = p) != NULL) p->AddRef(); }
throw()16*f6dc9357SAndroid Build Coastguard Worker CMyComPtr(const CMyComPtr<T>& lp) throw() { if ((_p = lp._p) != NULL) _p->AddRef(); }
~CMyComPtr()17*f6dc9357SAndroid Build Coastguard Worker ~CMyComPtr() { if (_p) _p->Release(); }
Release()18*f6dc9357SAndroid Build Coastguard Worker void Release() { if (_p) { _p->Release(); _p = NULL; } }
19*f6dc9357SAndroid Build Coastguard Worker operator T*() const { return (T*)_p; }
Interface()20*f6dc9357SAndroid Build Coastguard Worker T* Interface() const { return (T*)_p; }
21*f6dc9357SAndroid Build Coastguard Worker // T& operator*() const { return *_p; }
22*f6dc9357SAndroid Build Coastguard Worker T** operator&() { return &_p; }
23*f6dc9357SAndroid Build Coastguard Worker T* operator->() const { return _p; }
24*f6dc9357SAndroid Build Coastguard Worker T* operator=(T* p)
25*f6dc9357SAndroid Build Coastguard Worker {
26*f6dc9357SAndroid Build Coastguard Worker if (p)
27*f6dc9357SAndroid Build Coastguard Worker p->AddRef();
28*f6dc9357SAndroid Build Coastguard Worker if (_p)
29*f6dc9357SAndroid Build Coastguard Worker _p->Release();
30*f6dc9357SAndroid Build Coastguard Worker _p = p;
31*f6dc9357SAndroid Build Coastguard Worker return p;
32*f6dc9357SAndroid Build Coastguard Worker }
33*f6dc9357SAndroid Build Coastguard Worker T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }
34*f6dc9357SAndroid Build Coastguard Worker bool operator!() const { return (_p == NULL); }
35*f6dc9357SAndroid Build Coastguard Worker // bool operator==(T* pT) const { return _p == pT; }
Attach(T * p2)36*f6dc9357SAndroid Build Coastguard Worker void Attach(T* p2)
37*f6dc9357SAndroid Build Coastguard Worker {
38*f6dc9357SAndroid Build Coastguard Worker Release();
39*f6dc9357SAndroid Build Coastguard Worker _p = p2;
40*f6dc9357SAndroid Build Coastguard Worker }
Detach()41*f6dc9357SAndroid Build Coastguard Worker T* Detach()
42*f6dc9357SAndroid Build Coastguard Worker {
43*f6dc9357SAndroid Build Coastguard Worker T* pt = _p;
44*f6dc9357SAndroid Build Coastguard Worker _p = NULL;
45*f6dc9357SAndroid Build Coastguard Worker return pt;
46*f6dc9357SAndroid Build Coastguard Worker }
47*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
48*f6dc9357SAndroid Build Coastguard Worker HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
49*f6dc9357SAndroid Build Coastguard Worker {
50*f6dc9357SAndroid Build Coastguard Worker return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
51*f6dc9357SAndroid Build Coastguard Worker }
52*f6dc9357SAndroid Build Coastguard Worker #endif
53*f6dc9357SAndroid Build Coastguard Worker /*
54*f6dc9357SAndroid Build Coastguard Worker HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
55*f6dc9357SAndroid Build Coastguard Worker {
56*f6dc9357SAndroid Build Coastguard Worker CLSID clsid;
57*f6dc9357SAndroid Build Coastguard Worker HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
58*f6dc9357SAndroid Build Coastguard Worker ATLASSERT(_p == NULL);
59*f6dc9357SAndroid Build Coastguard Worker if (SUCCEEDED(hr))
60*f6dc9357SAndroid Build Coastguard Worker hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);
61*f6dc9357SAndroid Build Coastguard Worker return hr;
62*f6dc9357SAndroid Build Coastguard Worker }
63*f6dc9357SAndroid Build Coastguard Worker */
64*f6dc9357SAndroid Build Coastguard Worker template <class Q>
QueryInterface(REFGUID iid,Q ** pp)65*f6dc9357SAndroid Build Coastguard Worker HRESULT QueryInterface(REFGUID iid, Q** pp) const throw()
66*f6dc9357SAndroid Build Coastguard Worker {
67*f6dc9357SAndroid Build Coastguard Worker // if (*pp) throw 20220216; // for debug
68*f6dc9357SAndroid Build Coastguard Worker return _p->QueryInterface(iid, (void**)pp);
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker };
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker
73*f6dc9357SAndroid Build Coastguard Worker template <class iface, class cls>
74*f6dc9357SAndroid Build Coastguard Worker class CMyComPtr2
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker cls* _p;
77*f6dc9357SAndroid Build Coastguard Worker
78*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2(const CMyComPtr2<iface, cls>& lp);
79*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2(cls* p);
80*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2(iface* p);
81*f6dc9357SAndroid Build Coastguard Worker iface* operator=(const CMyComPtr2<iface, cls>& lp);
82*f6dc9357SAndroid Build Coastguard Worker iface* operator=(cls* p);
83*f6dc9357SAndroid Build Coastguard Worker iface* operator=(iface* p);
84*f6dc9357SAndroid Build Coastguard Worker public:
CMyComPtr2()85*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2(): _p(NULL) {}
~CMyComPtr2()86*f6dc9357SAndroid Build Coastguard Worker ~CMyComPtr2()
87*f6dc9357SAndroid Build Coastguard Worker {
88*f6dc9357SAndroid Build Coastguard Worker if (_p)
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
91*f6dc9357SAndroid Build Coastguard Worker ip->Release();
92*f6dc9357SAndroid Build Coastguard Worker }
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker // void Release() { if (_p) { (iface *)_p->Release(); _p = NULL; } }
95*f6dc9357SAndroid Build Coastguard Worker cls* operator->() const { return _p; }
ClsPtr()96*f6dc9357SAndroid Build Coastguard Worker cls* ClsPtr() const { return _p; }
97*f6dc9357SAndroid Build Coastguard Worker operator iface*() const
98*f6dc9357SAndroid Build Coastguard Worker {
99*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
100*f6dc9357SAndroid Build Coastguard Worker return ip;
101*f6dc9357SAndroid Build Coastguard Worker }
Interface()102*f6dc9357SAndroid Build Coastguard Worker iface* Interface() const
103*f6dc9357SAndroid Build Coastguard Worker {
104*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
105*f6dc9357SAndroid Build Coastguard Worker return ip;
106*f6dc9357SAndroid Build Coastguard Worker }
107*f6dc9357SAndroid Build Coastguard Worker // operator bool() const { return _p != NULL; }
IsDefined()108*f6dc9357SAndroid Build Coastguard Worker bool IsDefined() const { return _p != NULL; }
Create_if_Empty()109*f6dc9357SAndroid Build Coastguard Worker void Create_if_Empty()
110*f6dc9357SAndroid Build Coastguard Worker {
111*f6dc9357SAndroid Build Coastguard Worker if (!_p)
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker _p = new cls;
114*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
115*f6dc9357SAndroid Build Coastguard Worker ip->AddRef();
116*f6dc9357SAndroid Build Coastguard Worker }
117*f6dc9357SAndroid Build Coastguard Worker }
Detach()118*f6dc9357SAndroid Build Coastguard Worker iface* Detach()
119*f6dc9357SAndroid Build Coastguard Worker {
120*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
121*f6dc9357SAndroid Build Coastguard Worker _p = NULL;
122*f6dc9357SAndroid Build Coastguard Worker return ip;
123*f6dc9357SAndroid Build Coastguard Worker }
SetFromCls(cls * src)124*f6dc9357SAndroid Build Coastguard Worker void SetFromCls(cls *src)
125*f6dc9357SAndroid Build Coastguard Worker {
126*f6dc9357SAndroid Build Coastguard Worker if (src)
127*f6dc9357SAndroid Build Coastguard Worker {
128*f6dc9357SAndroid Build Coastguard Worker iface *ip = src;
129*f6dc9357SAndroid Build Coastguard Worker ip->AddRef();
130*f6dc9357SAndroid Build Coastguard Worker }
131*f6dc9357SAndroid Build Coastguard Worker if (_p)
132*f6dc9357SAndroid Build Coastguard Worker {
133*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
134*f6dc9357SAndroid Build Coastguard Worker ip->Release();
135*f6dc9357SAndroid Build Coastguard Worker }
136*f6dc9357SAndroid Build Coastguard Worker _p = src;
137*f6dc9357SAndroid Build Coastguard Worker }
138*f6dc9357SAndroid Build Coastguard Worker };
139*f6dc9357SAndroid Build Coastguard Worker
140*f6dc9357SAndroid Build Coastguard Worker
141*f6dc9357SAndroid Build Coastguard Worker template <class iface, class cls>
142*f6dc9357SAndroid Build Coastguard Worker class CMyComPtr2_Create
143*f6dc9357SAndroid Build Coastguard Worker {
144*f6dc9357SAndroid Build Coastguard Worker cls* _p;
145*f6dc9357SAndroid Build Coastguard Worker
146*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2_Create(const CMyComPtr2_Create<iface, cls>& lp);
147*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2_Create(cls* p);
148*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2_Create(iface* p);
149*f6dc9357SAndroid Build Coastguard Worker iface* operator=(const CMyComPtr2_Create<iface, cls>& lp);
150*f6dc9357SAndroid Build Coastguard Worker iface* operator=(cls* p);
151*f6dc9357SAndroid Build Coastguard Worker iface* operator=(iface* p);
152*f6dc9357SAndroid Build Coastguard Worker public:
CMyComPtr2_Create()153*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2_Create(): _p(new cls)
154*f6dc9357SAndroid Build Coastguard Worker {
155*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
156*f6dc9357SAndroid Build Coastguard Worker ip->AddRef();
157*f6dc9357SAndroid Build Coastguard Worker }
~CMyComPtr2_Create()158*f6dc9357SAndroid Build Coastguard Worker ~CMyComPtr2_Create()
159*f6dc9357SAndroid Build Coastguard Worker {
160*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
161*f6dc9357SAndroid Build Coastguard Worker ip->Release();
162*f6dc9357SAndroid Build Coastguard Worker }
163*f6dc9357SAndroid Build Coastguard Worker cls* operator->() const { return _p; }
ClsPtr()164*f6dc9357SAndroid Build Coastguard Worker cls* ClsPtr() const { return _p; }
165*f6dc9357SAndroid Build Coastguard Worker operator iface*() const
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
168*f6dc9357SAndroid Build Coastguard Worker return ip;
169*f6dc9357SAndroid Build Coastguard Worker }
Interface()170*f6dc9357SAndroid Build Coastguard Worker iface* Interface() const
171*f6dc9357SAndroid Build Coastguard Worker {
172*f6dc9357SAndroid Build Coastguard Worker iface *ip = _p;
173*f6dc9357SAndroid Build Coastguard Worker return ip;
174*f6dc9357SAndroid Build Coastguard Worker }
175*f6dc9357SAndroid Build Coastguard Worker };
176*f6dc9357SAndroid Build Coastguard Worker
177*f6dc9357SAndroid Build Coastguard Worker
178*f6dc9357SAndroid Build Coastguard Worker #define Z7_DECL_CMyComPtr_QI_FROM(i, v, unk) \
179*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<i> v; (unk)->QueryInterface(IID_ ## i, (void **)&v);
180*f6dc9357SAndroid Build Coastguard Worker
181*f6dc9357SAndroid Build Coastguard Worker
182*f6dc9357SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////
183*f6dc9357SAndroid Build Coastguard Worker
StringToBstr(LPCOLESTR src,BSTR * bstr)184*f6dc9357SAndroid Build Coastguard Worker inline HRESULT StringToBstr(LPCOLESTR src, BSTR *bstr)
185*f6dc9357SAndroid Build Coastguard Worker {
186*f6dc9357SAndroid Build Coastguard Worker *bstr = ::SysAllocString(src);
187*f6dc9357SAndroid Build Coastguard Worker return (*bstr) ? S_OK : E_OUTOFMEMORY;
188*f6dc9357SAndroid Build Coastguard Worker }
189*f6dc9357SAndroid Build Coastguard Worker
190*f6dc9357SAndroid Build Coastguard Worker class CMyComBSTR
191*f6dc9357SAndroid Build Coastguard Worker {
192*f6dc9357SAndroid Build Coastguard Worker BSTR m_str;
Z7_CLASS_NO_COPY(CMyComBSTR)193*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CMyComBSTR)
194*f6dc9357SAndroid Build Coastguard Worker public:
195*f6dc9357SAndroid Build Coastguard Worker CMyComBSTR(): m_str(NULL) {}
~CMyComBSTR()196*f6dc9357SAndroid Build Coastguard Worker ~CMyComBSTR() { ::SysFreeString(m_str); }
197*f6dc9357SAndroid Build Coastguard Worker BSTR* operator&() { return &m_str; }
LPCOLESTR()198*f6dc9357SAndroid Build Coastguard Worker operator LPCOLESTR() const { return m_str; }
199*f6dc9357SAndroid Build Coastguard Worker // operator bool() const { return m_str != NULL; }
200*f6dc9357SAndroid Build Coastguard Worker // bool operator!() const { return m_str == NULL; }
201*f6dc9357SAndroid Build Coastguard Worker
Wipe_and_Free()202*f6dc9357SAndroid Build Coastguard Worker void Wipe_and_Free()
203*f6dc9357SAndroid Build Coastguard Worker {
204*f6dc9357SAndroid Build Coastguard Worker if (m_str)
205*f6dc9357SAndroid Build Coastguard Worker {
206*f6dc9357SAndroid Build Coastguard Worker memset(m_str, 0, ::SysStringLen(m_str) * sizeof(*m_str));
207*f6dc9357SAndroid Build Coastguard Worker Empty();
208*f6dc9357SAndroid Build Coastguard Worker }
209*f6dc9357SAndroid Build Coastguard Worker }
210*f6dc9357SAndroid Build Coastguard Worker
211*f6dc9357SAndroid Build Coastguard Worker private:
212*f6dc9357SAndroid Build Coastguard Worker // operator BSTR() const { return m_str; }
213*f6dc9357SAndroid Build Coastguard Worker
CMyComBSTR(LPCOLESTR src)214*f6dc9357SAndroid Build Coastguard Worker CMyComBSTR(LPCOLESTR src) { m_str = ::SysAllocString(src); }
215*f6dc9357SAndroid Build Coastguard Worker // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }
216*f6dc9357SAndroid Build Coastguard Worker // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); }
217*f6dc9357SAndroid Build Coastguard Worker // CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
218*f6dc9357SAndroid Build Coastguard Worker
219*f6dc9357SAndroid Build Coastguard Worker /*
220*f6dc9357SAndroid Build Coastguard Worker CMyComBSTR(REFGUID src)
221*f6dc9357SAndroid Build Coastguard Worker {
222*f6dc9357SAndroid Build Coastguard Worker LPOLESTR szGuid;
223*f6dc9357SAndroid Build Coastguard Worker StringFromCLSID(src, &szGuid);
224*f6dc9357SAndroid Build Coastguard Worker m_str = ::SysAllocString(szGuid);
225*f6dc9357SAndroid Build Coastguard Worker CoTaskMemFree(szGuid);
226*f6dc9357SAndroid Build Coastguard Worker }
227*f6dc9357SAndroid Build Coastguard Worker */
228*f6dc9357SAndroid Build Coastguard Worker
229*f6dc9357SAndroid Build Coastguard Worker /*
230*f6dc9357SAndroid Build Coastguard Worker CMyComBSTR& operator=(const CMyComBSTR& src)
231*f6dc9357SAndroid Build Coastguard Worker {
232*f6dc9357SAndroid Build Coastguard Worker if (m_str != src.m_str)
233*f6dc9357SAndroid Build Coastguard Worker {
234*f6dc9357SAndroid Build Coastguard Worker if (m_str)
235*f6dc9357SAndroid Build Coastguard Worker ::SysFreeString(m_str);
236*f6dc9357SAndroid Build Coastguard Worker m_str = src.MyCopy();
237*f6dc9357SAndroid Build Coastguard Worker }
238*f6dc9357SAndroid Build Coastguard Worker return *this;
239*f6dc9357SAndroid Build Coastguard Worker }
240*f6dc9357SAndroid Build Coastguard Worker */
241*f6dc9357SAndroid Build Coastguard Worker
242*f6dc9357SAndroid Build Coastguard Worker CMyComBSTR& operator=(LPCOLESTR src)
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker ::SysFreeString(m_str);
245*f6dc9357SAndroid Build Coastguard Worker m_str = ::SysAllocString(src);
246*f6dc9357SAndroid Build Coastguard Worker return *this;
247*f6dc9357SAndroid Build Coastguard Worker }
248*f6dc9357SAndroid Build Coastguard Worker
Len()249*f6dc9357SAndroid Build Coastguard Worker unsigned Len() const { return ::SysStringLen(m_str); }
250*f6dc9357SAndroid Build Coastguard Worker
MyCopy()251*f6dc9357SAndroid Build Coastguard Worker BSTR MyCopy() const
252*f6dc9357SAndroid Build Coastguard Worker {
253*f6dc9357SAndroid Build Coastguard Worker // We don't support Byte BSTRs here
254*f6dc9357SAndroid Build Coastguard Worker return ::SysAllocStringLen(m_str, ::SysStringLen(m_str));
255*f6dc9357SAndroid Build Coastguard Worker /*
256*f6dc9357SAndroid Build Coastguard Worker UINT byteLen = ::SysStringByteLen(m_str);
257*f6dc9357SAndroid Build Coastguard Worker BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
258*f6dc9357SAndroid Build Coastguard Worker if (res && byteLen != 0 && m_str)
259*f6dc9357SAndroid Build Coastguard Worker memcpy(res, m_str, byteLen);
260*f6dc9357SAndroid Build Coastguard Worker return res;
261*f6dc9357SAndroid Build Coastguard Worker */
262*f6dc9357SAndroid Build Coastguard Worker }
263*f6dc9357SAndroid Build Coastguard Worker
264*f6dc9357SAndroid Build Coastguard Worker /*
265*f6dc9357SAndroid Build Coastguard Worker void Attach(BSTR src) { m_str = src; }
266*f6dc9357SAndroid Build Coastguard Worker BSTR Detach()
267*f6dc9357SAndroid Build Coastguard Worker {
268*f6dc9357SAndroid Build Coastguard Worker BSTR s = m_str;
269*f6dc9357SAndroid Build Coastguard Worker m_str = NULL;
270*f6dc9357SAndroid Build Coastguard Worker return s;
271*f6dc9357SAndroid Build Coastguard Worker }
272*f6dc9357SAndroid Build Coastguard Worker */
273*f6dc9357SAndroid Build Coastguard Worker
Empty()274*f6dc9357SAndroid Build Coastguard Worker void Empty()
275*f6dc9357SAndroid Build Coastguard Worker {
276*f6dc9357SAndroid Build Coastguard Worker ::SysFreeString(m_str);
277*f6dc9357SAndroid Build Coastguard Worker m_str = NULL;
278*f6dc9357SAndroid Build Coastguard Worker }
279*f6dc9357SAndroid Build Coastguard Worker };
280*f6dc9357SAndroid Build Coastguard Worker
281*f6dc9357SAndroid Build Coastguard Worker
282*f6dc9357SAndroid Build Coastguard Worker class CMyComBSTR_Wipe: public CMyComBSTR
283*f6dc9357SAndroid Build Coastguard Worker {
Z7_CLASS_NO_COPY(CMyComBSTR_Wipe)284*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CMyComBSTR_Wipe)
285*f6dc9357SAndroid Build Coastguard Worker public:
286*f6dc9357SAndroid Build Coastguard Worker CMyComBSTR_Wipe(): CMyComBSTR() {}
~CMyComBSTR_Wipe()287*f6dc9357SAndroid Build Coastguard Worker ~CMyComBSTR_Wipe() { Wipe_and_Free(); }
288*f6dc9357SAndroid Build Coastguard Worker };
289*f6dc9357SAndroid Build Coastguard Worker
290*f6dc9357SAndroid Build Coastguard Worker
291*f6dc9357SAndroid Build Coastguard Worker
292*f6dc9357SAndroid Build Coastguard Worker /*
293*f6dc9357SAndroid Build Coastguard Worker If CMyUnknownImp doesn't use virtual destructor, the code size is smaller.
294*f6dc9357SAndroid Build Coastguard Worker But if some class_1 derived from CMyUnknownImp
295*f6dc9357SAndroid Build Coastguard Worker uses Z7_COM_ADDREF_RELEASE and IUnknown::Release()
296*f6dc9357SAndroid Build Coastguard Worker and some another class_2 is derived from class_1,
297*f6dc9357SAndroid Build Coastguard Worker then class_1 must use virtual destructor:
298*f6dc9357SAndroid Build Coastguard Worker virtual ~class_1();
299*f6dc9357SAndroid Build Coastguard Worker In that case, class_1::Release() calls correct destructor of class_2.
300*f6dc9357SAndroid Build Coastguard Worker We can use virtual ~CMyUnknownImp() to disable warning
301*f6dc9357SAndroid Build Coastguard Worker "class has virtual functions, but destructor is not virtual".
302*f6dc9357SAndroid Build Coastguard Worker Also we can use virtual ~IUnknown() {} in MyWindows.h
303*f6dc9357SAndroid Build Coastguard Worker */
304*f6dc9357SAndroid Build Coastguard Worker
305*f6dc9357SAndroid Build Coastguard Worker class CMyUnknownImp
306*f6dc9357SAndroid Build Coastguard Worker {
Z7_CLASS_NO_COPY(CMyUnknownImp)307*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CMyUnknownImp)
308*f6dc9357SAndroid Build Coastguard Worker protected:
309*f6dc9357SAndroid Build Coastguard Worker ULONG _m_RefCount;
310*f6dc9357SAndroid Build Coastguard Worker CMyUnknownImp(): _m_RefCount(0) {}
311*f6dc9357SAndroid Build Coastguard Worker
312*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
313*f6dc9357SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
314*f6dc9357SAndroid Build Coastguard Worker // virtual ~CMyUnknownImp() {} // to disable GCC/CLANG varnings
315*f6dc9357SAndroid Build Coastguard Worker #endif
316*f6dc9357SAndroid Build Coastguard Worker #endif
317*f6dc9357SAndroid Build Coastguard Worker };
318*f6dc9357SAndroid Build Coastguard Worker
319*f6dc9357SAndroid Build Coastguard Worker
320*f6dc9357SAndroid Build Coastguard Worker
321*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_BEGIN \
322*f6dc9357SAndroid Build Coastguard Worker private: STDMETHOD(QueryInterface) (REFGUID iid, void **outObject) throw() Z7_override Z7_final \
323*f6dc9357SAndroid Build Coastguard Worker { *outObject = NULL;
324*f6dc9357SAndroid Build Coastguard Worker
325*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY(i) \
326*f6dc9357SAndroid Build Coastguard Worker else if (iid == IID_ ## i) \
327*f6dc9357SAndroid Build Coastguard Worker { i *ti = this; *outObject = ti; }
328*f6dc9357SAndroid Build Coastguard Worker // { *outObject = (void *)(i *)this; }
329*f6dc9357SAndroid Build Coastguard Worker
330*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY_UNKNOWN_0 \
331*f6dc9357SAndroid Build Coastguard Worker if (iid == IID_IUnknown) \
332*f6dc9357SAndroid Build Coastguard Worker { IUnknown *tu = this; *outObject = tu; }
333*f6dc9357SAndroid Build Coastguard Worker
334*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY_UNKNOWN(i) \
335*f6dc9357SAndroid Build Coastguard Worker if (iid == IID_IUnknown) \
336*f6dc9357SAndroid Build Coastguard Worker { i *ti = this; IUnknown *tu = ti; *outObject = tu; }
337*f6dc9357SAndroid Build Coastguard Worker // { *outObject = (void *)(IUnknown *)(i *)this; }
338*f6dc9357SAndroid Build Coastguard Worker
339*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_BEGIN2(i) \
340*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_BEGIN \
341*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN(i) \
342*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i)
343*f6dc9357SAndroid Build Coastguard Worker
344*f6dc9357SAndroid Build Coastguard Worker
345*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_ADDREF_RELEASE_MT \
346*f6dc9357SAndroid Build Coastguard Worker private: \
347*f6dc9357SAndroid Build Coastguard Worker STDMETHOD_(ULONG, AddRef)() Z7_override Z7_final \
348*f6dc9357SAndroid Build Coastguard Worker { return (ULONG)InterlockedIncrement((LONG *)&_m_RefCount); } \
349*f6dc9357SAndroid Build Coastguard Worker STDMETHOD_(ULONG, Release)() Z7_override Z7_final \
350*f6dc9357SAndroid Build Coastguard Worker { const LONG v = InterlockedDecrement((LONG *)&_m_RefCount); \
351*f6dc9357SAndroid Build Coastguard Worker if (v != 0) return (ULONG)v; \
352*f6dc9357SAndroid Build Coastguard Worker delete this; return 0; }
353*f6dc9357SAndroid Build Coastguard Worker
354*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_END_MT \
355*f6dc9357SAndroid Build Coastguard Worker else return E_NOINTERFACE; \
356*f6dc9357SAndroid Build Coastguard Worker InterlockedIncrement((LONG *)&_m_RefCount); /* AddRef(); */ return S_OK; }
357*f6dc9357SAndroid Build Coastguard Worker
358*f6dc9357SAndroid Build Coastguard Worker // you can define Z7_COM_USE_ATOMIC,
359*f6dc9357SAndroid Build Coastguard Worker // if you want to call Release() from different threads (for example, for .NET code)
360*f6dc9357SAndroid Build Coastguard Worker // #define Z7_COM_USE_ATOMIC
361*f6dc9357SAndroid Build Coastguard Worker
362*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_COM_USE_ATOMIC) && !defined(Z7_ST)
363*f6dc9357SAndroid Build Coastguard Worker
364*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
365*f6dc9357SAndroid Build Coastguard Worker #if 0
366*f6dc9357SAndroid Build Coastguard Worker #include "../../C/Threads.h"
367*f6dc9357SAndroid Build Coastguard Worker #else
368*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
369*f6dc9357SAndroid Build Coastguard Worker LONG InterlockedIncrement(LONG volatile *addend);
370*f6dc9357SAndroid Build Coastguard Worker LONG InterlockedDecrement(LONG volatile *addend);
371*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
372*f6dc9357SAndroid Build Coastguard Worker #endif
373*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32
374*f6dc9357SAndroid Build Coastguard Worker
375*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_ADDREF_RELEASE Z7_COM_ADDREF_RELEASE_MT
376*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_END Z7_COM_QI_END_MT
377*f6dc9357SAndroid Build Coastguard Worker
378*f6dc9357SAndroid Build Coastguard Worker #else // !Z7_COM_USE_ATOMIC
379*f6dc9357SAndroid Build Coastguard Worker
380*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_ADDREF_RELEASE \
381*f6dc9357SAndroid Build Coastguard Worker private: \
382*f6dc9357SAndroid Build Coastguard Worker STDMETHOD_(ULONG, AddRef)() throw() Z7_override Z7_final \
383*f6dc9357SAndroid Build Coastguard Worker { return ++_m_RefCount; } \
384*f6dc9357SAndroid Build Coastguard Worker STDMETHOD_(ULONG, Release)() throw() Z7_override Z7_final \
385*f6dc9357SAndroid Build Coastguard Worker { if (--_m_RefCount != 0) return _m_RefCount; \
386*f6dc9357SAndroid Build Coastguard Worker delete this; return 0; }
387*f6dc9357SAndroid Build Coastguard Worker
388*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_END \
389*f6dc9357SAndroid Build Coastguard Worker else return E_NOINTERFACE; \
390*f6dc9357SAndroid Build Coastguard Worker ++_m_RefCount; /* AddRef(); */ return S_OK; }
391*f6dc9357SAndroid Build Coastguard Worker
392*f6dc9357SAndroid Build Coastguard Worker #endif // !Z7_COM_USE_ATOMIC
393*f6dc9357SAndroid Build Coastguard Worker
394*f6dc9357SAndroid Build Coastguard Worker
395*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_SPEC(i) \
396*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_BEGIN \
397*f6dc9357SAndroid Build Coastguard Worker i \
398*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_END \
399*f6dc9357SAndroid Build Coastguard Worker Z7_COM_ADDREF_RELEASE
400*f6dc9357SAndroid Build Coastguard Worker
401*f6dc9357SAndroid Build Coastguard Worker
402*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_0 \
403*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_BEGIN \
404*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN_0 \
405*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_END \
406*f6dc9357SAndroid Build Coastguard Worker Z7_COM_ADDREF_RELEASE
407*f6dc9357SAndroid Build Coastguard Worker
408*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_1(i) \
409*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_SPEC( \
410*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN(i) \
411*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i) \
412*f6dc9357SAndroid Build Coastguard Worker )
413*f6dc9357SAndroid Build Coastguard Worker
414*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_2(i1, i2) \
415*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_SPEC( \
416*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN(i1) \
417*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i1) \
418*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i2) \
419*f6dc9357SAndroid Build Coastguard Worker )
420*f6dc9357SAndroid Build Coastguard Worker
421*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_3(i1, i2, i3) \
422*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_SPEC( \
423*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN(i1) \
424*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i1) \
425*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i2) \
426*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i3) \
427*f6dc9357SAndroid Build Coastguard Worker )
428*f6dc9357SAndroid Build Coastguard Worker
429*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_4(i1, i2, i3, i4) \
430*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_SPEC( \
431*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN(i1) \
432*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i1) \
433*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i2) \
434*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i3) \
435*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i4) \
436*f6dc9357SAndroid Build Coastguard Worker )
437*f6dc9357SAndroid Build Coastguard Worker
438*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_5(i1, i2, i3, i4, i5) \
439*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_SPEC( \
440*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN(i1) \
441*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i1) \
442*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i2) \
443*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i3) \
444*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i4) \
445*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i5) \
446*f6dc9357SAndroid Build Coastguard Worker )
447*f6dc9357SAndroid Build Coastguard Worker
448*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_6(i1, i2, i3, i4, i5, i6) \
449*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_SPEC( \
450*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN(i1) \
451*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i1) \
452*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i2) \
453*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i3) \
454*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i4) \
455*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i5) \
456*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i6) \
457*f6dc9357SAndroid Build Coastguard Worker )
458*f6dc9357SAndroid Build Coastguard Worker
459*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_7(i1, i2, i3, i4, i5, i6, i7) \
460*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_SPEC( \
461*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN(i1) \
462*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i1) \
463*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i2) \
464*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i3) \
465*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i4) \
466*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i5) \
467*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i6) \
468*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i7) \
469*f6dc9357SAndroid Build Coastguard Worker )
470*f6dc9357SAndroid Build Coastguard Worker
471*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_8(i1, i2, i3, i4, i5, i6, i7, i8) \
472*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_SPEC( \
473*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_UNKNOWN(i1) \
474*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i1) \
475*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i2) \
476*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i3) \
477*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i4) \
478*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i5) \
479*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i6) \
480*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i7) \
481*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(i8) \
482*f6dc9357SAndroid Build Coastguard Worker )
483*f6dc9357SAndroid Build Coastguard Worker
484*f6dc9357SAndroid Build Coastguard Worker
485*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_1(i1) \
486*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_1(i1) \
487*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
488*f6dc9357SAndroid Build Coastguard Worker
489*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_2(i1, i2) \
490*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_2(i1, i2) \
491*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
492*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
493*f6dc9357SAndroid Build Coastguard Worker
494*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_3(i1, i2, i3) \
495*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_3(i1, i2, i3) \
496*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
497*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
498*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i3) \
499*f6dc9357SAndroid Build Coastguard Worker
500*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_4(i1, i2, i3, i4) \
501*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_4(i1, i2, i3, i4) \
502*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
503*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
504*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i3) \
505*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i4) \
506*f6dc9357SAndroid Build Coastguard Worker
507*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_5(i1, i2, i3, i4, i5) \
508*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_5(i1, i2, i3, i4, i5) \
509*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
510*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
511*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i3) \
512*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i4) \
513*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i5) \
514*f6dc9357SAndroid Build Coastguard Worker
515*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_6(i1, i2, i3, i4, i5, i6) \
516*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_6(i1, i2, i3, i4, i5, i6) \
517*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
518*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
519*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i3) \
520*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i4) \
521*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i5) \
522*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i6) \
523*f6dc9357SAndroid Build Coastguard Worker
524*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_7(i1, i2, i3, i4, i5, i6, i7) \
525*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_7(i1, i2, i3, i4, i5, i6, i7) \
526*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
527*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
528*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i3) \
529*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i4) \
530*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i5) \
531*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i6) \
532*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i7) \
533*f6dc9357SAndroid Build Coastguard Worker
534*f6dc9357SAndroid Build Coastguard Worker
535*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_0(c) \
536*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
537*f6dc9357SAndroid Build Coastguard Worker public IUnknown, \
538*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
539*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_0 \
540*f6dc9357SAndroid Build Coastguard Worker private:
541*f6dc9357SAndroid Build Coastguard Worker
542*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_1(c, i1) \
543*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
544*f6dc9357SAndroid Build Coastguard Worker public i1, \
545*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
546*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_1(i1) \
547*f6dc9357SAndroid Build Coastguard Worker private:
548*f6dc9357SAndroid Build Coastguard Worker
549*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_2(c, i1, i2) \
550*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
551*f6dc9357SAndroid Build Coastguard Worker public i1, \
552*f6dc9357SAndroid Build Coastguard Worker public i2, \
553*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
554*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_2(i1, i2) \
555*f6dc9357SAndroid Build Coastguard Worker private:
556*f6dc9357SAndroid Build Coastguard Worker
557*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_3(c, i1, i2, i3) \
558*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
559*f6dc9357SAndroid Build Coastguard Worker public i1, \
560*f6dc9357SAndroid Build Coastguard Worker public i2, \
561*f6dc9357SAndroid Build Coastguard Worker public i3, \
562*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
563*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_3(i1, i2, i3) \
564*f6dc9357SAndroid Build Coastguard Worker private:
565*f6dc9357SAndroid Build Coastguard Worker
566*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_4(c, i1, i2, i3, i4) \
567*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
568*f6dc9357SAndroid Build Coastguard Worker public i1, \
569*f6dc9357SAndroid Build Coastguard Worker public i2, \
570*f6dc9357SAndroid Build Coastguard Worker public i3, \
571*f6dc9357SAndroid Build Coastguard Worker public i4, \
572*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
573*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_4(i1, i2, i3, i4) \
574*f6dc9357SAndroid Build Coastguard Worker private:
575*f6dc9357SAndroid Build Coastguard Worker
576*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_5(c, i1, i2, i3, i4, i5) \
577*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
578*f6dc9357SAndroid Build Coastguard Worker public i1, \
579*f6dc9357SAndroid Build Coastguard Worker public i2, \
580*f6dc9357SAndroid Build Coastguard Worker public i3, \
581*f6dc9357SAndroid Build Coastguard Worker public i4, \
582*f6dc9357SAndroid Build Coastguard Worker public i5, \
583*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
584*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_5(i1, i2, i3, i4, i5) \
585*f6dc9357SAndroid Build Coastguard Worker private:
586*f6dc9357SAndroid Build Coastguard Worker
587*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_6(c, i1, i2, i3, i4, i5, i6) \
588*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
589*f6dc9357SAndroid Build Coastguard Worker public i1, \
590*f6dc9357SAndroid Build Coastguard Worker public i2, \
591*f6dc9357SAndroid Build Coastguard Worker public i3, \
592*f6dc9357SAndroid Build Coastguard Worker public i4, \
593*f6dc9357SAndroid Build Coastguard Worker public i5, \
594*f6dc9357SAndroid Build Coastguard Worker public i6, \
595*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
596*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_6(i1, i2, i3, i4, i5, i6) \
597*f6dc9357SAndroid Build Coastguard Worker private:
598*f6dc9357SAndroid Build Coastguard Worker
599*f6dc9357SAndroid Build Coastguard Worker
600*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_7(c, i1, i2, i3, i4, i5, i6, i7) \
601*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
602*f6dc9357SAndroid Build Coastguard Worker public i1, \
603*f6dc9357SAndroid Build Coastguard Worker public i2, \
604*f6dc9357SAndroid Build Coastguard Worker public i3, \
605*f6dc9357SAndroid Build Coastguard Worker public i4, \
606*f6dc9357SAndroid Build Coastguard Worker public i5, \
607*f6dc9357SAndroid Build Coastguard Worker public i6, \
608*f6dc9357SAndroid Build Coastguard Worker public i7, \
609*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
610*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_7(i1, i2, i3, i4, i5, i6, i7) \
611*f6dc9357SAndroid Build Coastguard Worker private:
612*f6dc9357SAndroid Build Coastguard Worker
613*f6dc9357SAndroid Build Coastguard Worker
614*f6dc9357SAndroid Build Coastguard Worker /*
615*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_0(c) \
616*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
617*f6dc9357SAndroid Build Coastguard Worker public IUnknown, \
618*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
619*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_0 \
620*f6dc9357SAndroid Build Coastguard Worker private:
621*f6dc9357SAndroid Build Coastguard Worker */
622*f6dc9357SAndroid Build Coastguard Worker
623*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_1(c, i1) \
624*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
625*f6dc9357SAndroid Build Coastguard Worker public i1, \
626*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
627*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_0 \
628*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
629*f6dc9357SAndroid Build Coastguard Worker private:
630*f6dc9357SAndroid Build Coastguard Worker
631*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_2(c, i1, i2) \
632*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
633*f6dc9357SAndroid Build Coastguard Worker public i1, \
634*f6dc9357SAndroid Build Coastguard Worker public i2, \
635*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
636*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_1(i2) \
637*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
638*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
639*f6dc9357SAndroid Build Coastguard Worker private:
640*f6dc9357SAndroid Build Coastguard Worker
641*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_3(c, i1, i2, i3) \
642*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
643*f6dc9357SAndroid Build Coastguard Worker public i1, \
644*f6dc9357SAndroid Build Coastguard Worker public i2, \
645*f6dc9357SAndroid Build Coastguard Worker public i3, \
646*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
647*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_2(i2, i3) \
648*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
649*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
650*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i3) \
651*f6dc9357SAndroid Build Coastguard Worker private:
652*f6dc9357SAndroid Build Coastguard Worker
653*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_4(c, i1, i2, i3, i4) \
654*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
655*f6dc9357SAndroid Build Coastguard Worker public i1, \
656*f6dc9357SAndroid Build Coastguard Worker public i2, \
657*f6dc9357SAndroid Build Coastguard Worker public i3, \
658*f6dc9357SAndroid Build Coastguard Worker public i4, \
659*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
660*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_3(i2, i3, i4) \
661*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
662*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
663*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i3) \
664*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i4) \
665*f6dc9357SAndroid Build Coastguard Worker
666*f6dc9357SAndroid Build Coastguard Worker /*
667*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_5(c, i1, i2, i3, i4, i5) \
668*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(c) : \
669*f6dc9357SAndroid Build Coastguard Worker public i1, \
670*f6dc9357SAndroid Build Coastguard Worker public i2, \
671*f6dc9357SAndroid Build Coastguard Worker public i3, \
672*f6dc9357SAndroid Build Coastguard Worker public i4, \
673*f6dc9357SAndroid Build Coastguard Worker public i5, \
674*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
675*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_4(i2, i3, i4, i5) \
676*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i1) \
677*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i2) \
678*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i3) \
679*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i4) \
680*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(i5) \
681*f6dc9357SAndroid Build Coastguard Worker */
682*f6dc9357SAndroid Build Coastguard Worker
683*f6dc9357SAndroid Build Coastguard Worker
684*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_IInStream(c) \
685*f6dc9357SAndroid Build Coastguard Worker class c Z7_final : \
686*f6dc9357SAndroid Build Coastguard Worker public IInStream, \
687*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp { \
688*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_2(ISequentialInStream, IInStream) \
689*f6dc9357SAndroid Build Coastguard Worker
690*f6dc9357SAndroid Build Coastguard Worker
691*f6dc9357SAndroid Build Coastguard Worker #define k_My_HRESULT_WritingWasCut 0x20000010
692*f6dc9357SAndroid Build Coastguard Worker
693*f6dc9357SAndroid Build Coastguard Worker #endif
694