PATCH: Enhanced ddraw COM management

Christian Costa titan.costa at wanadoo.fr
Tue Oct 29 01:32:39 CST 2002


This patch add a pointer of the object itself just after each VTable as 
shown below :

object {
  VTable1
   pointer to object
  VTable2
   pointer to object
   ..........................
  VTableN
   pointer to object

   private data
}

The benefits are :
- the object is retreived directly and it no more necessary to known the 
interface used
- increase functions sharing and reduce interface thunks usage

This patch is a part of the D3D restructuration.

Modified files :
dlls/ddraw                     d3d_private.h d3dexecutebuffer.c 
d3dlight.c d3dmaterial.c
                                       d3dtexture.c d3dviewport.c 
ddcomimpl.h
dlls/ddraw/d3ddevice   main.c mesa.c
dlls/ddraw/dclipper      main.c
dlls/ddraw/ddraw          hal.c main.c user.c
dlls/ddraw/direct3d      main.c mesa.c
dlls/ddraw/dpalette      main.c hal.c
dlls/ddraw/durface       dib.c main.c gamma.c hal.c

Changelog :
Enhance ddraw COM macros by adding a pointer to the object itself after 
each VTable
and make use of them.

Christian Costa   titan.costa at wanadoo.fr

-------------- next part --------------
Index: d3d_private.h
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3d_private.h,v
retrieving revision 1.9
diff -u -r1.9 d3d_private.h
--- d3d_private.h	16 Oct 2002 18:57:52 -0000	1.9
+++ d3d_private.h	28 Oct 2002 21:56:44 -0000
@@ -53,7 +53,7 @@
 struct IDirect3DImpl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3D);
+    ICOM_VFIELD_MULTI(IDirect3D);
     DWORD                   ref;
     /* IDirect3D fields */
     IDirectDrawImpl*	ddraw;
@@ -66,7 +66,7 @@
 struct IDirect3D2Impl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3D2);
+    ICOM_VFIELD_MULTI(IDirect3D2);
     DWORD                    ref;
     /* IDirect3D2 fields */
     IDirectDrawImpl*	ddraw;
@@ -76,7 +76,7 @@
 struct IDirect3D3Impl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3D3);
+    ICOM_VFIELD_MULTI(IDirect3D3);
     DWORD                    ref;
     /* IDirect3D2 fields */
     IDirectDrawImpl*    ddraw;
@@ -84,7 +84,6 @@
     /* IDirect3D3 fields */
 };
 
-
 extern HRESULT WINAPI IDirect3DImpl_QueryInterface(
     LPDIRECT3D iface,REFIID refiid,LPVOID *obj
 );
@@ -136,7 +135,7 @@
 struct IDirect3DLightImpl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3DLight);
+    ICOM_VFIELD_MULTI(IDirect3DLight);
     DWORD                        ref;
     /* IDirect3DLight fields */
     union {
@@ -163,7 +162,7 @@
 struct IDirect3DMaterial2Impl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3DMaterial2);
+    ICOM_VFIELD_MULTI(IDirect3DMaterial2);
     DWORD                            ref;
     /* IDirect3DMaterial2 fields */
     union {
@@ -188,7 +187,7 @@
 struct IDirect3DTexture2Impl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3DTexture2);
+    ICOM_VFIELD_MULTI(IDirect3DTexture2);
     DWORD                           ref;
     /* IDirect3DTexture2 fields */
     void*			D3Ddevice; /* (void *) to use the same pointer
@@ -228,7 +227,7 @@
 struct IDirect3DViewport2Impl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3DViewport2);
+    ICOM_VFIELD_MULTI(IDirect3DViewport2);
     DWORD                            ref;
     /* IDirect3DViewport2 fields */
     union {
@@ -321,7 +320,7 @@
 struct IDirect3DExecuteBufferImpl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3DExecuteBuffer);
+    ICOM_VFIELD_MULTI(IDirect3DExecuteBuffer);
     DWORD                                ref;
     /* IDirect3DExecuteBuffer fields */
     IDirect3DDeviceImpl* d3ddev;
@@ -350,7 +349,7 @@
 struct IDirect3DDeviceImpl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3DDevice);
+    ICOM_VFIELD_MULTI(IDirect3DDevice);
     DWORD                         ref;
     /* IDirect3DDevice fields */
     IDirect3DImpl*          d3d;
@@ -370,7 +369,7 @@
 struct IDirect3DDevice2Impl
 {
     /* IUnknown fields */
-    ICOM_VFIELD(IDirect3DDevice2);
+    ICOM_VFIELD_MULTI(IDirect3DDevice2);
     DWORD                          ref;
     /* IDirect3DDevice fields */
     IDirect3D2Impl*         d3d;
Index: d3dexecutebuffer.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3dexecutebuffer.c,v
retrieving revision 1.11
diff -u -r1.11 d3dexecutebuffer.c
--- d3dexecutebuffer.c	29 Sep 2002 18:01:13 -0000	1.11
+++ d3dexecutebuffer.c	28 Oct 2002 21:56:46 -0000
@@ -186,8 +186,8 @@
 static void execute(LPDIRECT3DEXECUTEBUFFER lpBuff,
 		    LPDIRECT3DDEVICE dev,
 		    LPDIRECT3DVIEWPORT vp) {
-  IDirect3DExecuteBufferImpl* ilpBuff=(IDirect3DExecuteBufferImpl*)lpBuff;
-  IDirect3DViewport2Impl* ivp=(IDirect3DViewport2Impl*)vp;
+  IDirect3DExecuteBufferImpl* ilpBuff=ICOM_OBJECT(IDirect3DExecuteBufferImpl,lpBuff);
+  IDirect3DViewport2Impl* ivp=ICOM_OBJECT(IDirect3DViewport2Impl,vp);
   /* DWORD bs = ilpBuff->desc.dwBufferSize; */
   DWORD vs = ilpBuff->data.dwVertexOffset;
   /* DWORD vc = ilpBuff->data.dwVertexCount; */
@@ -195,12 +195,12 @@
   /* DWORD il = ilpBuff->data.dwInstructionLength; */
 
   void *instr = ilpBuff->desc.lpData + is;
-  D3DDPRIVATE((IDirect3DDeviceImpl*)dev);
+  D3DDPRIVATE(ICOM_OBJECT(IDirect3DDeviceImpl,dev));
 
   /* Should check if the viewport was added or not to the device */
 
   /* Activate the viewport */
-  ivp->device.active_device1 = (IDirect3DDeviceImpl*)dev;
+  ivp->device.active_device1 = ICOM_OBJECT(IDirect3DDeviceImpl,dev);
   ivp->activate(ivp);
 
   TRACE("ExecuteData : \n");
@@ -422,7 +422,7 @@
 	/* Handle the state transform */
 	switch (ci->u1.dlstLightStateType) {
 	case D3DLIGHTSTATE_MATERIAL: {
-	  IDirect3DMaterial2Impl* mat = (IDirect3DMaterial2Impl*) ci->u2.dwArg[0];
+	  IDirect3DMaterial2Impl* mat = ICOM_OBJECT(IDirect3DMaterial2Impl,ci->u2.dwArg[0]);
 	  TRACE("  MATERIAL\n");
 
 	  if (mat != NULL) {
@@ -690,7 +690,7 @@
 
   eb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DExecuteBufferImpl));
   eb->ref = 1;
-  ICOM_VTBL(eb) = &executebuffer_vtable;
+  ICOM_INIT_INTERFACE(eb,IDirect3DExecuteBuffer,executebuffer_vtable);
   eb->d3ddev = d3ddev;
 
   /* Initializes memory */
@@ -730,7 +730,7 @@
 							    REFIID riid,
 							    LPVOID* ppvObj)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
 
   FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
 
@@ -741,7 +741,7 @@
 
 static ULONG WINAPI IDirect3DExecuteBufferImpl_AddRef(LPDIRECT3DEXECUTEBUFFER iface)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
   TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
 
   return ++(This->ref);
@@ -751,7 +751,7 @@
 
 static ULONG WINAPI IDirect3DExecuteBufferImpl_Release(LPDIRECT3DEXECUTEBUFFER iface)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
   FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
 
   if (!--(This->ref)) {
@@ -772,7 +772,7 @@
 							LPDIRECT3DDEVICE lpDirect3DDevice,
 							LPD3DEXECUTEBUFFERDESC lpDesc)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
   FIXME("(%p)->(%p,%p): stub\n", This, lpDirect3DDevice, lpDesc);
 
   return DD_OK;
@@ -781,7 +781,7 @@
 static HRESULT WINAPI IDirect3DExecuteBufferImpl_Lock(LPDIRECT3DEXECUTEBUFFER iface,
 						  LPD3DEXECUTEBUFFERDESC lpDesc)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
   TRACE("(%p)->(%p)\n", This, lpDesc);
 
   /* Copies the buffer description */
@@ -792,7 +792,7 @@
 
 static HRESULT WINAPI IDirect3DExecuteBufferImpl_Unlock(LPDIRECT3DEXECUTEBUFFER iface)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
   TRACE("(%p)->()\n", This);
 
   return DD_OK;
@@ -801,7 +801,7 @@
 static HRESULT WINAPI IDirect3DExecuteBufferImpl_SetExecuteData(LPDIRECT3DEXECUTEBUFFER iface,
 							    LPD3DEXECUTEDATA lpData)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
   DWORD nbvert;
 
   TRACE("(%p)->(%p)\n", This, lpData);
@@ -827,7 +827,7 @@
 static HRESULT WINAPI IDirect3DExecuteBufferImpl_GetExecuteData(LPDIRECT3DEXECUTEBUFFER iface,
 							    LPD3DEXECUTEDATA lpData)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
   TRACE("(%p)->(%p): stub\n", This, lpData);
 
   *lpData = This->data;
@@ -841,7 +841,7 @@
 						      LPVOID lpUserArg,
 						      DWORD dwReserved)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
   TRACE("(%p)->(%p,%p,%p,%lu)\n", This, lpdwOffset, lpFunc, lpUserArg, dwReserved);
 
   return DD_OK;
@@ -850,7 +850,7 @@
 static HRESULT WINAPI IDirect3DExecuteBufferImpl_Optimize(LPDIRECT3DEXECUTEBUFFER iface,
 						      DWORD dwReserved)
 {
-  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DExecuteBufferImpl,iface);
   TRACE("(%p)->(%lu)\n", This, dwReserved);
 
   return DD_OK;
Index: d3dlight.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3dlight.c,v
retrieving revision 1.8
diff -u -r1.8 d3dlight.c
--- d3dlight.c	26 Sep 2002 03:20:23 -0000	1.8
+++ d3dlight.c	28 Oct 2002 21:56:46 -0000
@@ -113,7 +113,7 @@
   light = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DLightImpl));
   light->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dl_private));
   light->ref = 1;
-  ICOM_VTBL(light) = &light_vtable;
+  ICOM_INIT_INTERFACE(light,IDirect3DLight,light_vtable);
   light->d3d.d3d2 = d3d2;
   light->type = D3D_2;
 
@@ -132,7 +132,7 @@
   light = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DLightImpl));
   light->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dl_private));
   light->ref = 1;
-  ICOM_VTBL(light) = &light_vtable;
+  ICOM_INIT_INTERFACE(light,IDirect3DLight,light_vtable);
 
   light->d3d.d3d1 = d3d1;
   light->type = D3D_1;
