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