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