@@ -153,7 +153,7 @@
 						    REFIID riid,
 						    LPVOID* ppvObj)
 {
-  ICOM_THIS(IDirect3DLightImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DLightImpl,iface);
 
   FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
 
@@ -164,7 +164,7 @@
 
 static ULONG WINAPI IDirect3DLightImpl_AddRef(LPDIRECT3DLIGHT iface)
 {
-  ICOM_THIS(IDirect3DLightImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DLightImpl,iface);
   TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
 
   return ++(This->ref);
@@ -174,7 +174,7 @@
 
 static ULONG WINAPI IDirect3DLightImpl_Release(LPDIRECT3DLIGHT iface)
 {
-  ICOM_THIS(IDirect3DLightImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DLightImpl,iface);
   TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
   if (!--(This->ref)) {
@@ -195,7 +195,7 @@
 static HRESULT WINAPI IDirect3DLightImpl_GetLight(LPDIRECT3DLIGHT iface,
 					      LPD3DLIGHT lpLight)
 {
-  ICOM_THIS(IDirect3DLightImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DLightImpl,iface);
   TRACE("(%p)->(%p)\n", This, lpLight);
   if (TRACE_ON(ddraw))
     dump_light(lpLight);
@@ -216,7 +216,7 @@
 static HRESULT WINAPI IDirect3DLightImpl_SetLight(LPDIRECT3DLIGHT iface,
 					      LPD3DLIGHT lpLight)
 {
-  ICOM_THIS(IDirect3DLightImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DLightImpl,iface);
   TRACE("(%p)->(%p)\n", This, lpLight);
   if (TRACE_ON(ddraw))
     dump_light(lpLight);
@@ -243,7 +243,7 @@
 						LPDIRECT3D lpDirect3D)
 
 {
-  ICOM_THIS(IDirect3DLightImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DLightImpl,iface);
   TRACE("(%p)->(%p)\n", This, lpDirect3D);
 
   return DDERR_ALREADYINITIALIZED;
Index: d3dmaterial.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3dmaterial.c,v
retrieving revision 1.9
diff -u -r1.9 d3dmaterial.c
--- d3dmaterial.c	31 May 2002 23:25:45 -0000	1.9
+++ d3dmaterial.c	28 Oct 2002 21:56:49 -0000
@@ -82,7 +82,7 @@
 
   mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2Impl));
   mat->ref = 1;
-  ICOM_VTBL(mat) = &material2_vtable;
+  ICOM_INIT_INTERFACE(mat,IDirect3DMaterial2,material2_vtable);
 
   mat->use_d3d2 = 1;
   mat->d3d.d3d2 = d3d2;
@@ -98,7 +98,7 @@
 
   mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2Impl));
   mat->ref = 1;
-  ICOM_VTBL(mat) = (ICOM_VTABLE(IDirect3DMaterial2)*)&material_vtable;
+  ICOM_INIT_INTERFACE(mat,IDirect3DMaterial2,*((ICOM_VTABLE(IDirect3DMaterial2)*)&material_vtable));
 
   mat->use_d3d2 = 0;
   mat->d3d.d3d1 = d3d1;
@@ -116,7 +116,7 @@
 							REFIID riid,
 							LPVOID* ppvObj)
 {
-  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DMaterial2Impl,iface);
 
   FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
 
@@ -127,7 +127,7 @@
 
 static ULONG WINAPI IDirect3DMaterial2Impl_AddRef(LPDIRECT3DMATERIAL2 iface)
 {
-  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DMaterial2Impl,iface);
   TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
 
   return ++(This->ref);
@@ -137,7 +137,7 @@
 
 static ULONG WINAPI IDirect3DMaterial2Impl_Release(LPDIRECT3DMATERIAL2 iface)
 {
-  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DMaterial2Impl,iface);
   FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
 
   if (!--(This->ref)) {
@@ -157,7 +157,7 @@
 static HRESULT WINAPI IDirect3DMaterial2Impl_GetMaterial(LPDIRECT3DMATERIAL2 iface,
 						     LPD3DMATERIAL lpMat)
 {
-  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DMaterial2Impl,iface);
   TRACE("(%p)->(%p)\n", This, lpMat);
   if (TRACE_ON(ddraw))
     dump_material(lpMat);
@@ -171,7 +171,7 @@
 static HRESULT WINAPI IDirect3DMaterial2Impl_SetMaterial(LPDIRECT3DMATERIAL2 iface,
 						     LPD3DMATERIAL lpMat)
 {
-  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DMaterial2Impl,iface);
   TRACE("(%p)->(%p)\n", This, lpMat);
   if (TRACE_ON(ddraw))
     dump_material(lpMat);
@@ -187,13 +187,13 @@
 						   LPD3DMATERIALHANDLE lpMatHandle)
 
 {
-  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DMaterial2Impl,iface);
   FIXME("(%p)->(%p,%p): stub\n", This, lpD3DDevice2, lpMatHandle);
 
   if (This->use_d3d2)
-    This->device.active_device2 = (IDirect3DDevice2Impl*)lpD3DDevice2;
+    This->device.active_device2 = ICOM_OBJECT(IDirect3DDevice2Impl,lpD3DDevice2);
   else
-    This->device.active_device1 = (IDirect3DDeviceImpl*)lpD3DDevice2;
+    This->device.active_device1 = ICOM_OBJECT(IDirect3DDeviceImpl,lpD3DDevice2);
 
   *lpMatHandle = (DWORD) This; /* lpD3DDevice2->store_material(This); */
 
@@ -202,7 +202,7 @@
 
 static HRESULT WINAPI IDirect3DMaterialImpl_Reserve(LPDIRECT3DMATERIAL iface)
 {
-  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DMaterial2Impl,iface);
   FIXME("(%p)->(): stub\n", This);
 
   return DDERR_INVALIDPARAMS;
@@ -210,7 +210,7 @@
 
 static HRESULT WINAPI IDirect3DMaterialImpl_Unreserve(LPDIRECT3DMATERIAL iface)
 {
-  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DMaterial2Impl,iface);
   FIXME("(%p)->(): stub\n", This);
 
   return DDERR_INVALIDPARAMS;
@@ -220,7 +220,7 @@
 						   LPDIRECT3D lpDirect3D)
 
 {
-  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DMaterial2Impl,iface);
   TRACE("(%p)->(%p)\n", This, lpDirect3D);
 
   return DDERR_ALREADYINITIALIZED;
Index: d3dtexture.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3dtexture.c,v
retrieving revision 1.15
diff -u -r1.15 d3dtexture.c
--- d3dtexture.c	16 Oct 2002 18:57:52 -0000	1.15
+++ d3dtexture.c	28 Oct 2002 21:56:49 -0000
@@ -121,7 +121,7 @@
 
   tex = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DTexture2Impl));
   tex->ref = 1;
-  ICOM_VTBL(tex) = &mesa_texture2_vtable;
+  ICOM_INIT_INTERFACE(tex,IDirect3DTexture2,mesa_texture2_vtable);
   tex->surface = surf;
 
   tex->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dt_private));
@@ -138,7 +138,7 @@
 
   tex = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DTexture2Impl));
   tex->ref = 1;
-  ICOM_VTBL(tex) = (ICOM_VTABLE(IDirect3DTexture2)*)&mesa_texture_vtable;
+  ICOM_INIT_INTERFACE(tex,IDirect3DTexture2,*((ICOM_VTABLE(IDirect3DTexture2)*)&mesa_texture_vtable));
   tex->surface = surf;
 
   tex->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dt_private));
@@ -244,7 +244,7 @@
 							REFIID riid,
 							LPVOID* ppvObj)
 {
-  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DTexture2Impl,iface);
 
   FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
 
@@ -255,7 +255,7 @@
 
 ULONG WINAPI IDirect3DTexture2Impl_AddRef(LPDIRECT3DTEXTURE2 iface)
 {
-  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DTexture2Impl,iface);
   TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
 
   return ++(This->ref);
@@ -265,7 +265,7 @@
 
 ULONG WINAPI IDirect3DTexture2Impl_Release(LPDIRECT3DTEXTURE2 iface)
 {
-  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DTexture2Impl,iface);
   D3DTPRIVATE(This);
   FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
 
@@ -290,9 +290,9 @@
 						 LPDIRECT3DDEVICE lpD3DDevice,
 						 LPD3DTEXTUREHANDLE lpHandle)
 {
-    ICOM_THIS(IDirect3DTexture2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DTexture2Impl,iface);
     D3DTPRIVATE(This);
-    IDirect3DDeviceImpl* ilpD3DDevice=(IDirect3DDeviceImpl*)lpD3DDevice;
+    IDirect3DDeviceImpl* ilpD3DDevice=ICOM_OBJECT(IDirect3DDeviceImpl,lpD3DDevice);
     FIXME("(%p)->(%p,%p): stub\n", This, ilpD3DDevice, lpHandle);
 
     *lpHandle = (D3DTEXTUREHANDLE) This;
@@ -310,7 +310,7 @@
     if (ilpD3DDevice->current_texture)
       IDirect3DTexture2Impl_Release((LPDIRECT3DTEXTURE2)ilpD3DDevice->current_texture);           
     IDirect3DTexture2Impl_AddRef((LPDIRECT3DTEXTURE2)iface);
-    ilpD3DDevice->current_texture = (IDirect3DTexture2Impl*)iface;   
+    ilpD3DDevice->current_texture = ICOM_OBJECT(IDirect3DTexture2Impl,iface);   
 
     TRACE("OpenGL texture handle is : %d\n", dtpriv->tex_name);
 
@@ -321,7 +321,7 @@
 						  LPDIRECT3DDEVICE lpD3DDevice,
 						  LPDIRECTDRAWSURFACE lpSurface)
 {
-  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DTexture2Impl,iface);
   TRACE("(%p)->(%p,%p)\n", This, lpD3DDevice, lpSurface);
 
   return DDERR_ALREADYINITIALIZED;
@@ -329,7 +329,7 @@
 
 HRESULT WINAPI IDirect3DTextureImpl_Unload(LPDIRECT3DTEXTURE iface)
 {
-  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DTexture2Impl,iface);
   FIXME("(%p)->(): stub\n", This);
 
   return D3D_OK;
@@ -340,9 +340,9 @@
 						  LPDIRECT3DDEVICE2 lpD3DDevice2,
 						  LPD3DTEXTUREHANDLE lpHandle)
 {
-    ICOM_THIS(IDirect3DTexture2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DTexture2Impl,iface);
     D3DTPRIVATE(This);
-    IDirect3DDevice2Impl* ilpD3DDevice2=(IDirect3DDevice2Impl*)lpD3DDevice2;
+    IDirect3DDevice2Impl* ilpD3DDevice2=ICOM_OBJECT(IDirect3DDevice2Impl,lpD3DDevice2);
     TRACE("(%p)->(%p,%p)\n", This, ilpD3DDevice2, lpHandle);
 
     /* For 32 bits OSes, handles = pointers */
@@ -361,7 +361,7 @@
     if (ilpD3DDevice2->current_texture)
       IDirect3DTexture2Impl_Release((LPDIRECT3DTEXTURE2)ilpD3DDevice2->current_texture);           
     IDirect3DTexture2Impl_AddRef(iface);
-    ilpD3DDevice2->current_texture = (IDirect3DTexture2Impl*)iface;   
+    ilpD3DDevice2->current_texture = ICOM_OBJECT(IDirect3DTexture2Impl,iface);   
 
     TRACE("OpenGL texture handle is : %d\n", dtpriv->tex_name);
 
@@ -372,7 +372,7 @@
 HRESULT WINAPI IDirect3DTexture2Impl_PaletteChanged(
     LPDIRECT3DTEXTURE2 iface, DWORD dwStart, DWORD dwCount
 ) {
-  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DTexture2Impl,iface);
   FIXME("(%p)->(%8ld,%8ld): stub\n", This, dwStart, dwCount);
 
   return D3D_OK;
@@ -383,9 +383,9 @@
 HRESULT WINAPI IDirect3DTexture2Impl_Load(
     LPDIRECT3DTEXTURE2 iface, LPDIRECT3DTEXTURE2 lpD3DTexture2
 ) {
-  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DTexture2Impl,iface);
   D3DTPRIVATE(This);
-  IDirect3DTexture2Impl* ilpD3DTexture2=(IDirect3DTexture2Impl*)lpD3DTexture2;
+  IDirect3DTexture2Impl* ilpD3DTexture2=ICOM_OBJECT(IDirect3DTexture2Impl,lpD3DTexture2);
   DDSURFACEDESC	*src_d, *dst_d;
   static void (*ptr_ColorTableEXT) (GLenum target, GLenum internalformat,
 				    GLsizei width, GLenum format, GLenum type, const GLvoid *table) = NULL;
Index: d3dviewport.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3dviewport.c,v
retrieving revision 1.9
diff -u -r1.9 d3dviewport.c
--- d3dviewport.c	29 Sep 2002 18:00:43 -0000	1.9
+++ d3dviewport.c	28 Oct 2002 21:56:49 -0000
@@ -63,7 +63,7 @@
   vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
   vp->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dv_private));
   vp->ref = 1;
-  ICOM_VTBL(vp) = &viewport2_vtable;
+  ICOM_INIT_INTERFACE(vp,IDirect3DViewport2,viewport2_vtable);
   vp->d3d.d3d2 = d3d2;
   vp->use_d3d2 = 1;
 
