obj_base.h patch

Ove Kaaven ovehk at ping.uio.no
Tue Nov 5 16:35:37 CST 2002


This is supposed to make it easier for widl to emit a reasonably simple
definition for that ancestorless COM base class (IUnknown).

Log:
Ove Kaaven <ovek at transgaming.com>
Add ICOM_DEFINE1 macro to define a COM interface without a base class.
Use it to define IUnknown.

Index: include/wine/obj_base.h
===================================================================
RCS file: /cvsroot/rewind/rewind/include/wine/obj_base.h,v
retrieving revision 1.46
diff -u -r1.46 obj_base.h
--- include/wine/obj_base.h	5 Nov 2002 21:51:41 -0000	1.46
+++ include/wine/obj_base.h	5 Nov 2002 21:56:56 -0000
@@ -305,6 +305,12 @@
 #define ICOM_CINTERFACE 1
 #endif
 
+#ifdef ICOM_USE_COM_INTERFACE_ATTRIBUTE
+#define ICOM_COM_INTERFACE_ATTRIBUTE __attribute__((com_interface))
+#else
+#define ICOM_COM_INTERFACE_ATTRIBUTE
+#endif
+
 #ifndef ICOM_CINTERFACE
 /* C++ interface */
 
@@ -420,21 +426,14 @@
     public: virtual void CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j,tk k,tl l,tm m,tn n,to o,tp p,tq q,tr r,ts s,tt t,tu u,tv v,tw w,tx x,ty y,tz z) = 0;
 
 
-#ifdef ICOM_USE_COM_INTERFACE_ATTRIBUTE
-
 #define ICOM_DEFINE(iface,ibase) \
     struct iface: public ibase { \
         iface##_METHODS \
-            } __attribute__ ((com_interface));
-
-#else
-
-#define ICOM_DEFINE(iface,ibase) \
-    struct iface: public ibase { \
+    } ICOM_COM_INTERFACE_ATTRIBUTE;
+#define ICOM_DEFINE1(iface) \
+    struct iface { \
         iface##_METHODS \
-    };
-
-#endif /* ICOM_USE_COM_INTERFACE_ATTRIBUTE */
+    } ICOM_COM_INTERFACE_ATTRIBUTE;
 
 #define ICOM_VTBL(iface)         (iface)
 
@@ -557,32 +556,34 @@
 #define ICOM_VTBL(iface)         (iface)->lpVtbl
 
 #ifdef ICOM_MSVTABLE_COMPAT
+#define ICOM_MSVTABLE_COMPAT_FIELDS \
+        long dummyRTTI1; \
+        long dummyRTTI2;
+#define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 0,0,
+#else
+#define ICOM_MSVTABLE_COMPAT_FIELDS
+#define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+#endif /* ICOM_MSVTABLE_COMPAT */
+
 #define ICOM_DEFINE(iface,ibase) \
     typedef struct ICOM_VTABLE(iface) ICOM_VTABLE(iface); \
     struct iface { \
         const ICOM_VFIELD(iface); \
     }; \
     struct ICOM_VTABLE(iface) { \
-        long dummyRTTI1; \
-        long dummyRTTI2; \
+        ICOM_MSVTABLE_COMPAT_FIELDS \
         ibase##_IMETHODS \
         iface##_METHODS \
     };
-#define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 0,0,
-
-#else
-#define ICOM_DEFINE(iface,ibase) \
+#define ICOM_DEFINE1(iface) \
     typedef struct ICOM_VTABLE(iface) ICOM_VTABLE(iface); \
     struct iface { \
         const ICOM_VFIELD(iface); \
     }; \
     struct ICOM_VTABLE(iface) { \
-        ibase##_IMETHODS \
+        ICOM_MSVTABLE_COMPAT_FIELDS \
         iface##_METHODS \
     };
-#define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
-#endif /* ICOM_MSVTABLE_COMPAT */
-
 
 #define ICOM_THIS(impl,iface)          impl* const This=(impl*)(iface)
 #define ICOM_CTHIS(impl,iface)         const impl* const This=(const impl*)(iface)
@@ -638,42 +639,13 @@
  * IUnknown interface
  */
 #define ICOM_INTERFACE IUnknown
-#define IUnknown_IMETHODS \
+#define IUnknown_METHODS \
     ICOM_METHOD2(HRESULT,QueryInterface,REFIID,riid, LPVOID*,ppvObj) \
     ICOM_METHOD (ULONG,AddRef) \
     ICOM_METHOD (ULONG,Release)
-#ifdef ICOM_CINTERFACE
-typedef struct ICOM_VTABLE(IUnknown) ICOM_VTABLE(IUnknown);
-struct IUnknown {
-    ICOM_VFIELD(IUnknown);
-}
-#if defined(ICOM_USE_COM_INTERFACE_ATTRIBUTE)
-__attribute__ ((com_interface));
-#else
-;
-#endif /* ICOM_US_COM_INTERFACE_ATTRIBUTE */
-
-struct ICOM_VTABLE(IUnknown) {
-#ifdef ICOM_MSVTABLE_COMPAT
-    long dummyRTTI1;
-    long dummyRTTI2;
-#endif /* ICOM_MSVTABLE_COMPAT */
-
-#else /* ICOM_CINTERFACE */
-struct IUnknown {
-
-#endif /* ICOM_CINTERFACE */
-
-    ICOM_METHOD2(HRESULT,QueryInterface,REFIID,riid, LPVOID*,ppvObj)
-    ICOM_METHOD (ULONG,AddRef)
-    ICOM_METHOD (ULONG,Release)
-}
-#if defined(ICOM_USE_COM_INTERFACE_ATTRIBUTE)
-__attribute__ ((com_interface));
-#else
-;
-#endif /* ICOM_US_COM_INTERFACE_ATTRIBUTE */
-
+#define IUnknown_IMETHODS \
+    IUnknown_METHODS
+ICOM_DEFINE1(IUnknown)
 #undef ICOM_INTERFACE
 
 /*** IUnknown methods ***/




More information about the wine-patches mailing list