@@ -84,7 +84,7 @@
   vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
   vp->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dv_private));
   vp->ref = 1;
-  ICOM_VTBL(vp) = &viewport2_vtable;
+  ICOM_INIT_INTERFACE(vp,IDirect3DViewport2,viewport2_vtable);
   vp->d3d.d3d1 = d3d1;
   vp->use_d3d2 = 0;
 
@@ -106,7 +106,7 @@
 							REFIID riid,
 							LPVOID* ppvObj)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
 
   FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
 
@@ -117,7 +117,7 @@
 
 ULONG WINAPI IDirect3DViewport2Impl_AddRef(LPDIRECT3DVIEWPORT2 iface)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
 
   return ++(This->ref);
@@ -127,7 +127,7 @@
 
 ULONG WINAPI IDirect3DViewport2Impl_Release(LPDIRECT3DVIEWPORT2 iface)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
 
   if (!--(This->ref)) {
@@ -143,7 +143,7 @@
 HRESULT WINAPI IDirect3DViewport2Impl_Initialize(LPDIRECT3DVIEWPORT2 iface,
 						    LPDIRECT3D d3d)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%p): stub\n", This, d3d);
 
   return DD_OK;
@@ -152,7 +152,7 @@
 HRESULT WINAPI IDirect3DViewport2Impl_GetViewport(LPDIRECT3DVIEWPORT2 iface,
 						     LPD3DVIEWPORT lpvp)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%p): stub\n", This, lpvp);
 
   if (This->use_vp2 != 0)
@@ -166,7 +166,7 @@
 HRESULT WINAPI IDirect3DViewport2Impl_SetViewport(LPDIRECT3DVIEWPORT2 iface,
 						     LPD3DVIEWPORT lpvp)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%p): stub\n", This, lpvp);
 
   This->use_vp2 = 0;
@@ -193,7 +193,7 @@
 							   DWORD dwFlags,
 							   LPDWORD lpOffScreen)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%8ld,%p,%08lx,%p): stub\n",
 	This, dwVertexCount, lpData, dwFlags, lpOffScreen);
 
@@ -204,7 +204,7 @@
 						       DWORD dwElementCount,
 						       LPD3DLIGHTDATA lpData)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%8ld,%p): stub\n", This, dwElementCount, lpData);
 
   return DD_OK;
@@ -213,7 +213,7 @@
 HRESULT WINAPI IDirect3DViewport2Impl_SetBackground(LPDIRECT3DVIEWPORT2 iface,
 						       D3DMATERIALHANDLE hMat)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%08lx): stub\n", This, (DWORD) hMat);
 
   return DD_OK;
@@ -223,7 +223,7 @@
 						       LPD3DMATERIALHANDLE lphMat,
 						       LPBOOL lpValid)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%p,%p): stub\n", This, lphMat, lpValid);
 
   return DD_OK;
@@ -232,7 +232,7 @@
 HRESULT WINAPI IDirect3DViewport2Impl_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
 							    LPDIRECTDRAWSURFACE lpDDSurface)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%p): stub\n", This, lpDDSurface);
 
   return DD_OK;
@@ -242,7 +242,7 @@
 							    LPDIRECTDRAWSURFACE* lplpDDSurface,
 							    LPBOOL lpValid)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%p,%p): stub\n", This, lplpDDSurface, lpValid);
 
   return DD_OK;
@@ -253,7 +253,7 @@
 					       LPD3DRECT lpRects,
 					       DWORD dwFlags)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   GLboolean ztest;
   FIXME("(%p)->(%8ld,%p,%08lx): stub\n", This, dwCount, lpRects, dwFlags);
 
@@ -280,8 +280,8 @@
 HRESULT WINAPI IDirect3DViewport2Impl_AddLight(LPDIRECT3DVIEWPORT2 iface,
 						  LPDIRECT3DLIGHT lpLight)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
-  IDirect3DLightImpl* ilpLight=(IDirect3DLightImpl*)lpLight;
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
+  IDirect3DLightImpl* ilpLight=ICOM_OBJECT(IDirect3DLightImpl,lpLight);
   FIXME("(%p)->(%p): stub\n", This, ilpLight);
 
   /* Add the light in the 'linked' chain */
@@ -310,7 +310,7 @@
 HRESULT WINAPI IDirect3DViewport2Impl_DeleteLight(LPDIRECT3DVIEWPORT2 iface,
 						     LPDIRECT3DLIGHT lpLight)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   IDirect3DLightImpl** currentlplpLight;
   TRACE("(%p)->(%p): stub\n", This, lpLight);
 
@@ -331,7 +331,7 @@
 						   LPDIRECT3DLIGHT* lplpLight,
 						   DWORD dwFlags)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   FIXME("(%p)->(%p,%p,%08lx): stub\n", This, lpLight, lplpLight, dwFlags);
 
   return DD_OK;
@@ -341,7 +341,7 @@
 HRESULT WINAPI IDirect3DViewport2Impl_GetViewport2(LPDIRECT3DVIEWPORT2 iface,
 						      LPD3DVIEWPORT2 lpViewport2)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   TRACE("(%p)->(%p)\n", This, lpViewport2);
 
   if (This->use_vp2 != 1)
@@ -355,7 +355,7 @@
 HRESULT WINAPI IDirect3DViewport2Impl_SetViewport2(LPDIRECT3DVIEWPORT2 iface,
 						      LPD3DVIEWPORT2 lpViewport2)
 {
-  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DViewport2Impl,iface);
   TRACE("(%p)->(%p)\n", This, lpViewport2);
 
   TRACE("dwSize = %ld   dwX = %ld   dwY = %ld\n",
Index: ddcomimpl.h
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/ddcomimpl.h,v
retrieving revision 1.2
diff -u -r1.2 ddcomimpl.h
--- ddcomimpl.h	9 Mar 2002 23:29:35 -0000	1.2
+++ ddcomimpl.h	28 Oct 2002 21:56:49 -0000
@@ -17,37 +17,47 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#ifndef _DDCOMIMPL_H_
+#define _DDCOMIMPL_H_
+
 #include <stddef.h>
 
+#define INTERFACE(iface) \
+        struct { \
+		 iface interface; \
+		 LPVOID object; \
+	       }
+
+typedef INTERFACE(LPVOID) Interface;
+
 /* Generates the name for a vtable pointer for a given interface. */
 /* The canonical name for a single interface is "lpVtbl". */
 #define ICOM_VFIELD_MULTI_NAME2(iface) ITF_##iface
 #define ICOM_VFIELD_MULTI_NAME(iface) ICOM_VFIELD_MULTI_NAME2(iface)
 
-/* Declares a vtable pointer field in an implementation. */
 #define ICOM_VFIELD_MULTI(iface) \
-	iface ICOM_VFIELD_MULTI_NAME(iface)
-
-/* Returns the offset of a vtable pointer within an implementation object. */
-#define ICOM_VFIELD_OFFSET(impltype, iface) \
-	offsetof(impltype, ICOM_VFIELD_MULTI_NAME(iface))
+	INTERFACE(iface) ICOM_VFIELD_MULTI_NAME(iface)
 
 /* Given an interface pointer, returns the implementation pointer. */
-#define ICOM_OBJECT(impltype, ifacename, ifaceptr)		\
-	(impltype*)((ifaceptr) == NULL ? NULL			\
-		  : (char*)(ifaceptr) - ICOM_VFIELD_OFFSET(impltype,ifacename))
-
-#define ICOM_THIS_FROM(impltype, ifacename, ifaceptr) \
-	impltype* This = ICOM_OBJECT(impltype, ifacename, ifaceptr)
-
+#define ICOM_OBJECT(impltype, ifaceptr) \
+        (impltype*)(((LPVOID)ifaceptr) == NULL ? NULL \
+		    : ((Interface*)(ifaceptr))->object)
+
+#define ICOM_THIS_MULTI(impltype, ifaceptr) \
+	impltype* This = ICOM_OBJECT(impltype, ifaceptr)
+	
 /* Given an object and interface name, returns a pointer to that interface. */
 #define ICOM_INTERFACE(implobj, iface) \
-	(&((implobj)->ICOM_VFIELD_MULTI_NAME(iface)))
+	(&((implobj)->ICOM_VFIELD_MULTI_NAME(iface)).interface)
 
 #define ICOM_INIT_INTERFACE(implobj, ifacename, vtblname) \
 	do { \
-	  (implobj)->ICOM_VFIELD_MULTI_NAME(ifacename).lpVtbl = &(vtblname); \
+	  (implobj)->ICOM_VFIELD_MULTI_NAME(ifacename).interface.lpVtbl = &(vtblname); \
+          (implobj)->ICOM_VFIELD_MULTI_NAME(ifacename).object = implobj; \
 	} while (0)
 
-#define COM_INTERFACE_CAST(impltype, ifnamefrom, ifnameto, ifaceptr)	\
-	ICOM_INTERFACE(ICOM_OBJECT(impltype, ifnamefrom, ifaceptr), ifnameto)
+#define COM_INTERFACE_CAST(impltype, ifnamefrom, ifnameto, ifaceptr) \
+	ICOM_INTERFACE(ICOM_OBJECT(impltype, ifaceptr), ifnameto)
+	
+#endif /* _DDCOMIMPL_H_ */
+
Index: d3ddevice/main.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3ddevice/main.c,v
retrieving revision 1.12
diff -u -r1.12 main.c
--- d3ddevice/main.c	16 Oct 2002 18:57:52 -0000	1.12
+++ d3ddevice/main.c	28 Oct 2002 21:56:50 -0000
@@ -40,14 +40,14 @@
 HRESULT WINAPI IDirect3DDevice2Impl_QueryInterface(
     LPDIRECT3DDEVICE2 iface, REFIID riid, LPVOID* ppvObj
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
     return S_OK;
 }
 
 ULONG WINAPI IDirect3DDevice2Impl_AddRef(LPDIRECT3DDEVICE2 iface)
 {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
 
     return ++(This->ref);
@@ -57,7 +57,7 @@
 
 ULONG WINAPI IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface)
 {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--(This->ref)) {
@@ -77,7 +77,7 @@
     LPDIRECT3DDEVICE2 iface, LPD3DDEVICEDESC lpdescsoft,
     LPD3DDEVICEDESC lpdeschard
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%p,%p), stub!\n", This, lpdescsoft, lpdeschard);
     return DD_OK;
 }
@@ -87,13 +87,15 @@
 HRESULT WINAPI IDirect3DDevice2Impl_SwapTextureHandles(
     LPDIRECT3DDEVICE2 iface,LPDIRECT3DTEXTURE2 lpD3DTex1,LPDIRECT3DTEXTURE2 lpD3DTex2
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
+    IDirect3DTexture2Impl* Impl1 = ICOM_OBJECT(IDirect3DTexture2Impl,lpD3DTex1);   
+    IDirect3DTexture2Impl* Impl2 = ICOM_OBJECT(IDirect3DTexture2Impl,lpD3DTex2);   
     IDirect3DTexture2Impl tmp;
     TRACE("(%p)->(%p,%p)\n", This, lpD3DTex1, lpD3DTex2);
 
-    tmp = *(IDirect3DTexture2Impl*)lpD3DTex1;
-    *(IDirect3DTexture2Impl*)lpD3DTex1 = *(IDirect3DTexture2Impl*)lpD3DTex2;
-    *(IDirect3DTexture2Impl*)lpD3DTex2 = tmp;
+    tmp = *Impl1;
+    *Impl1 = *Impl2;
+    *Impl2 = tmp;
 
     return DD_OK;
 }
@@ -101,7 +103,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_GetStats(
     LPDIRECT3DDEVICE2 iface, LPD3DSTATS lpstats)
 {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%p): stub\n", This, lpstats);
 
     return DD_OK;
@@ -110,7 +112,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_AddViewport(
     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
     TRACE("(%p)->(%p)\n", This, ilpvp);
 
@@ -124,8 +126,8 @@
 HRESULT WINAPI IDirect3DDevice2Impl_DeleteViewport(
     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp)
 {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
-    IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
+    IDirect3DViewport2Impl* ilpvp=ICOM_OBJECT(IDirect3DViewport2Impl,lpvp);
     IDirect3DViewport2Impl *cur, *prev;
     TRACE("(%p)->(%p)\n", This, lpvp);
 
@@ -151,8 +153,8 @@
     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp,
     LPDIRECT3DVIEWPORT2* lplpvp, DWORD dwFlags
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
-    IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
+    IDirect3DViewport2Impl* ilpvp=ICOM_OBJECT(IDirect3DViewport2Impl,lpvp);
     IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp;
     TRACE("(%p)->(%p,%p,%08lx)\n", This, lpvp, lpvp, dwFlags);
 
@@ -178,7 +180,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_EnumTextureFormats(
     LPDIRECT3DDEVICE2 iface, LPD3DENUMTEXTUREFORMATSCALLBACK cb, LPVOID context
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%p,%p), stub!\n", This, cb, context);
 
     return DD_OK; /* no texture formats in stub implementation */
@@ -188,7 +190,7 @@
 
 HRESULT WINAPI IDirect3DDevice2Impl_BeginScene(LPDIRECT3DDEVICE2 iface)
 {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
 
     FIXME("(%p)->(), stub!\n", This);
 
@@ -199,7 +201,7 @@
 
 HRESULT WINAPI IDirect3DDevice2Impl_EndScene(LPDIRECT3DDEVICE2 iface)
 {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(): stub\n", This);
     return DD_OK;
 }
@@ -207,7 +209,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_GetDirect3D(
     LPDIRECT3DDEVICE2 iface, LPDIRECT3D2 *lpd3d2
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     TRACE("(%p)->(%p)\n", This, lpd3d2);
     *lpd3d2 = (LPDIRECT3D2)This->d3d;
     return DD_OK;
@@ -217,8 +219,8 @@
 HRESULT WINAPI IDirect3DDevice2Impl_SetCurrentViewport(
     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
-    IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
+    IDirect3DViewport2Impl* ilpvp=ICOM_OBJECT(IDirect3DViewport2Impl,lpvp);
     TRACE("(%p)->(%p)\n", This, ilpvp);
 
     /* Should check if the viewport was added or not */
@@ -238,7 +240,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_GetCurrentViewport(
     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 *lplpvp
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%p): stub\n", This, lplpvp);
 
     /* Returns the current viewport */
@@ -250,7 +252,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_SetRenderTarget(
     LPDIRECT3DDEVICE2 iface, LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%p,%08lx): stub\n", This, lpdds, dwFlags);
 
     return DD_OK;
@@ -259,7 +261,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_GetRenderTarget(
     LPDIRECT3DDEVICE2 iface, LPDIRECTDRAWSURFACE *lplpdds
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     TRACE("(%p)->(%p)\n", This, lplpdds);
 
     /* Returns the current rendering target (the surface on wich we render) */
@@ -272,7 +274,7 @@
     LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv,
     DWORD dwFlags
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d,%d,%08lx): stub\n", This, d3dp, d3dv, dwFlags);
 
     return DD_OK;
@@ -282,7 +284,7 @@
     LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv,
     LPVOID lpvert, DWORD numvert, DWORD dwFlags
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvert, numvert, dwFlags);
 
     return DD_OK;
@@ -291,14 +293,14 @@
 HRESULT WINAPI IDirect3DDevice2Impl_Vertex(
     LPDIRECT3DDEVICE2 iface,LPVOID lpvert
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%p): stub\n", This, lpvert);
 
     return DD_OK;
 }
 
 HRESULT WINAPI IDirect3DDevice2Impl_Index(LPDIRECT3DDEVICE2 iface, WORD index) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d): stub\n", This, index);
 
     return DD_OK;
@@ -307,7 +309,7 @@
 
 
 HRESULT WINAPI IDirect3DDevice2Impl_End(LPDIRECT3DDEVICE2 iface,DWORD dwFlags) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%08lx): stub\n", This, dwFlags);
 
     return DD_OK;
@@ -316,7 +318,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_GetRenderState(
     LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE d3drs, LPDWORD lprstate
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d,%p): stub\n", This, d3drs, lprstate);
 
     return DD_OK;
@@ -326,7 +328,7 @@
     LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE dwRenderStateType,
     DWORD dwRenderState
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
 
     FIXME("(%p)->(%d,%ld)\n", This, dwRenderStateType, dwRenderState);
 
@@ -336,7 +338,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_GetLightState(
     LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE d3dls, LPDWORD lplstate
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d,%p): stub\n", This, d3dls, lplstate);
 
     return DD_OK;
@@ -348,7 +350,7 @@
     LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE dwLightStateType,
     DWORD dwLightState
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d,%08lx): stub\n", This, dwLightStateType, dwLightState);
     return DD_OK;
 }
@@ -356,7 +358,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_SetTransform(
     LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d,%p),stub!\n",This,d3dts,lpmatrix);
     return DD_OK;
 }
@@ -366,7 +368,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_GetTransform(
     LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix);
 
     return DD_OK;
@@ -377,7 +379,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_MultiplyTransform(
     LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix);
 
     return DD_OK;
@@ -387,7 +389,7 @@
     LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv,
     LPVOID lpvertex, DWORD vertcount, DWORD dwFlags
 ) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
 
   FIXME("(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, dwFlags);
 
@@ -399,7 +401,7 @@
     LPVOID lpvertex, DWORD vertcount, LPWORD lpindexes, DWORD indexcount,
     DWORD dwFlags
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%d,%d,%p,%ld,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, lpindexes, indexcount, dwFlags);
     return D3D_OK;
 }
@@ -407,7 +409,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_SetClipStatus(
     LPDIRECT3DDEVICE2 iface, LPD3DCLIPSTATUS lpcs
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%p): stub\n", This, lpcs);
 
     return DD_OK;
@@ -416,7 +418,7 @@
 HRESULT WINAPI IDirect3DDevice2Impl_GetClipStatus(
     LPDIRECT3DDEVICE2 iface, LPD3DCLIPSTATUS lpcs
 ) {
-    ICOM_THIS(IDirect3DDevice2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
     FIXME("(%p)->(%p): stub\n", This, lpcs);
 
     return DD_OK;
@@ -428,14 +430,14 @@
 HRESULT WINAPI IDirect3DDeviceImpl_QueryInterface(
     LPDIRECT3DDEVICE iface, REFIID riid, LPVOID* ppvObj
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
     return S_OK;
 }
 
 ULONG WINAPI IDirect3DDeviceImpl_AddRef(LPDIRECT3DDEVICE iface)
 {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
 
     return ++(This->ref);
@@ -443,7 +445,7 @@
 
 ULONG WINAPI IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface)
 {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--(This->ref)) {
@@ -461,7 +463,7 @@
     LPDIRECT3DDEVICE iface, LPDIRECT3D lpd3d, LPGUID lpGUID,
     LPD3DDEVICEDESC lpd3ddvdesc
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(%p,%p,%p): stub\n", This, lpd3d,lpGUID, lpd3ddvdesc);
 
     return DDERR_ALREADYINITIALIZED;
@@ -472,7 +474,7 @@
     LPDIRECT3DDEVICE iface, LPD3DDEVICEDESC lpD3DHWDevDesc,
     LPD3DDEVICEDESC lpD3DSWDevDesc
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpD3DHWDevDesc, lpD3DSWDevDesc);
 
     return DD_OK;
@@ -483,14 +485,16 @@
     LPDIRECT3DDEVICE iface, LPDIRECT3DTEXTURE lpD3DTex1,
     LPDIRECT3DTEXTURE lpD3DTex2
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
+    IDirect3DTexture2Impl* Impl1 = ICOM_OBJECT(IDirect3DTexture2Impl,lpD3DTex1);   
+    IDirect3DTexture2Impl* Impl2 = ICOM_OBJECT(IDirect3DTexture2Impl,lpD3DTex2);   
     IDirect3DTexture2Impl tmp;
     TRACE("(%p)->(%p,%p)\n", This, lpD3DTex1, lpD3DTex2);
 
-    tmp = *(IDirect3DTexture2Impl*)lpD3DTex1;
-    *(IDirect3DTexture2Impl*)lpD3DTex1 = *(IDirect3DTexture2Impl*)lpD3DTex2;
-    *(IDirect3DTexture2Impl*)lpD3DTex2 = tmp;
-
+    tmp = *Impl1;
+    *Impl1 = *Impl2;
+    *Impl2 = tmp;
+    
     return DD_OK;
 }
 
@@ -498,7 +502,7 @@
     LPDIRECT3DDEVICE iface, LPD3DEXECUTEBUFFERDESC lpDesc,
     LPDIRECT3DEXECUTEBUFFER *lplpDirect3DExecuteBuffer, IUnknown *pUnkOuter
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(%p,%p,%p): stub\n", This, lpDesc, lplpDirect3DExecuteBuffer, pUnkOuter);
     return DD_OK;
 }
@@ -506,7 +510,7 @@
 HRESULT WINAPI IDirect3DDeviceImpl_GetStats(
     LPDIRECT3DDEVICE iface, LPD3DSTATS lpD3DStats
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(%p): stub\n", This, lpD3DStats);
 
     return DD_OK;
@@ -517,7 +521,7 @@
     LPDIRECT3DDEVICE iface, LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
     LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     TRACE("(%p)->(%p,%p,%08ld)\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags);
 
     /* Put this as the default context */
@@ -531,8 +535,8 @@
 HRESULT WINAPI IDirect3DDeviceImpl_AddViewport(
     LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
-    IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
+    IDirect3DViewport2Impl* ilpvp=ICOM_OBJECT(IDirect3DViewport2Impl,lpvp);
     TRACE("(%p)->(%p)\n", This, ilpvp);
 
     /* Adds this viewport to the viewport list */
@@ -547,8 +551,8 @@
 HRESULT WINAPI IDirect3DDeviceImpl_DeleteViewport(
     LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
-    IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
+    IDirect3DViewport2Impl* ilpvp=ICOM_OBJECT(IDirect3DViewport2Impl,lpvp);
     IDirect3DViewport2Impl *cur, *prev;
     TRACE("(%p)->(%p)\n", This, lpvp);
 
@@ -574,8 +578,8 @@
     LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp,
     LPDIRECT3DVIEWPORT* lplpvp, DWORD dwFlags
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
-    IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
+    IDirect3DViewport2Impl* ilpvp=ICOM_OBJECT(IDirect3DViewport2Impl,lpvp);
     IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp;
     TRACE("(%p)->(%p,%p,%08lx)\n", This, ilpvp, ilplpvp, dwFlags);
 
@@ -602,7 +606,7 @@
     LPDIRECT3DDEVICE iface, LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
     LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags, LPD3DRECT lpRect
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     TRACE("(%p)->(%p,%p,%08lx,%p): stub\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags, lpRect);
     return DD_OK;
 }
@@ -610,7 +614,7 @@
 HRESULT WINAPI IDirect3DDeviceImpl_GetPickRecords(
     LPDIRECT3DDEVICE iface, LPDWORD lpCount, LPD3DPICKRECORD lpD3DPickRec
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpCount, lpD3DPickRec);
 
     return DD_OK;
@@ -621,7 +625,7 @@
     LPDIRECT3DDEVICE iface,LPD3DENUMTEXTUREFORMATSCALLBACK lpd3dEnumTextureProc,
     LPVOID lpArg
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpd3dEnumTextureProc, lpArg);
     return D3D_OK;
 }
@@ -631,7 +635,7 @@
     LPDIRECT3DDEVICE iface, LPD3DMATRIXHANDLE lpD3DMatHandle
 )
 {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     TRACE("(%p)->(%p)\n", This, lpD3DMatHandle);
 
     *lpD3DMatHandle = (D3DMATRIXHANDLE) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(D3DMATRIX));
@@ -644,7 +648,7 @@
     LPDIRECT3DDEVICE iface, D3DMATRIXHANDLE d3dMatHandle,
     const LPD3DMATRIX lpD3DMatrix)
 {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     TRACE("(%p)->(%08lx,%p)\n", This, d3dMatHandle, lpD3DMatrix);
 
     dump_mat(lpD3DMatrix);
@@ -656,7 +660,7 @@
 HRESULT WINAPI IDirect3DDeviceImpl_GetMatrix(
     LPDIRECT3DDEVICE iface,D3DMATRIXHANDLE D3DMatHandle,LPD3DMATRIX lpD3DMatrix
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     TRACE("(%p)->(%08lx,%p)\n", This, D3DMatHandle, lpD3DMatrix);
 
     *lpD3DMatrix = *((D3DMATRIX *) D3DMatHandle);
@@ -668,7 +672,7 @@
 HRESULT WINAPI IDirect3DDeviceImpl_DeleteMatrix(
     LPDIRECT3DDEVICE iface, D3DMATRIXHANDLE d3dMatHandle
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     TRACE("(%p)->(%08lx)\n", This, d3dMatHandle);
     HeapFree(GetProcessHeap(),0, (void *) d3dMatHandle);
     return DD_OK;
@@ -677,7 +681,7 @@
 
 HRESULT WINAPI IDirect3DDeviceImpl_BeginScene(LPDIRECT3DDEVICE iface)
 {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(): stub\n", This);
     return DD_OK;
 }
@@ -686,7 +690,7 @@
    Will make a common function ... */
 HRESULT WINAPI IDirect3DDeviceImpl_EndScene(LPDIRECT3DDEVICE iface)
 {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(): stub\n", This);
     return DD_OK;
 }
@@ -694,7 +698,7 @@
 HRESULT WINAPI IDirect3DDeviceImpl_GetDirect3D(
     LPDIRECT3DDEVICE iface, LPDIRECT3D *lpDirect3D
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     FIXME("(%p)->(%p): stub\n", This, lpDirect3D);
 
     return DD_OK;
Index: d3ddevice/mesa.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3ddevice/mesa.c,v
retrieving revision 1.22
diff -u -r1.22 mesa.c
--- d3ddevice/mesa.c	18 Oct 2002 23:48:59 -0000	1.22
+++ d3ddevice/mesa.c	28 Oct 2002 21:56:53 -0000
@@ -232,7 +232,7 @@
     (*device)->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dd_private));
     odev = (mesa_d3dd_private*)(*device)->private;
     (*device)->ref = 1;
-    ICOM_VTBL(*device) = &OpenGL_vtable;
+    ICOM_INIT_INTERFACE(*device,IDirect3DDevice2,OpenGL_vtable);
     (*device)->d3d = d3d;
     (*device)->surface = surface;
     (*device)->viewport_list = NULL;
@@ -317,7 +317,7 @@
  */
 static ULONG WINAPI MESA_IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface)
 {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
   TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
   if (!--(This->ref)) {
@@ -338,7 +338,7 @@
     LPDIRECT3DDEVICE2 iface, LPD3DDEVICEDESC lpdescsoft,
     LPD3DDEVICEDESC lpdeschard
 ) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
   FIXME("(%p)->(%p,%p): stub\n", This, lpdescsoft, lpdeschard);
   fill_opengl_caps(lpdescsoft, lpdeschard);
   return DD_OK;
@@ -449,7 +449,7 @@
 static HRESULT WINAPI MESA_IDirect3DDevice2Impl_EnumTextureFormats(
     LPDIRECT3DDEVICE2 iface, LPD3DENUMTEXTUREFORMATSCALLBACK cb, LPVOID context
 ) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
   FIXME("(%p)->(%p,%p): stub\n", This, cb, context);
 
   return enum_texture_format_OpenGL(cb, context);
@@ -458,7 +458,7 @@
 static HRESULT WINAPI MESA_IDirect3DDevice2Impl_BeginScene(
     LPDIRECT3DDEVICE2 iface
 ) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
 
   FIXME("(%p)->(): stub\n", This);
 
@@ -469,7 +469,7 @@
 }
 
 HRESULT WINAPI MESA_IDirect3DDevice2Impl_EndScene(LPDIRECT3DDEVICE2 iface) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
 
   FIXME("(%p)->(): stub\n", This);
 
@@ -482,7 +482,7 @@
     LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE dwRenderStateType,
     DWORD dwRenderState
 ) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
   D3DDPRIVATE(This);
 
   TRACE("(%p)->(%d,%ld)\n", This, dwRenderStateType, dwRenderState);
@@ -497,12 +497,12 @@
     LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE dwLightStateType,
     DWORD dwLightState
 ) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
   FIXME("(%p)->(%d,%08lx): stub\n", This, dwLightStateType, dwLightState);
 
   switch (dwLightStateType) {
   case D3DLIGHTSTATE_MATERIAL: {  /* 1 */
-    IDirect3DMaterial2Impl* mat = (IDirect3DMaterial2Impl*) dwLightState;
+    IDirect3DMaterial2Impl* mat = ICOM_OBJECT(IDirect3DMaterial2Impl,dwLightState);
 
     if (mat != NULL) {
       ENTER_GL();
@@ -544,7 +544,7 @@
     LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts,
     LPD3DMATRIX lpmatrix
 ) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
   D3DDPRIVATE(This);
 
   FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix);
@@ -775,7 +775,7 @@
     LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv,
     LPVOID lpvertex, DWORD vertcount, DWORD dwFlags
 ) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
   D3DDPRIVATE(This);
   int vx_index;
 
@@ -793,7 +793,7 @@
     LPVOID lpvertex, DWORD vertcount, LPWORD lpindexes, DWORD indexcount,
     DWORD dwFlags
 ) {
-  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  ICOM_THIS_MULTI(IDirect3DDevice2Impl,iface);
   D3DDPRIVATE(This);
   int vx_index;
 
@@ -810,7 +810,7 @@
     LPDIRECT3DDEVICE iface, LPD3DEXECUTEBUFFERDESC lpDesc,
     LPDIRECT3DEXECUTEBUFFER *lplpDirect3DExecuteBuffer, IUnknown *pUnkOuter
 ) {
-    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
     TRACE("(%p)->(%p,%p,%p)\n", This, lpDesc, lplpDirect3DExecuteBuffer, pUnkOuter);
     *lplpDirect3DExecuteBuffer = d3dexecutebuffer_create(This, lpDesc);
     return DD_OK;
@@ -898,7 +898,7 @@
     (*device)->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dd_private));
     odev = (mesa_d3dd_private*)(*device)->private;
     (*device)->ref = 1;
-    ICOM_VTBL(*device) = &OpenGL_vtable_dx3;
+    ICOM_INIT_INTERFACE(*device,IDirect3DDevice,OpenGL_vtable_dx3);
     (*device)->d3d = NULL;
     (*device)->surface = surface;
 
@@ -961,7 +961,7 @@
     glClearColor(0.0, 0.0, 0.0, 0.0);
     glColor3f(1.0, 1.0, 1.0);
     LEAVE_GL();
-    fill_device_capabilities((IDirectDrawImpl *) surface->ddraw_owner);
+    fill_device_capabilities(ICOM_OBJECT(IDirectDrawImpl,surface->ddraw_owner));
 
     return 1;
   }
@@ -972,7 +972,7 @@
 
 static ULONG WINAPI MESA_IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface)
 {
-  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
   TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
   if (!--(This->ref)) {
@@ -991,7 +991,7 @@
     LPDIRECT3DDEVICE iface,LPD3DENUMTEXTUREFORMATSCALLBACK lpd3dEnumTextureProc,
     LPVOID lpArg)
 {
-  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
   TRACE("(%p)->(%p,%p): stub\n", This, lpd3dEnumTextureProc, lpArg);
 
   return enum_texture_format_OpenGL(lpd3dEnumTextureProc, lpArg);
@@ -1000,7 +1000,7 @@
 
 static HRESULT WINAPI MESA_IDirect3DDeviceImpl_BeginScene(LPDIRECT3DDEVICE iface)
 {
-  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
   /* OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) This; */
 
   FIXME("(%p)->(): stub\n", This);
@@ -1016,7 +1016,7 @@
    Will make a common function ... */
 static HRESULT WINAPI MESA_IDirect3DDeviceImpl_EndScene(LPDIRECT3DDEVICE iface)
 {
-  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  ICOM_THIS_MULTI(IDirect3DDeviceImpl,iface);
 
   FIXME("(%p)->(): stub\n", This);
 
Index: dclipper/main.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/dclipper/main.c,v
retrieving revision 1.8
diff -u -r1.8 main.c
--- dclipper/main.c	31 May 2002 23:25:45 -0000	1.8
+++ dclipper/main.c	28 Oct 2002 21:56:53 -0000
@@ -82,7 +82,7 @@
 HRESULT WINAPI Main_DirectDrawClipper_SetHwnd(
     LPDIRECTDRAWCLIPPER iface, DWORD dwFlags, HWND hWnd
 ) {
-    ICOM_THIS(IDirectDrawClipperImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawClipperImpl,iface);
 
     TRACE("(%p)->SetHwnd(0x%08lx,0x%08lx)\n",This,dwFlags,(DWORD)hWnd);
     if( dwFlags ) {
@@ -109,7 +109,7 @@
 }
 
 ULONG WINAPI Main_DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER iface) {
-    ICOM_THIS(IDirectDrawClipperImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawClipperImpl,iface);
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (--This->ref == 0)
@@ -123,7 +123,7 @@
 HRESULT WINAPI Main_DirectDrawClipper_GetClipList(
     LPDIRECTDRAWCLIPPER iface,LPRECT prcClip,LPRGNDATA lprgn,LPDWORD pdwSize
 ) {
-    ICOM_THIS(IDirectDrawClipperImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawClipperImpl,iface);
     static int warned = 0;
     if (warned++ < 10)
 	FIXME("(%p,%p,%p,%p),stub!\n",This,prcClip,lprgn,pdwSize);
@@ -134,7 +134,7 @@
 HRESULT WINAPI Main_DirectDrawClipper_SetClipList(
     LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,DWORD pdwSize
 ) {
-    ICOM_THIS(IDirectDrawClipperImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawClipperImpl,iface);
     FIXME("(%p,%p,%ld),stub!\n",This,lprgn,pdwSize);
     return DD_OK;
 }
@@ -142,7 +142,7 @@
 HRESULT WINAPI Main_DirectDrawClipper_QueryInterface(
     LPDIRECTDRAWCLIPPER iface, REFIID riid, LPVOID* ppvObj
 ) {
-    ICOM_THIS(IDirectDrawClipperImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawClipperImpl,iface);
 
     if (IsEqualGUID(&IID_IUnknown, riid)
 	|| IsEqualGUID(&IID_IDirectDrawClipper, riid))
@@ -159,7 +159,7 @@
 
 ULONG WINAPI Main_DirectDrawClipper_AddRef( LPDIRECTDRAWCLIPPER iface )
 {
-    ICOM_THIS(IDirectDrawClipperImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawClipperImpl,iface);
     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
     return ++This->ref;
 }
@@ -167,7 +167,7 @@
 HRESULT WINAPI Main_DirectDrawClipper_GetHWnd(
     LPDIRECTDRAWCLIPPER iface, HWND* hWndPtr
 ) {
-    ICOM_THIS(IDirectDrawClipperImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawClipperImpl,iface);
     FIXME("(%p)->(%p),stub!\n",This,hWndPtr);
 
     *hWndPtr = This->hWnd;
@@ -179,12 +179,12 @@
      LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags
 ) {
     IDirectDrawImpl* pOwner;
-    ICOM_THIS(IDirectDrawClipperImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawClipperImpl,iface);
     FIXME("(%p)->(%p,0x%08lx),stub!\n",This,lpDD,dwFlags);
 
     if (This->ddraw_owner != NULL) return DDERR_ALREADYINITIALIZED;
 
-    pOwner = ICOM_OBJECT(IDirectDrawImpl, IDirectDraw, lpDD);
+    pOwner = ICOM_OBJECT(IDirectDrawImpl, lpDD);
     This->ddraw_owner = pOwner;
     Main_DirectDraw_AddClipper(pOwner, This);
 
@@ -194,7 +194,7 @@
 HRESULT WINAPI Main_DirectDrawClipper_IsClipListChanged(
     LPDIRECTDRAWCLIPPER iface, BOOL* lpbChanged
 ) {
-    ICOM_THIS(IDirectDrawClipperImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawClipperImpl,iface);
     FIXME("(%p)->(%p),stub!\n",This,lpbChanged);
 
     /* XXX What is safest? */
Index: ddraw/hal.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/ddraw/hal.c,v
retrieving revision 1.7
diff -u -r1.7 hal.c
--- ddraw/hal.c	6 Aug 2002 23:49:46 -0000	1.7
+++ ddraw/hal.c	28 Oct 2002 21:56:54 -0000
@@ -480,7 +480,7 @@
 HRESULT WINAPI
 HAL_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface)
 {
-    ICOM_THIS(IDirectDrawImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl, iface);
     HRESULT hr;
 
     TRACE("(%p)\n", iface);
@@ -501,7 +501,7 @@
 			      DWORD dwHeight, DWORD dwBPP,
 			      DWORD dwRefreshRate, DWORD dwFlags)
 {
-    ICOM_THIS(IDirectDrawImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl, iface);
 
     HRESULT hr;
 
@@ -523,7 +523,7 @@
 			       LPDWORD pCodes)
 {
     int i;
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     if (*pNumCodes)
 	*pNumCodes=dd_gbl.dwNumFourCC;
     if (pCodes && dd_gbl.dwNumFourCC)
Index: ddraw/main.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/ddraw/main.c,v
retrieving revision 1.25
diff -u -r1.25 main.c
--- ddraw/main.c	18 Oct 2002 23:48:59 -0000	1.25
+++ ddraw/main.c	28 Oct 2002 21:56:56 -0000
@@ -110,7 +110,7 @@
 /* There is no Main_DirectDraw_Create. */
 
 ULONG WINAPI Main_DirectDraw_AddRef(LPDIRECTDRAW7 iface) {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
 
     return ++This->ref;
@@ -118,7 +118,7 @@
 
 ULONG WINAPI Main_DirectDraw_Release(LPDIRECTDRAW7 iface) {
     ULONG ref;
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     ref = --This->ref;
@@ -143,7 +143,7 @@
 HRESULT WINAPI Main_DirectDraw_QueryInterface(
     LPDIRECTDRAW7 iface,REFIID refiid,LPVOID *obj
 ) {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(refiid), obj);
 
     if ( IsEqualGUID( &IID_IUnknown, refiid )
@@ -200,7 +200,7 @@
 					     LPDIRECTDRAWCLIPPER *ppClipper,
 					     IUnknown *pUnkOuter)
 {
-    ICOM_THIS(IDirectDrawImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl, iface);
     HRESULT hr;
 
     TRACE("(%p)->(0x%lx, %p, %p)\n", iface, dwFlags, ppClipper, pUnkOuter);
@@ -227,7 +227,7 @@
 			      LPDIRECTDRAWPALETTE* ppPalette,
 			      LPUNKNOWN pUnknown)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     LPDIRECTDRAWPALETTE pPalette;
     HRESULT hr;
 
@@ -414,8 +414,7 @@
 	ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_VISIBLE | DDSCAPS_PRIMARYSURFACE
 				 | DDSCAPS_BACKBUFFER);
 
-	primary = ICOM_OBJECT(IDirectDrawSurfaceImpl,IDirectDrawSurface7,
-			      *ppSurf);
+	primary = ICOM_OBJECT(IDirectDrawSurfaceImpl, *ppSurf);
 	pPrev = *ppSurf;
 	IDirectDrawSurface7_AddRef(pPrev);
 
@@ -490,7 +489,7 @@
 			      IUnknown *pUnkOuter)
 {
     HRESULT hr;
-    ICOM_THIS(IDirectDrawImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl, iface);
 
     TRACE("(%p)->(%p,%p,%p)\n",This,pDDSD,ppSurf,pUnkOuter);
     if (TRACE_ON(ddraw)) {
@@ -558,10 +557,9 @@
 Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface, LPDIRECTDRAWSURFACE7 src,
 				 LPDIRECTDRAWSURFACE7* dst)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
 
-    IDirectDrawSurfaceImpl *pSrc = ICOM_OBJECT(IDirectDrawSurfaceImpl,
-					       IDirectDrawSurface7, src);
+    IDirectDrawSurfaceImpl *pSrc = ICOM_OBJECT(IDirectDrawSurfaceImpl, src);
 
     TRACE("(%p)->(%p,%p)\n",This,src,dst);
 
@@ -745,7 +743,7 @@
 			     LPDDSURFACEDESC2 lpDDSD2, LPVOID context,
 			     LPDDENUMSURFACESCALLBACK7 callback)
 {
-    ICOM_THIS(IDirectDrawImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl, iface);
     TRACE("(%p)->(0x%lx, %p, %p, %p)\n", iface, dwFlags, lpDDSD2, context,
 	  callback);
 
@@ -774,7 +772,7 @@
 HRESULT WINAPI
 Main_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface,DWORD a,DWORD* b)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     FIXME("(%p)->() stub\n", This);
 
     return DD_OK;
@@ -783,7 +781,7 @@
 HRESULT WINAPI
 Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p)->()\n",This);
     return DD_OK;
 }
@@ -792,7 +790,7 @@
 Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
 			LPDDCAPS pHELCaps)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p,%p,%p), stub\n",This,pDriverCaps,pHELCaps);
     if (pDriverCaps != NULL) {
 	DD_STRUCT_COPY_BYSIZE(pDriverCaps,&This->caps);
@@ -819,7 +817,7 @@
 Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes,
 			       LPDWORD pCodes)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     if (*pNumCodes) {
 	    *pNumCodes=0;
     }
@@ -831,7 +829,7 @@
 Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface,
 			      LPDIRECTDRAWSURFACE7 *lplpGDIDDSSurface)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p)->(%p)\n", This, lplpGDIDDSSurface);
     TRACE("returning primary (%p)\n", This->primary_surface);
     *lplpGDIDDSSurface = ICOM_INTERFACE(This->primary_surface, IDirectDrawSurface7);
@@ -843,7 +841,7 @@
 HRESULT WINAPI
 Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     FIXME("(%p)->(%p) returns 60 Hz always\n",This,freq);
     *freq = 60*100; /* 60 Hz */
     return DD_OK;
@@ -852,7 +850,7 @@
 HRESULT WINAPI
 Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     FIXME("(%p)->(%p)\n", This, lpdwScanLine);
 
     *lpdwScanLine = 1;
@@ -864,7 +862,7 @@
 Main_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface, HDC hdc,
 				 LPDIRECTDRAWSURFACE7 *lpDDS)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     FIXME("(%p)->(%08ld,%p)\n", This, (DWORD) hdc, lpDDS);
 
     return DD_OK;
@@ -873,7 +871,7 @@
 HRESULT WINAPI
 Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL status)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p)->(%p)\n",This,status);
     *status = TRUE;
     return DD_OK;
@@ -892,7 +890,7 @@
 HRESULT WINAPI
 Main_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     IDirectDrawSurfaceImpl* surf;
 
     TRACE("(%p)->()\n", This);
@@ -918,7 +916,7 @@
 Main_DirectDraw_SetCooperativeLevel(LPDIRECTDRAW7 iface, HWND hwnd,
 				    DWORD cooplevel)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
 
     FIXME("(%p)->(%08lx,%08lx)\n",This,(DWORD)hwnd,cooplevel);
     DDRAW_dump_cooperativelevel(cooplevel);
@@ -980,7 +978,7 @@
     short screenX;
     short screenY;
 
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
 
     TRACE("(%p)->SetDisplayMode(%ld,%ld)\n",This,dwWidth,dwHeight);
 
@@ -1013,7 +1011,7 @@
 HRESULT WINAPI
 Main_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
 
     TRACE("(%p)\n",This);
     if (!(This->cooperative_level & DDSCL_EXCLUSIVE))
@@ -1038,7 +1036,7 @@
 Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags,
 				     HANDLE h)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     FIXME("(%p)->(flags=0x%08lx,handle=%p)\n",This,dwFlags,h);
     return DD_OK;
 }
@@ -1046,7 +1044,7 @@
 HRESULT WINAPI
 Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p)->GetDisplayMode(%p)\n",This,pDDSD);
 
     pDDSD->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_PIXELFORMAT|DDSD_REFRESHRATE;
@@ -1064,7 +1062,7 @@
 Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps,
 				   LPDWORD total, LPDWORD free)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p)->(%p,%p,%p)\n", This,ddscaps,total,free);
 
     /* We have 16 MB videomemory */
@@ -1074,7 +1072,7 @@
 }
 
 HRESULT WINAPI Main_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface) {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     TRACE("(%p)->(): stub\n", This);
 
     return DD_OK;
@@ -1084,7 +1082,7 @@
 Main_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface, LPSIZE pModes,
 			      DWORD dwNumModes, DWORD dwFlags)
 {
-    ICOM_THIS(IDirectDrawImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl,iface);
     FIXME("(%p)->() stub\n", This);
 
     return DD_OK;
@@ -1274,7 +1272,7 @@
 Uninit_DirectDraw_Initialize(LPDIRECTDRAW7 iface, LPGUID pDeviceGuid)
 {
     const ddraw_driver* driver;
-    ICOM_THIS(IDirectDrawImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl, iface);
 
     TRACE("(%p)->(%p)\n", iface, pDeviceGuid);
 
Index: ddraw/user.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/ddraw/user.c,v
retrieving revision 1.11
diff -u -r1.11 user.c
--- ddraw/user.c	19 Oct 2002 17:16:00 -0000	1.11
+++ ddraw/user.c	28 Oct 2002 21:56:57 -0000
@@ -489,7 +489,7 @@
 #undef FX_CAPS
 #undef ROPS
 
-    ICOM_THIS(IDirectDrawImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl, iface);
 
     TRACE("(%p)->(%p,%p)\n",This,pDriverCaps,pHELCaps);
 
@@ -530,7 +530,7 @@
 			       DWORD dwHeight, DWORD dwBPP,
 			       DWORD dwRefreshRate, DWORD dwFlags)
 {
-    ICOM_THIS(IDirectDrawImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawImpl, iface);
 
     const DDPIXELFORMAT* pixelformat;
     LONG pitch;
Index: direct3d/main.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/direct3d/main.c,v
retrieving revision 1.8
diff -u -r1.8 main.c
--- direct3d/main.c	17 Aug 2002 00:43:16 -0000	1.8
+++ direct3d/main.c	28 Oct 2002 21:56:58 -0000
@@ -44,7 +44,7 @@
 HRESULT WINAPI IDirect3DImpl_QueryInterface(
     LPDIRECT3D iface,REFIID refiid,LPVOID *obj
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     /* FIXME: Not sure if this is correct */
 
     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
@@ -71,7 +71,7 @@
 	d3d->ref = 1;
 	d3d->ddraw = This->ddraw;
 	IDirect3D_AddRef(iface);
-	ICOM_VTBL(d3d) = &d3d2vt;
+	ICOM_INIT_INTERFACE(d3d,IDirect3D2,d3d2vt);
 	*obj = d3d;
 	TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
 	return S_OK;
@@ -81,7 +81,7 @@
 }
 
 ULONG WINAPI IDirect3DImpl_AddRef(LPDIRECT3D iface) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
 
     return ++(This->ref);
@@ -89,7 +89,7 @@
 
 ULONG WINAPI IDirect3DImpl_Release(LPDIRECT3D iface)
 {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--(This->ref)) {
@@ -101,7 +101,7 @@
 }
 
 HRESULT WINAPI IDirect3DImpl_Initialize(LPDIRECT3D iface,REFIID refiid) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     /* FIXME: Not sure if this is correct */
     FIXME("(%p)->(%s):stub.\n",This,debugstr_guid(refiid));
     return DDERR_ALREADYINITIALIZED;
@@ -110,7 +110,7 @@
 HRESULT WINAPI IDirect3DImpl_EnumDevices(
     LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
     return DD_OK;
 }
@@ -118,7 +118,7 @@
 HRESULT WINAPI IDirect3DImpl_CreateLight(
     LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
     return E_FAIL;
 }
@@ -126,7 +126,7 @@
 HRESULT WINAPI IDirect3DImpl_CreateMaterial(
     LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
     return E_FAIL;
 }
@@ -134,7 +134,7 @@
 HRESULT WINAPI IDirect3DImpl_CreateViewport(
     LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
 
     return E_FAIL;
@@ -144,7 +144,7 @@
     LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
     LPD3DFINDDEVICERESULT lpfinddevrst)
 {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
     return DD_OK;
 }
@@ -170,7 +170,7 @@
  */
 HRESULT WINAPI IDirect3D2Impl_QueryInterface(
     LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
 
     /* FIXME: Not sure if this is correct */
 
@@ -201,7 +201,7 @@
 	d3d->ref = 1;
 	d3d->ddraw = This->ddraw;
 	IDirect3D2_AddRef(iface);
-	ICOM_VTBL(d3d) = &d3dvt;
+	ICOM_INIT_INTERFACE(d3d,IDirect3D,d3dvt);
 	*obj = d3d;
 	TRACE("  Creating IDirect3D interface (%p)\n", *obj);
 	return S_OK;
@@ -211,14 +211,14 @@
 }
 
 ULONG WINAPI IDirect3D2Impl_AddRef(LPDIRECT3D2 iface) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
 
     return ++(This->ref);
 }
 
 ULONG WINAPI IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--(This->ref)) {
@@ -232,7 +232,7 @@
 HRESULT WINAPI IDirect3D2Impl_EnumDevices(
     LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
 ) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
     return DD_OK;
 }
@@ -240,7 +240,7 @@
 HRESULT WINAPI IDirect3D2Impl_CreateLight(
     LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
     return E_FAIL;
 }
@@ -248,7 +248,7 @@
 HRESULT WINAPI IDirect3D2Impl_CreateMaterial(
     LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
     return E_FAIL;
 }
@@ -256,7 +256,7 @@
 HRESULT WINAPI IDirect3D2Impl_CreateViewport(
     LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
     return E_FAIL;
 }
@@ -265,7 +265,7 @@
     LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
     LPD3DFINDDEVICERESULT lpfinddevrst)
 {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
     return DD_OK;
 }
@@ -274,7 +274,7 @@
     LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
     LPDIRECT3DDEVICE2 *device)
 {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
     return DDERR_INVALIDPARAMS;
 }
Index: direct3d/mesa.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/direct3d/mesa.c,v
retrieving revision 1.12
diff -u -r1.12 mesa.c
--- direct3d/mesa.c	17 Aug 2002 00:43:16 -0000	1.12
+++ direct3d/mesa.c	28 Oct 2002 21:56:59 -0000
@@ -44,7 +44,7 @@
 static HRESULT WINAPI MESA_IDirect3DImpl_QueryInterface(
     LPDIRECT3D iface,REFIID refiid,LPVOID *obj
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     /* FIXME: Not sure if this is correct */
 
     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
@@ -71,7 +71,7 @@
 	d3d->ref = 1;
 	d3d->ddraw = This->ddraw;
 	IDirect3D_AddRef(iface);
-	ICOM_VTBL(d3d) = &mesa_d3d2vt;
+	ICOM_INIT_INTERFACE(d3d,IDirect3D2,mesa_d3d2vt);
 	*obj = d3d;
 	TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
 	return S_OK;
@@ -82,7 +82,7 @@
 
 static ULONG WINAPI MESA_IDirect3DImpl_Release(LPDIRECT3D iface)
 {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--(This->ref)) {
@@ -96,7 +96,7 @@
 static HRESULT WINAPI MESA_IDirect3DImpl_EnumDevices(
     LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
 
     /* Call functions defined in d3ddevices.c */
@@ -109,7 +109,7 @@
 static HRESULT WINAPI MESA_IDirect3DImpl_CreateLight(
     LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
 
     /* Call the creation function that is located in d3dlight.c */
@@ -121,7 +121,7 @@
 static HRESULT WINAPI MESA_IDirect3DImpl_CreateMaterial(
     LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
     /* Call the creation function that is located in d3dviewport.c */
     *lpmaterial = d3dmaterial_create(This);
@@ -131,7 +131,7 @@
 static HRESULT WINAPI MESA_IDirect3DImpl_CreateViewport(
     LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
 
     /* Call the creation function that is located in d3dviewport.c */
@@ -144,7 +144,7 @@
     LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
     LPD3DFINDDEVICERESULT lpfinddevrst)
 {
-    ICOM_THIS(IDirect3DImpl,iface);
+    ICOM_THIS_MULTI(IDirect3DImpl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
 
     return D3D_OK;
@@ -169,7 +169,7 @@
  */
 static HRESULT WINAPI MESA_IDirect3D2Impl_QueryInterface(
     LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
 
     /* FIXME: Not sure if this is correct */
 
@@ -200,7 +200,7 @@
 	d3d->ref = 1;
 	d3d->ddraw = This->ddraw;
 	IDirect3D2_AddRef(iface);
-	ICOM_VTBL(d3d) = &mesa_d3dvt;
+	ICOM_INIT_INTERFACE(d3d,IDirect3D,mesa_d3dvt);
 	*obj = d3d;
 	TRACE("  Creating IDirect3D interface (%p)\n", *obj);
 	return S_OK;
@@ -210,7 +210,7 @@
 }
 
 static ULONG WINAPI MESA_IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--(This->ref)) {
@@ -224,7 +224,7 @@
 static HRESULT WINAPI MESA_IDirect3D2Impl_EnumDevices(
     LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
 ) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
 
     /* Call functions defined in d3ddevices.c */
@@ -236,7 +236,7 @@
 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateLight(
     LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
 
     /* Call the creation function that is located in d3dlight.c */
@@ -248,7 +248,7 @@
 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateMaterial(
     LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
 
     /* Call the creation function that is located in d3dviewport.c */
@@ -260,7 +260,7 @@
 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateViewport(
     LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
 ) {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
 
     /* Call the creation function that is located in d3dviewport.c */
@@ -273,7 +273,7 @@
     LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
     LPD3DFINDDEVICERESULT lpfinddevrst)
 {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
     return D3D_OK;
 }
@@ -282,11 +282,11 @@
     LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
     LPDIRECT3DDEVICE2 *device)
 {
-    ICOM_THIS(IDirect3D2Impl,iface);
+    ICOM_THIS_MULTI(IDirect3D2Impl,iface);
 
     FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
 
-    if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) {
+    if (is_OpenGL(rguid, ICOM_OBJECT(IDirectDrawSurfaceImpl,surface), (IDirect3DDevice2Impl**)device, This)) {
 	IDirect3D2_AddRef(iface);
 	return D3D_OK;
     }
@@ -369,10 +369,10 @@
 
     d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
     d3d->ref = 1;
-    d3d->ddraw = (IDirectDrawImpl *) ddraw;
+    d3d->ddraw = ICOM_OBJECT(IDirectDrawImpl,ddraw);
     d3d->private = NULL; /* unused for now */
     IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
-    ICOM_VTBL(d3d) = &mesa_d3dvt;
+    ICOM_INIT_INTERFACE(d3d,IDirect3D,mesa_d3dvt);
     *obj = (LPUNKNOWN)d3d;
     TRACE("  Created IDirect3D interface (%p)\n", *obj);
 
@@ -384,10 +384,10 @@
 
     d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
     d3d->ref = 1;
-    d3d->ddraw = (IDirectDrawImpl *) ddraw;
+    d3d->ddraw = ICOM_OBJECT(IDirectDrawImpl,ddraw);
     d3d->private = NULL; /* unused for now */
     IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
-    ICOM_VTBL(d3d) = &mesa_d3d2vt;
+    ICOM_INIT_INTERFACE(d3d,IDirect3D2,mesa_d3d2vt);
     *obj = (LPUNKNOWN)d3d;
     TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
 
@@ -399,11 +399,11 @@
 
     d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
     d3d->ref = 1;
-    d3d->ddraw = (IDirectDrawImpl *) ddraw;
+    d3d->ddraw = ICOM_OBJECT(IDirectDrawImpl,ddraw);
     d3d->private = NULL; /* unused for now */
 
     IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
-    ICOM_VTBL(d3d) = &mesa_d3d3vt;
+    ICOM_INIT_INTERFACE(d3d,IDirect3D3,mesa_d3d3vt);
     *obj = (LPUNKNOWN)d3d;
 
     TRACE("  Creating IDirect3D3 interface (%p)\n", *obj);
Index: dpalette/hal.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/dpalette/hal.c,v
retrieving revision 1.2
diff -u -r1.2 hal.c
--- dpalette/hal.c	9 Mar 2002 23:29:36 -0000	1.2
+++ dpalette/hal.c	28 Oct 2002 21:56:59 -0000
@@ -89,7 +89,7 @@
 				 DWORD dwStart, DWORD dwCount,
 				 LPPALETTEENTRY palent)
 {
-    ICOM_THIS(IDirectDrawPaletteImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawPaletteImpl,iface);
     LPDDRAWI_DIRECTDRAW_GBL dd_gbl = This->local.lpDD_lcl->lpGbl;
     DDHAL_SETENTRIESDATA data;
 
Index: dpalette/main.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/dpalette/main.c,v
retrieving revision 1.7
diff -u -r1.7 main.c
--- dpalette/main.c	10 Jul 2002 03:05:43 -0000	1.7
+++ dpalette/main.c	28 Oct 2002 21:56:59 -0000
@@ -110,7 +110,7 @@
 				  DWORD dwStart, DWORD dwCount,
 				  LPPALETTEENTRY palent)
 {
-    ICOM_THIS(IDirectDrawPaletteImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawPaletteImpl,iface);
 
     TRACE("(%p)->GetEntries(%08lx,%ld,%ld,%p)\n",This,dwFlags,dwStart,dwCount,
 	  palent);
@@ -138,7 +138,7 @@
 				  DWORD dwStart, DWORD dwCount,
 				  LPPALETTEENTRY palent)
 {
-    ICOM_THIS(IDirectDrawPaletteImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawPaletteImpl,iface);
 
     TRACE("(%p)->SetEntries(%08lx,%ld,%ld,%p)\n",This,dwFlags,dwStart,dwCount,
 	  palent);
@@ -162,8 +162,7 @@
 	    LPDIRECTDRAWSURFACE7 psurf = NULL;
 	    IDirectDraw7_GetGDISurface(ICOM_INTERFACE(This->ddraw_owner,IDirectDraw7), &psurf);
 	    if (psurf) {
-		IDirectDrawSurfaceImpl *surf = ICOM_OBJECT(IDirectDrawSurfaceImpl,
-							   IDirectDrawSurface7, psurf);
+		IDirectDrawSurfaceImpl *surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, psurf);
 		surf->update_palette(surf, This, dwStart, dwCount, palent);
 		IDirectDrawSurface7_Release(psurf);
 	    }
@@ -207,7 +206,7 @@
 ULONG WINAPI
 Main_DirectDrawPalette_Release(LPDIRECTDRAWPALETTE iface)
 {
-    ICOM_THIS(IDirectDrawPaletteImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawPaletteImpl,iface);
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--This->ref)
@@ -220,7 +219,7 @@
 }
 
 ULONG WINAPI Main_DirectDrawPalette_AddRef(LPDIRECTDRAWPALETTE iface) {
-    ICOM_THIS(IDirectDrawPaletteImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawPaletteImpl,iface);
     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
     return ++This->ref;
 }
@@ -230,7 +229,7 @@
 				  LPDIRECTDRAW ddraw, DWORD dwFlags,
 				  LPPALETTEENTRY palent)
 {
-    ICOM_THIS(IDirectDrawPaletteImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawPaletteImpl,iface);
     TRACE("(%p)->(%p,%ld,%p)\n", This, ddraw, dwFlags, palent);
     return DDERR_ALREADYINITIALIZED;
 }
@@ -238,7 +237,7 @@
 HRESULT WINAPI
 Main_DirectDrawPalette_GetCaps(LPDIRECTDRAWPALETTE iface, LPDWORD lpdwCaps)
 {
-   ICOM_THIS(IDirectDrawPaletteImpl,iface);
+   ICOM_THIS_MULTI(IDirectDrawPaletteImpl,iface);
    TRACE("(%p)->(%p)\n",This,lpdwCaps);
 
    *lpdwCaps = This->global.dwFlags;
@@ -250,7 +249,7 @@
 Main_DirectDrawPalette_QueryInterface(LPDIRECTDRAWPALETTE iface,
 				      REFIID refiid, LPVOID *obj)
 {
-    ICOM_THIS(IDirectDrawPaletteImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawPaletteImpl,iface);
     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
 
     if (IsEqualGUID(refiid, &IID_IUnknown)
Index: dsurface/dib.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/dsurface/dib.c,v
retrieving revision 1.17
diff -u -r1.17 dib.c
--- dsurface/dib.c	18 Oct 2002 23:48:59 -0000	1.17
+++ dsurface/dib.c	28 Oct 2002 21:57:02 -0000
@@ -344,7 +344,7 @@
 			  LPDIRECTDRAWSURFACE7 src, LPRECT rsrc,
 			  DWORD dwFlags, LPDDBLTFX lpbltfx)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl,iface);
     RECT		xdst,xsrc;
     DDSURFACEDESC2	ddesc,sdesc;
     HRESULT		ret = DD_OK;
@@ -775,7 +775,7 @@
 			      DWORD dsty, LPDIRECTDRAWSURFACE7 src,
 			      LPRECT rsrc, DWORD trans)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl,iface);
     int			bpp, w, h, x, y;
     DDSURFACEDESC2	ddesc,sdesc;
     HRESULT		ret = DD_OK;
@@ -1038,8 +1038,7 @@
 							    &back_caps, &tgt);
 	if (!FAILED(hr))
 	{
-	    IDirectDrawSurfaceImpl* target = ICOM_OBJECT(IDirectDrawSurfaceImpl,
-							 IDirectDrawSurface7,tgt);
+	    IDirectDrawSurfaceImpl* target = ICOM_OBJECT(IDirectDrawSurfaceImpl,tgt);
 	    IDirectDrawSurface7_Release(tgt);
 	    target->get_dc(target, &dc);
 	    SetDIBColorTable(dc, dwStart, dwCount, col);
@@ -1056,7 +1055,7 @@
 DIB_DirectDrawSurface_SetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface,
 				     LPDDSURFACEDESC2 pDDSD, DWORD dwFlags)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl,iface);
     DIB_PRIV_VAR(priv, This);
     HRESULT hr = DD_OK;
     DWORD flags = pDDSD->dwFlags;
Index: dsurface/gamma.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/dsurface/gamma.c,v
retrieving revision 1.3
diff -u -r1.3 gamma.c
--- dsurface/gamma.c	31 May 2002 23:25:46 -0000	1.3
+++ dsurface/gamma.c	28 Oct 2002 21:57:02 -0000
@@ -57,7 +57,7 @@
 static HRESULT WINAPI
 DirectDrawGammaControl_GetGammaRamp(LPDIRECTDRAWGAMMACONTROL iface, DWORD dwFlags, LPDDGAMMARAMP lpGammaRamp)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
     TRACE("(%p)->(%08lx,%p)\n", iface,dwFlags,lpGammaRamp);
     return This->get_gamma_ramp(This, dwFlags, lpGammaRamp);
 }
@@ -65,7 +65,7 @@
 static HRESULT WINAPI
 DirectDrawGammaControl_SetGammaRamp(LPDIRECTDRAWGAMMACONTROL iface, DWORD dwFlags, LPDDGAMMARAMP lpGammaRamp)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
     TRACE("(%p)->(%08lx,%p)\n", iface,dwFlags,lpGammaRamp);
     return This->set_gamma_ramp(This, dwFlags, lpGammaRamp);
 }
Index: dsurface/main.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/dsurface/main.c,v
retrieving revision 1.31
diff -u -r1.31 main.c
--- dsurface/main.c	18 Oct 2002 23:48:59 -0000	1.31
+++ dsurface/main.c	28 Oct 2002 21:57:04 -0000
@@ -110,7 +110,7 @@
 
 ULONG WINAPI Main_DirectDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     if (--This->ref == 0)
     {
@@ -125,7 +125,7 @@
 
 ULONG WINAPI Main_DirectDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     return ++This->ref;
 }
@@ -134,7 +134,7 @@
 Main_DirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface, REFIID riid,
 				      LPVOID* ppObj)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
     TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppObj);
 
     if (IsEqualGUID(&IID_IUnknown, riid)
@@ -278,9 +278,8 @@
 Main_DirectDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
 					  LPDIRECTDRAWSURFACE7 pAttach)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
-    IDirectDrawSurfaceImpl* surf = ICOM_OBJECT(IDirectDrawSurfaceImpl,
-					       IDirectDrawSurface7, pAttach);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
+    IDirectDrawSurfaceImpl* surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, pAttach);
 
     TRACE("(%p)->(%p)\n",This,pAttach);
 
@@ -346,7 +345,7 @@
 HRESULT WINAPI
 Main_DirectDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
     volatile IDirectDrawSurfaceImpl* vThis = This;
 
     TRACE("(%p)\n",This);
@@ -375,9 +374,8 @@
 					     DWORD dwFlags,
 					     LPDIRECTDRAWSURFACE7 pAttach)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
-    IDirectDrawSurfaceImpl* surf = ICOM_OBJECT(IDirectDrawSurfaceImpl,
-					       IDirectDrawSurface7, pAttach);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
+    IDirectDrawSurfaceImpl* surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, pAttach);
 
     TRACE("(%p)->(%08lx,%p)\n",This,dwFlags,pAttach);
 
@@ -411,7 +409,7 @@
 					    LPVOID context,
 					    LPDDENUMSURFACESCALLBACK7 cb)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
     IDirectDrawSurfaceImpl* surf;
 
     TRACE("(%p)->(%p,%p)\n",This,context,cb);
@@ -473,7 +471,7 @@
 Main_DirectDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface,
 			    LPDIRECTDRAWSURFACE7 override, DWORD dwFlags)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
     IDirectDrawSurfaceImpl* target;
     HRESULT hr;
 
@@ -499,8 +497,7 @@
 	hr = IDirectDrawSurface7_GetAttachedSurface(iface, &back_caps, &tgt);
 	if (FAILED(hr)) return DDERR_NOTFLIPPABLE; /* unchecked */
 
-	target = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
-			     tgt);
+	target = ICOM_OBJECT(IDirectDrawSurfaceImpl, tgt);
 	IDirectDrawSurface7_Release(tgt);
     }
     else
@@ -514,8 +511,7 @@
 	/* Verify that override is on this flip chain. We assume that
 	 * surf is the head of the flipping chain, because it's the front
 	 * buffer. */
-	target = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
-			     override);
+	target = ICOM_OBJECT(IDirectDrawSurfaceImpl, override);
 
 	/* Either target is (indirectly) attached to This or This is
 	 * (indirectly) attached to target. */
@@ -554,7 +550,7 @@
 HRESULT WINAPI
 Main_DirectDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface, REFGUID tag)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
     PrivateData *data;
 
     data = find_private_data(This, tag);
@@ -583,7 +579,7 @@
 					  LPDDSCAPS2 pCaps,
 					  LPDIRECTDRAWSURFACE7* ppSurface)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
     IDirectDrawSurfaceImpl* surf;
     IDirectDrawSurfaceImpl* found = NULL;
 
@@ -643,7 +639,7 @@
 HRESULT WINAPI
 Main_DirectDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface, LPDDSCAPS2 pCaps)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,pCaps);
     *pCaps = This->surface_desc.ddsCaps;
@@ -654,7 +650,7 @@
 Main_DirectDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface,
 				  LPDIRECTDRAWCLIPPER* ppClipper)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,ppClipper);
     if (This->clipper == NULL)
@@ -674,7 +670,7 @@
      * isn't there? That's like saying that an int isn't there. (Which MS
      * has done in other docs.) */
 
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%08lx,%p)\n",This,dwFlags,pCKey);
     switch (dwFlags)
@@ -708,7 +704,7 @@
 {
     DDSURFACEDESC2 ddsd;
     HRESULT hr;
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,phDC);
     CHECK_LOST(This);
@@ -749,7 +745,7 @@
 HRESULT WINAPI
 Main_DirectDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface, LPVOID* pDD)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,pDD);
     *pDD = ICOM_INTERFACE(This->ddraw_owner, IDirectDraw7);
@@ -777,7 +773,7 @@
 HRESULT WINAPI
 Main_DirectDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface, LPDWORD pdwMaxLOD)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,pdwMaxLOD);
     CHECK_TEXTURE(This);
@@ -797,7 +793,7 @@
 Main_DirectDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface,
 				  LPDIRECTDRAWPALETTE* ppPalette)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,ppPalette);
     if (This->palette == NULL)
@@ -814,7 +810,7 @@
 				      LPDDPIXELFORMAT pDDPixelFormat)
 {
     /* What is DDERR_INVALIDSURFACETYPE for here? */
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,pDDPixelFormat);
     DD_STRUCT_COPY_BYSIZE(pDDPixelFormat,&This->surface_desc.u4.ddpfPixelFormat);
@@ -825,7 +821,7 @@
 Main_DirectDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface,
 				   LPDWORD pdwPriority)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,pdwPriority);
     CHECK_TEXTURE(This);
@@ -839,7 +835,7 @@
 				      REFGUID tag, LPVOID pBuffer,
 				      LPDWORD pcbBufferSize)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
     PrivateData* data;
 
     data = find_private_data(This, tag);
@@ -873,7 +869,7 @@
 Main_DirectDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface,
 				      LPDDSURFACEDESC2 pDDSD)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,pDDSD);
     if ((pDDSD->dwSize < sizeof(DDSURFACEDESC)) ||
@@ -893,7 +889,7 @@
 Main_DirectDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface,
 					  LPDWORD pValue)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,pValue);
     *pValue = This->uniqueness_value;
@@ -911,7 +907,7 @@
 HRESULT WINAPI
 Main_DirectDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p) is%s lost\n",This, (This->lost ? "" : " not"));
     return This->lost ? DDERR_SURFACELOST : DD_OK;
@@ -924,7 +920,7 @@
 Main_DirectDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect,
 			    LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE h)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->Lock(%p,%p,%08lx,%08lx)\n",This,prect,pDDSD,flags,(DWORD)h);
 
@@ -983,7 +979,7 @@
 Main_DirectDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface, HDC hDC)
 {
     HRESULT hr;
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,hDC);
 
@@ -1007,7 +1003,7 @@
 Main_DirectDrawSurface_SetClipper(LPDIRECTDRAWSURFACE7 iface,
 				  LPDIRECTDRAWCLIPPER pDDClipper)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,pDDClipper);
     if (pDDClipper == ICOM_INTERFACE(This->clipper, IDirectDrawClipper))
@@ -1017,8 +1013,7 @@
 	IDirectDrawClipper_Release(ICOM_INTERFACE(This->clipper,
 						  IDirectDrawClipper));
 
-    This->clipper = ICOM_OBJECT(IDirectDrawClipperImpl, IDirectDrawClipper,
-				pDDClipper);
+    This->clipper = ICOM_OBJECT(IDirectDrawClipperImpl, pDDClipper);
     if (pDDClipper != NULL)
 	IDirectDrawClipper_AddRef(pDDClipper);
 
@@ -1029,7 +1024,7 @@
 Main_DirectDrawSurface_SetColorKey(LPDIRECTDRAWSURFACE7 iface,
 				   DWORD dwFlags, LPDDCOLORKEY pCKey)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%08lx,%p)\n",This,dwFlags,pCKey);
     if (pCKey == NULL)
@@ -1067,7 +1062,7 @@
 HRESULT WINAPI
 Main_DirectDrawSurface_SetLOD(LPDIRECTDRAWSURFACE7 iface, DWORD dwMaxLOD)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%08lx)\n",This,dwMaxLOD);
     CHECK_TEXTURE(This);
@@ -1087,7 +1082,7 @@
 Main_DirectDrawSurface_SetPalette(LPDIRECTDRAWSURFACE7 iface,
 				  LPDIRECTDRAWPALETTE pPalette)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%p)\n",This,pPalette);
     if (pPalette == ICOM_INTERFACE(This->palette, IDirectDrawPalette))
@@ -1100,8 +1095,7 @@
 						  IDirectDrawPalette));
     }
 
-    This->palette = ICOM_OBJECT(IDirectDrawPaletteImpl, IDirectDrawPalette,
-				pPalette);
+    This->palette = ICOM_OBJECT(IDirectDrawPaletteImpl, pPalette);
     if (pPalette != NULL) {
 	IDirectDrawPalette_AddRef(pPalette);
 	if (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
@@ -1117,7 +1111,7 @@
 Main_DirectDrawSurface_SetPriority(LPDIRECTDRAWSURFACE7 iface,
 				   DWORD dwPriority)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->(%08lx)\n",This,dwPriority);
     CHECK_TEXTURE(This);
@@ -1134,7 +1128,7 @@
 				      DWORD cbSize, DWORD dwFlags)
 {
     PrivateData* data;
-    ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     data = find_private_data(This, tag);
     if (data == NULL)
@@ -1187,7 +1181,7 @@
 HRESULT WINAPI
 Main_DirectDrawSurface_Unlock(LPDIRECTDRAWSURFACE7 iface, LPRECT pRect)
 {
-    ICOM_THIS(IDirectDrawSurfaceImpl,iface);
+    ICOM_THIS_MULTI(IDirectDrawSurfaceImpl, iface);
 
     TRACE("(%p)->Unlock(%p)\n",This,pRect);
 


More information about the wine-patches mailing list