diff --git a/dlls/dplayx/dplaysp.h b/dlls/dplayx/dplaysp.h
index cb4b057caf..2995b606d5 100644
--- a/dlls/dplayx/dplaysp.h
+++ b/dlls/dplayx/dplaysp.h
@@ -53,6 +53,7 @@ typedef BOOL (CALLBACK *LPENUMMRUCALLBACK)( LPCVOID lpData,
 /* Define the COM interface */
 #define INTERFACE IDirectPlaySP
 #define IDirectPlaySP_METHODS \
+   IUnknown_METHODS \
    STDMETHOD(AddMRUEntry)(THIS_ LPCWSTR lpSection, LPCWSTR lpKey, LPCVOID lpData, DWORD dwDataSize, DWORD dwMaxEntries ) PURE; \
    STDMETHOD(CreateAddress)(THIS_ REFGUID guidSP, REFGUID guidDataType, LPCVOID lpData, DWORD dwDataSize, LPVOID lpAddress,LPDWORD lpdwAddressSize) PURE; \
    STDMETHOD(EnumAddress)(THIS_ LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, LPCVOID lpAddress, DWORD dwAddressSize, LPVOID lpContext ) PURE; \
@@ -65,11 +66,6 @@ typedef BOOL (CALLBACK *LPENUMMRUCALLBACK)( LPCVOID lpData,
    STDMETHOD(GetSPData)(THIS_ LPVOID *lplpData, LPDWORD dwDataSize, DWORD dwFlags ) PURE; \
    STDMETHOD(SetSPData)(THIS_ LPVOID lpData, DWORD dwDataSize, DWORD dwFlags ) PURE; \
    STDMETHOD_(VOID,SendComplete)(THIS_ LPVOID , DWORD  ) PURE;
-
-#define IDirectPlaySP_IMETHODS \
-   IUnknown_IMETHODS \
-   IDirectPlaySP_METHODS
-
 ICOM_DEFINE(IDirectPlaySP,IUnknown)
 #undef INTERFACE
 
diff --git a/dlls/dplayx/lobbysp.h b/dlls/dplayx/lobbysp.h
index 1401502e3f..74fbd239dd 100644
--- a/dlls/dplayx/lobbysp.h
+++ b/dlls/dplayx/lobbysp.h
@@ -458,6 +458,7 @@ HRESULT WINAPI DPLSPInit(LPSPDATA_INIT);
 /* Define the COM interface */
 #define INTERFACE IDPLobbySP
 #define IDPLobbySP_METHODS \
+  IUnknown_METHODS \
   STDMETHOD(AddGroupToGroup)(THIS_ LPSPDATA_ADDREMOTEGROUPTOGROUP  argtg ) PURE; \
   STDMETHOD(AddPlayerToGroup)(THIS_ LPSPDATA_ADDREMOTEPLAYERTOGROUP  arptg ) PURE; \
   STDMETHOD(CreateGroup)(THIS_ LPSPDATA_CREATEREMOTEGROUP  crg ) PURE; \
@@ -474,11 +475,6 @@ HRESULT WINAPI DPLSPInit(LPSPDATA_INIT);
   STDMETHOD(SetSessionDesc)(THIS_ LPSPDATA_SETSESSIONDESC  ssd ) PURE; \
   STDMETHOD(SetSPDataPointer)(THIS_ LPVOID  lpData ) PURE; \
   STDMETHOD(StartSession)(THIS_ LPSPDATA_STARTSESSIONCOMMAND  ssc ) PURE;
-
-#define IDPLobbySP_IMETHODS \
-   IUnknown_IMETHODS \
-   IDPLobbySP_METHODS
-
 ICOM_DEFINE(IDPLobbySP,IUnknown)
 #undef INTERFACE
 
diff --git a/dlls/ole32/ifs.h b/dlls/ole32/ifs.h
index 2bf4432b2d..8faf2a5414 100644
--- a/dlls/ole32/ifs.h
+++ b/dlls/ole32/ifs.h
@@ -29,15 +29,13 @@ typedef struct IMalloc16 IMalloc16, *LPMALLOC16;
 
 #define INTERFACE IMalloc16
 #define IMalloc16_METHODS \
+    IUnknown_METHODS \
     STDMETHOD_(LPVOID,Alloc)(THIS_ DWORD   cb) PURE; \
     STDMETHOD_(LPVOID,Realloc)(THIS_ LPVOID  pv, DWORD  cb) PURE; \
     STDMETHOD_(void,Free)(THIS_ LPVOID  pv) PURE; \
     STDMETHOD_(DWORD,GetSize)(THIS_ LPVOID  pv) PURE; \
     STDMETHOD_(INT16,DidAlloc)(THIS_ LPVOID  pv) PURE; \
     STDMETHOD_(LPVOID,HeapMinimize)(THIS) PURE;
-#define IMalloc16_IMETHODS \
-    IUnknown_IMETHODS \
-    IMalloc16_METHODS
 ICOM_DEFINE(IMalloc16,IUnknown)
 #undef INTERFACE
 
@@ -51,6 +49,7 @@ typedef struct ILockBytes16 *LPLOCKBYTES16, ILockBytes16;
 
 #define INTERFACE ILockBytes
 #define ILockBytes16_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(ReadAt)(THIS_ ULARGE_INTEGER ulOffset, void *pv, ULONG  cb, ULONG *pcbRead) PURE; \
 	STDMETHOD(WriteAt)(THIS_ ULARGE_INTEGER ulOffset, const void *pv, ULONG cb, ULONG *pcbWritten) PURE; \
 	STDMETHOD(Flush)(THIS) PURE; \
@@ -58,11 +57,6 @@ typedef struct ILockBytes16 *LPLOCKBYTES16, ILockBytes16;
 	STDMETHOD(LockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER  cb, DWORD dwLockType) PURE; \
 	STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER  cb, DWORD dwLockType) PURE; \
 	STDMETHOD(Stat)(THIS_ STATSTG *pstatstg, DWORD grfStatFlag) PURE;
-
-#define ILockBytes16_IMETHODS \
-	IUnknown_IMETHODS \
-	ILockBytes16_METHODS
-
 ICOM_DEFINE(ILockBytes16,IUnknown)
 #undef INTERFACE
 
diff --git a/dlls/shell32/shellfolder.h b/dlls/shell32/shellfolder.h
index dad607fc73..140a58cfbe 100644
--- a/dlls/shell32/shellfolder.h
+++ b/dlls/shell32/shellfolder.h
@@ -37,13 +37,11 @@ typedef struct ISFHelper ISFHelper, *LPISFHELPER;
 
 #define INTERFACE ISFHelper
 #define ISFHelper_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetUniqueName)(THIS_ LPSTR  lpName, UINT  uLen) PURE; \
 	STDMETHOD(AddFolder)(THIS_ HWND  hwnd, LPCSTR  lpName, LPITEMIDLIST * ppidlOut) PURE; \
 	STDMETHOD(DeleteItems)(THIS_ UINT  cidl, LPCITEMIDLIST * apidl) PURE; \
 	STDMETHOD(CopyItems)(THIS_ IShellFolder * pSFFrom, UINT  cidl, LPCITEMIDLIST * apidl) PURE;
-#define ISFHelper_IMETHODS \
-    IUnknown_IMETHODS \
-    ISFHelper_METHODS
 ICOM_DEFINE(ISFHelper, IUnknown)
 #undef INTERFACE
 
diff --git a/include/commctrl.h b/include/commctrl.h
index 03cd16a341..e989ec2171 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -582,7 +582,7 @@ HIMAGELIST WINAPI ImageList_LoadImageW(HINSTANCE,LPCWSTR,INT,INT,
                                          COLORREF,UINT,UINT);
 #define    ImageList_LoadImage WINELIB_NAME_AW(ImageList_LoadImage)
 HIMAGELIST WINAPI ImageList_Merge(HIMAGELIST,INT,HIMAGELIST,INT,INT,INT);
-#ifdef IStream_IMETHODS
+#ifdef IStream_METHODS
 HIMAGELIST WINAPI ImageList_Read(LPSTREAM);
 #endif
 BOOL     WINAPI ImageList_Remove(HIMAGELIST,INT);
@@ -594,7 +594,7 @@ BOOL     WINAPI ImageList_SetDragCursorImage(HIMAGELIST,INT,INT,INT);
 BOOL     WINAPI ImageList_SetIconSize(HIMAGELIST,INT,INT);
 BOOL     WINAPI ImageList_SetImageCount(HIMAGELIST,INT);
 BOOL     WINAPI ImageList_SetOverlayImage(HIMAGELIST,INT,INT);
-#ifdef IStream_IMETHODS
+#ifdef IStream_METHODS
 BOOL     WINAPI ImageList_Write(HIMAGELIST, LPSTREAM);
 #endif
 
diff --git a/include/d3d.h b/include/d3d.h
index 89522fe520..dfa9ae8333 100644
--- a/include/d3d.h
+++ b/include/d3d.h
@@ -200,15 +200,13 @@ typedef DWORD D3DVIEWPORTHANDLE, *LPD3DVIEWPORTHANDLE;
  */
 #define INTERFACE IDirect3D
 #define IDirect3D_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Initialize)(THIS_ REFIID riid) PURE; \
     STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, LPVOID lpUserArg) PURE; \
     STDMETHOD(CreateLight)(THIS_ LPDIRECT3DLIGHT *lplpDirect3DLight, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(CreateMaterial)(THIS_ LPDIRECT3DMATERIAL *lplpDirect3DMaterial, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(CreateViewport)(THIS_ LPDIRECT3DVIEWPORT *lplpD3DViewport, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lplpD3DDevice) PURE;
-#define IDirect3D_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3D_METHODS
 ICOM_DEFINE(IDirect3D,IUnknown)
 #undef INTERFACE
 
@@ -232,15 +230,13 @@ ICOM_DEFINE(IDirect3D,IUnknown)
  */
 #define INTERFACE IDirect3D2
 #define IDirect3D2_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, LPVOID lpUserArg) PURE; \
     STDMETHOD(CreateLight)(THIS_ LPDIRECT3DLIGHT *lplpDirect3DLight, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(CreateMaterial)(THIS_ LPDIRECT3DMATERIAL2 *lplpDirect3DMaterial2, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(CreateViewport)(THIS_ LPDIRECT3DVIEWPORT2 *lplpD3DViewport2, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lpD3DFDR) PURE; \
     STDMETHOD(CreateDevice)(THIS_ REFCLSID rclsid, LPDIRECTDRAWSURFACE lpDDS, LPDIRECT3DDEVICE2 *lplpD3DDevice2) PURE;
-#define IDirect3D2_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3D2_METHODS
 ICOM_DEFINE(IDirect3D2,IUnknown)
 #undef INTERFACE
 
@@ -264,6 +260,7 @@ ICOM_DEFINE(IDirect3D2,IUnknown)
  */
 #define INTERFACE IDirect3D3
 #define IDirect3D3_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, LPVOID lpUserArg) PURE; \
     STDMETHOD(CreateLight)(THIS_ LPDIRECT3DLIGHT *lplpDirect3DLight, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(CreateMaterial)(THIS_ LPDIRECT3DMATERIAL3 *lplpDirect3DMaterial3, IUnknown *pUnkOuter) PURE; \
@@ -273,9 +270,6 @@ ICOM_DEFINE(IDirect3D2,IUnknown)
     STDMETHOD(CreateVertexBuffer)(THIS_ LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,LPDIRECT3DVERTEXBUFFER *lplpD3DVertBuf,DWORD dwFlags,LPUNKNOWN lpUnk) PURE; \
     STDMETHOD(EnumZBufferFormats)(THIS_ REFCLSID riidDevice,LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,LPVOID lpContext) PURE; \
     STDMETHOD(EvictManagedTextures)(THIS) PURE;
-#define IDirect3D3_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3D3_METHODS
 ICOM_DEFINE(IDirect3D3,IUnknown)
 #undef INTERFACE
 
@@ -301,14 +295,12 @@ ICOM_DEFINE(IDirect3D3,IUnknown)
  */
 #define INTERFACE IDirect3D7
 #define IDirect3D7_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback, LPVOID lpUserArg) PURE; \
     STDMETHOD(CreateDevice)(THIS_ REFCLSID rclsid,LPDIRECTDRAWSURFACE7 lpDDS, LPDIRECT3DDEVICE7 *lplpD3DDevice) PURE; \
     STDMETHOD(CreateVertexBuffer)(THIS_ LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,LPDIRECT3DVERTEXBUFFER7 *lplpD3DVertBuf,DWORD dwFlags) PURE; \
     STDMETHOD(EnumZBufferFormats)(THIS_ REFCLSID riidDevice,LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,LPVOID lpContext) PURE; \
     STDMETHOD(EvictManagedTextures)(THIS) PURE;
-#define IDirect3D7_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3D7_METHODS
 ICOM_DEFINE(IDirect3D7,IUnknown)
 #undef INTERFACE
 
@@ -331,12 +323,10 @@ ICOM_DEFINE(IDirect3D7,IUnknown)
  */
 #define INTERFACE IDirect3DLight
 #define IDirect3DLight_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Initialize)(THIS_ LPDIRECT3D lpDirect3D) PURE; \
     STDMETHOD(SetLight)(THIS_ LPD3DLIGHT lpLight) PURE; \
     STDMETHOD(GetLight)(THIS_ LPD3DLIGHT lpLight) PURE;
-#define IDirect3DLight_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DLight_METHODS
 ICOM_DEFINE(IDirect3DLight,IUnknown)
 #undef INTERFACE
 
@@ -357,15 +347,13 @@ ICOM_DEFINE(IDirect3DLight,IUnknown)
  */
 #define INTERFACE IDirect3DMaterial
 #define IDirect3DMaterial_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Initialize)(THIS_ LPDIRECT3D lpDirect3D) PURE; \
     STDMETHOD(SetMaterial)(THIS_ LPD3DMATERIAL lpMat) PURE; \
     STDMETHOD(GetMaterial)(THIS_ LPD3DMATERIAL lpMat) PURE; \
     STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE lpDirect3DDevice, LPD3DMATERIALHANDLE lpHandle) PURE; \
     STDMETHOD(Reserve)(THIS) PURE; \
     STDMETHOD(Unreserve)(THIS) PURE;
-#define IDirect3DMaterial_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DMaterial_METHODS
 ICOM_DEFINE(IDirect3DMaterial,IUnknown)
 #undef INTERFACE
 
@@ -389,12 +377,10 @@ ICOM_DEFINE(IDirect3DMaterial,IUnknown)
  */
 #define INTERFACE IDirect3DMaterial2
 #define IDirect3DMaterial2_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(SetMaterial)(THIS_ LPD3DMATERIAL lpMat) PURE; \
     STDMETHOD(GetMaterial)(THIS_ LPD3DMATERIAL lpMat) PURE; \
     STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE2 lpDirect3DDevice2, LPD3DMATERIALHANDLE lpHandle) PURE;
-#define IDirect3DMaterial2_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DMaterial2_METHODS
 ICOM_DEFINE(IDirect3DMaterial2,IUnknown)
 #undef INTERFACE
 
@@ -415,12 +401,10 @@ ICOM_DEFINE(IDirect3DMaterial2,IUnknown)
  */
 #define INTERFACE IDirect3DMaterial3
 #define IDirect3DMaterial3_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(SetMaterial)(THIS_ LPD3DMATERIAL lpMat) PURE; \
     STDMETHOD(GetMaterial)(THIS_ LPD3DMATERIAL lpMat) PURE; \
     STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE3 lpDirect3DDevice3, LPD3DMATERIALHANDLE lpHandle) PURE;
-#define IDirect3DMaterial3_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DMaterial3_METHODS
 ICOM_DEFINE(IDirect3DMaterial3,IUnknown)
 #undef INTERFACE
 
@@ -441,14 +425,12 @@ ICOM_DEFINE(IDirect3DMaterial3,IUnknown)
  */
 #define INTERFACE IDirect3DTexture
 #define IDirect3DTexture_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Initialize)(THIS_ LPDIRECT3DDEVICE lpDirect3DDevice, LPDIRECTDRAWSURFACE lpDDSurface) PURE; \
     STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE lpDirect3DDevice, LPD3DTEXTUREHANDLE  lpHandle) PURE; \
     STDMETHOD(PaletteChanged)(THIS_ DWORD dwStart, DWORD dwCount) PURE; \
     STDMETHOD(Load)(THIS_ LPDIRECT3DTEXTURE lpD3DTexture) PURE; \
     STDMETHOD(Unload)(THIS) PURE;
-#define IDirect3DTexture_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DTexture_METHODS
 ICOM_DEFINE(IDirect3DTexture,IUnknown)
 #undef INTERFACE
 
@@ -471,12 +453,10 @@ ICOM_DEFINE(IDirect3DTexture,IUnknown)
  */
 #define INTERFACE IDirect3DTexture2
 #define IDirect3DTexture2_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE2 lpDirect3DDevice2, LPD3DTEXTUREHANDLE lpHandle) PURE; \
     STDMETHOD(PaletteChanged)(THIS_ DWORD dwStart, DWORD dwCount) PURE; \
     STDMETHOD(Load)(THIS_ LPDIRECT3DTEXTURE2 lpD3DTexture2) PURE;
-#define IDirect3DTexture2_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DTexture2_METHODS
 ICOM_DEFINE(IDirect3DTexture2,IUnknown)
 #undef INTERFACE
 
@@ -497,6 +477,7 @@ ICOM_DEFINE(IDirect3DTexture2,IUnknown)
  */
 #define INTERFACE IDirect3DViewport
 #define IDirect3DViewport_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Initialize)(THIS_ LPDIRECT3D lpDirect3D) PURE; \
     STDMETHOD(GetViewport)(THIS_ LPD3DVIEWPORT lpData) PURE; \
     STDMETHOD(SetViewport)(THIS_ LPD3DVIEWPORT lpData) PURE; \
@@ -510,9 +491,6 @@ ICOM_DEFINE(IDirect3DTexture2,IUnknown)
     STDMETHOD(AddLight)(THIS_ LPDIRECT3DLIGHT lpDirect3DLight) PURE; \
     STDMETHOD(DeleteLight)(THIS_ LPDIRECT3DLIGHT lpDirect3DLight) PURE; \
     STDMETHOD(NextLight)(THIS_ LPDIRECT3DLIGHT lpDirect3DLight, LPDIRECT3DLIGHT *lplpDirect3DLight, DWORD dwFlags) PURE;
-#define IDirect3DViewport_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DViewport_METHODS
 ICOM_DEFINE(IDirect3DViewport,IUnknown)
 #undef INTERFACE
 
@@ -543,11 +521,9 @@ ICOM_DEFINE(IDirect3DViewport,IUnknown)
  */
 #define INTERFACE IDirect3DViewport2
 #define IDirect3DViewport2_METHODS \
+    IDirect3DViewport_METHODS \
     STDMETHOD(GetViewport2)(THIS_ LPD3DVIEWPORT2 lpData) PURE; \
     STDMETHOD(SetViewport2)(THIS_ LPD3DVIEWPORT2 lpData) PURE;
-#define IDirect3DViewport2_IMETHODS \
-    IDirect3DViewport_IMETHODS \
-    IDirect3DViewport2_METHODS
 ICOM_DEFINE(IDirect3DViewport2,IDirect3DViewport)
 #undef INTERFACE
 
@@ -580,12 +556,10 @@ ICOM_DEFINE(IDirect3DViewport2,IDirect3DViewport)
  */
 #define INTERFACE IDirect3DViewport3
 #define IDirect3DViewport3_METHODS \
+    IDirect3DViewport2_METHODS \
     STDMETHOD(SetBackgroundDepth2)(THIS_ LPDIRECTDRAWSURFACE4 lpDDS) PURE; \
     STDMETHOD(GetBackgroundDepth2)(THIS_ LPDIRECTDRAWSURFACE4 *lplpDDS,LPBOOL lpValid) PURE; \
     STDMETHOD(Clear2)(THIS_ DWORD dwCount,LPD3DRECT lpRects,DWORD dwFlags,DWORD dwColor,D3DVALUE dvZ,DWORD dwStencil) PURE;
-#define IDirect3DViewport3_IMETHODS \
-    IDirect3DViewport2_IMETHODS \
-    IDirect3DViewport3_METHODS
 ICOM_DEFINE(IDirect3DViewport3,IDirect3DViewport2)
 #undef INTERFACE
 
@@ -624,6 +598,7 @@ ICOM_DEFINE(IDirect3DViewport3,IDirect3DViewport2)
  */
 #define INTERFACE IDirect3DExecuteBuffer
 #define IDirect3DExecuteBuffer_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Initialize)(THIS_ LPDIRECT3DDEVICE lpDirect3DDevice, LPD3DEXECUTEBUFFERDESC lpDesc) PURE; \
     STDMETHOD(Lock)(THIS_ LPD3DEXECUTEBUFFERDESC lpDesc) PURE; \
     STDMETHOD(Unlock)(THIS) PURE; \
@@ -631,9 +606,6 @@ ICOM_DEFINE(IDirect3DViewport3,IDirect3DViewport2)
     STDMETHOD(GetExecuteData)(THIS_ LPD3DEXECUTEDATA lpData) PURE; \
     STDMETHOD(Validate)(THIS_ LPDWORD lpdwOffset, LPD3DVALIDATECALLBACK lpFunc, LPVOID lpUserArg, DWORD dwReserved) PURE; \
     STDMETHOD(Optimize)(THIS_ DWORD dwDummy) PURE;
-#define IDirect3DExecuteBuffer_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DExecuteBuffer_METHODS
 ICOM_DEFINE(IDirect3DExecuteBuffer,IUnknown)
 #undef INTERFACE
 
@@ -658,6 +630,7 @@ ICOM_DEFINE(IDirect3DExecuteBuffer,IUnknown)
  */
 #define INTERFACE IDirect3DDevice
 #define IDirect3DDevice_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Initialize)(THIS_ LPDIRECT3D lpDirect3D, LPGUID lpGUID, LPD3DDEVICEDESC lpD3DDVDesc) PURE; \
     STDMETHOD(GetCaps)(THIS_ LPD3DDEVICEDESC lpD3DHWDevDesc, LPD3DDEVICEDESC lpD3DHELDevDesc) PURE; \
     STDMETHOD(SwapTextureHandles)(THIS_ LPDIRECT3DTEXTURE lpD3Dtex1, LPDIRECT3DTEXTURE lpD3DTex2) PURE; \
@@ -677,9 +650,6 @@ ICOM_DEFINE(IDirect3DExecuteBuffer,IUnknown)
     STDMETHOD(BeginScene)(THIS) PURE; \
     STDMETHOD(EndScene)(THIS) PURE; \
     STDMETHOD(GetDirect3D)(THIS_ LPDIRECT3D *lplpDirect3D) PURE;
-#define IDirect3DDevice_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DDevice_METHODS
 ICOM_DEFINE(IDirect3DDevice,IUnknown)
 #undef INTERFACE
 
@@ -716,6 +686,7 @@ ICOM_DEFINE(IDirect3DDevice,IUnknown)
  */
 #define INTERFACE IDirect3DDevice2
 #define IDirect3DDevice2_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetCaps)(THIS_ LPD3DDEVICEDESC lpD3DHWDevDesc, LPD3DDEVICEDESC lpD3DHELDevDesc) PURE; \
     STDMETHOD(SwapTextureHandles)(THIS_ LPDIRECT3DTEXTURE2 lpD3DTex1, LPDIRECT3DTEXTURE2 lpD3DTex2) PURE; \
     STDMETHOD(GetStats)(THIS_ LPD3DSTATS lpD3DStats) PURE; \
@@ -747,9 +718,6 @@ ICOM_DEFINE(IDirect3DDevice,IUnknown)
     STDMETHOD(DrawIndexedPrimitive)(THIS_ D3DPRIMITIVETYPE d3dptPrimitiveType, D3DVERTEXTYPE d3dvtVertexType, LPVOID lpvVertices, DWORD dwVertexCount, LPWORD dwIndices, DWORD dwIndexCount, DWORD dwFlags) PURE; \
     STDMETHOD(SetClipStatus)(THIS_ LPD3DCLIPSTATUS lpD3DClipStatus) PURE; \
     STDMETHOD(GetClipStatus)(THIS_ LPD3DCLIPSTATUS lpD3DClipStatus) PURE;
-#define IDirect3DDevice2_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DDevice2_METHODS
 ICOM_DEFINE(IDirect3DDevice2,IUnknown)
 #undef INTERFACE
 
@@ -796,6 +764,7 @@ ICOM_DEFINE(IDirect3DDevice2,IUnknown)
  */
 #define INTERFACE IDirect3DDevice3
 #define IDirect3DDevice3_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetCaps)(THIS_ LPD3DDEVICEDESC lpD3DHWDevDesc, LPD3DDEVICEDESC lpD3DHELDevDesc) PURE; \
     STDMETHOD(GetStats)(THIS_ LPD3DSTATS lpD3DStats) PURE; \
     STDMETHOD(AddViewport)(THIS_ LPDIRECT3DVIEWPORT3 lpDirect3DViewport3) PURE; \
@@ -836,9 +805,6 @@ ICOM_DEFINE(IDirect3DDevice2,IUnknown)
     STDMETHOD(GetTextureStageState)(THIS_ DWORD dwStage,D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,LPDWORD lpdwState) PURE; \
     STDMETHOD(SetTextureStageState)(THIS_ DWORD dwStage,D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,DWORD dwState) PURE; \
     STDMETHOD(ValidateDevice)(THIS_ LPDWORD lpdwPasses) PURE;
-#define IDirect3DDevice3_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DDevice3_METHODS
 ICOM_DEFINE(IDirect3DDevice3,IUnknown)
 #undef INTERFACE
 
@@ -894,6 +860,7 @@ ICOM_DEFINE(IDirect3DDevice3,IUnknown)
  */
 #define INTERFACE IDirect3DDevice7
 #define IDirect3DDevice7_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetCaps)(THIS_ LPD3DDEVICEDESC7 lpD3DHELDevDesc) PURE; \
     STDMETHOD(EnumTextureFormats)(THIS_ LPD3DENUMPIXELFORMATSCALLBACK lpD3DEnumPixelProc, LPVOID lpArg) PURE; \
     STDMETHOD(BeginScene)(THIS) PURE; \
@@ -940,9 +907,6 @@ ICOM_DEFINE(IDirect3DDevice3,IUnknown)
     STDMETHOD(SetClipPlane)(THIS_ DWORD dwIndex,D3DVALUE *pPlaneEquation) PURE; \
     STDMETHOD(GetClipPlane)(THIS_ DWORD dwIndex,D3DVALUE *pPlaneEquation) PURE; \
     STDMETHOD(GetInfo)(THIS_ DWORD dwDevInfoID,LPVOID pDevInfoStruct,DWORD dwSize) PURE;
-#define IDirect3DDevice7_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DDevice7_METHODS
 ICOM_DEFINE(IDirect3DDevice7,IUnknown)
 #undef INTERFACE
 
@@ -1005,14 +969,12 @@ ICOM_DEFINE(IDirect3DDevice7,IUnknown)
  */
 #define INTERFACE IDirect3DVertexBuffer
 #define IDirect3DVertexBuffer_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Lock)(THIS_ DWORD dwFlags,LPVOID *lplpData,LPDWORD lpdwSize) PURE; \
     STDMETHOD(Unlock)(THIS) PURE; \
     STDMETHOD(ProcessVertices)(THIS_ DWORD dwVertexOp,DWORD dwDestIndex,DWORD dwCount,LPDIRECT3DVERTEXBUFFER lpSrcBuffer,DWORD dwSrcIndex,LPDIRECT3DDEVICE3 lpD3DDevice,DWORD dwFlags) PURE; \
     STDMETHOD(GetVertexBufferDesc)(THIS_ LPD3DVERTEXBUFFERDESC lpD3DVertexBufferDesc) PURE; \
     STDMETHOD(Optimize)(THIS_ LPDIRECT3DDEVICE3  lpD3DDevice,DWORD dwFlags) PURE;
-#define IDirect3DVertexBuffer_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DVertexBuffer_METHODS
 ICOM_DEFINE(IDirect3DVertexBuffer,IUnknown)
 #undef INTERFACE
 
@@ -1034,15 +996,13 @@ ICOM_DEFINE(IDirect3DVertexBuffer,IUnknown)
  */
 #define INTERFACE IDirect3DVertexBuffer7
 #define IDirect3DVertexBuffer7_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Lock)(THIS_ DWORD dwFlags,LPVOID *lplpData,LPDWORD lpdwSize) PURE; \
     STDMETHOD(Unlock)(THIS) PURE; \
     STDMETHOD(ProcessVertices)(THIS_ DWORD dwVertexOp,DWORD dwDestIndex,DWORD dwCount,LPDIRECT3DVERTEXBUFFER7 lpSrcBuffer,DWORD dwSrcIndex,LPDIRECT3DDEVICE7 lpD3DDevice,DWORD dwFlags) PURE; \
     STDMETHOD(GetVertexBufferDesc)(THIS_ LPD3DVERTEXBUFFERDESC lpD3DVertexBufferDesc) PURE; \
     STDMETHOD(Optimize)(THIS_ LPDIRECT3DDEVICE7  lpD3DDevice,DWORD dwFlags) PURE; \
     STDMETHOD(ProcessVerticesStrided)(THIS_ DWORD dwVertexOp,DWORD dwDestIndex,DWORD dwCount,LPD3DDRAWPRIMITIVESTRIDEDDATA lpStrideData,DWORD dwVertexTypeDesc,LPDIRECT3DDEVICE7 lpD3DDevice,DWORD dwFlags) PURE;
-#define IDirect3DVertexBuffer7_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DVertexBuffer7_METHODS
 ICOM_DEFINE(IDirect3DVertexBuffer7,IUnknown)
 #undef INTERFACE
 
diff --git a/include/d3d8.h b/include/d3d8.h
index 85a19704bd..0a9826ac1b 100644
--- a/include/d3d8.h
+++ b/include/d3d8.h
@@ -104,7 +104,7 @@ typedef struct IDirect3DVolumeTexture8   IDirect3DVolumeTexture8, *LPDIRECT3DVOL
  */
 #define INTERFACE IDirect3D8
 #define IDirect3D8_METHODS \
-    /*** IDirect3D8 methods ***/                         \
+    IUnknown_METHODS \
     STDMETHOD(RegisterSoftwareDevice)(THIS_ void * pInitializeFunction) PURE; \
     STDMETHOD_(UINT,GetAdapterCount             )(THIS) PURE; \
     STDMETHOD(GetAdapterIdentifier)(THIS_ UINT  Adapter, DWORD  Flags, D3DADAPTER_IDENTIFIER8 * pIdentifier) PURE; \
@@ -118,11 +118,6 @@ typedef struct IDirect3DVolumeTexture8   IDirect3DVolumeTexture8, *LPDIRECT3DVOL
     STDMETHOD(GetDeviceCaps)(THIS_ UINT  Adapter, D3DDEVTYPE  DeviceType, D3DCAPS8 * pCaps) PURE; \
     STDMETHOD_(HMONITOR,GetAdapterMonitor)(THIS_ UINT  Adapter) PURE; \
     STDMETHOD(CreateDevice)(THIS_ UINT  Adapter, D3DDEVTYPE  DeviceType,HWND  hFocusWindow, DWORD  BehaviorFlags, D3DPRESENT_PARAMETERS * pPresentationParameters, IDirect3DDevice8 ** ppReturnedDeviceInterface) PURE;
-
-    /*** IDirect3D8 methods ***/
-#define IDirect3D8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3D8_METHODS
 ICOM_DEFINE(IDirect3D8,IUnknown)
 #undef INTERFACE
 
@@ -152,7 +147,7 @@ ICOM_DEFINE(IDirect3D8,IUnknown)
  */
 #define INTERFACE IDirect3DDevice8
 #define IDirect3DDevice8_METHODS \
-    /*** IDirect3DDevice8 methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(TestCooperativeLevel)(THIS) PURE; \
     STDMETHOD_(UINT,GetAvailableTextureMem)(THIS) PURE; \
     STDMETHOD(ResourceManagerDiscardBytes)(THIS_ DWORD  Bytes) PURE; \
@@ -246,12 +241,7 @@ ICOM_DEFINE(IDirect3D8,IUnknown)
     STDMETHOD(GetPixelShaderFunction)(THIS_ DWORD  Handle,void * pData,DWORD * pSizeOfData) PURE; \
     STDMETHOD(DrawRectPatch)(THIS_ UINT  Handle,CONST float * pNumSegs,CONST D3DRECTPATCH_INFO * pRectPatchInfo) PURE; \
     STDMETHOD(DrawTriPatch)(THIS_ UINT  Handle,CONST float * pNumSegs,CONST D3DTRIPATCH_INFO * pTriPatchInfo) PURE; \
-    STDMETHOD(DeletePatch)(THIS_ UINT  Handle) PURE; \
-
-    /*** IDirect3DDevice8 methods ***/
-#define IDirect3DDevice8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DDevice8_METHODS
+    STDMETHOD(DeletePatch)(THIS_ UINT  Handle) PURE;
 ICOM_DEFINE(IDirect3DDevice8,IUnknown)
 #undef INTERFACE
 
@@ -362,7 +352,7 @@ ICOM_DEFINE(IDirect3DDevice8,IUnknown)
  */
 #define INTERFACE IDirect3DVolume8
 #define IDirect3DVolume8_METHODS \
-    /*** IDirect3DVolume8 methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8 ** ppDevice) PURE; \
     STDMETHOD(SetPrivateData)(THIS_ REFGUID  refguid,CONST void * pData, DWORD  SizeOfData, DWORD  Flags) PURE; \
     STDMETHOD(GetPrivateData)(THIS_ REFGUID   refguid,void * pData, DWORD * pSizeOfData) PURE; \
@@ -370,12 +360,7 @@ ICOM_DEFINE(IDirect3DDevice8,IUnknown)
     STDMETHOD(GetContainer)(THIS_ REFIID  riid, void ** ppContainer) PURE; \
     STDMETHOD(GetDesc)(THIS_ D3DVOLUME_DESC * pDesc) PURE; \
     STDMETHOD(LockBox)(THIS_ D3DLOCKED_BOX * pLockedVolume,CONST D3DBOX * pBox, DWORD  Flags) PURE; \
-    STDMETHOD(UnlockBox)(THIS) PURE; \
-
-    /*** IDirect3DVolume8 methods ***/
-#define IDirect3DVolume8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DVolume8_METHODS
+    STDMETHOD(UnlockBox)(THIS) PURE;
 ICOM_DEFINE(IDirect3DVolume8,IUnknown)
 #undef INTERFACE
 
@@ -400,14 +385,9 @@ ICOM_DEFINE(IDirect3DVolume8,IUnknown)
  */
 #define INTERFACE IDirect3DSwapChain8
 #define IDirect3DSwapChain8_METHODS \
-    /*** IDirect3DSwapChain8 methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Present)(THIS_ CONST RECT * pSourceRect, CONST RECT * pDestRect, HWND  hDestWindowOverride,CONST RGNDATA * pDirtyRegion) PURE; \
-    STDMETHOD(GetBackBuffer)(THIS_ UINT  BackBuffer, D3DBACKBUFFER_TYPE  Type,IDirect3DSurface8 ** ppBackBuffer) PURE; \
-
-    /*** IDirect3DSwapChain8 methods ***/
-#define IDirect3DSwapChain8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DSwapChain8_METHODS
+    STDMETHOD(GetBackBuffer)(THIS_ UINT  BackBuffer, D3DBACKBUFFER_TYPE  Type,IDirect3DSurface8 ** ppBackBuffer) PURE;
 ICOM_DEFINE(IDirect3DSwapChain8,IUnknown)
 #undef INTERFACE
 
@@ -426,7 +406,7 @@ ICOM_DEFINE(IDirect3DSwapChain8,IUnknown)
  */
 #define INTERFACE IDirect3DSurface8
 #define IDirect3DSurface8_METHODS \
-    /*** IDirect3DSurface8 methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8 ** ppDevice) PURE; \
     STDMETHOD(SetPrivateData)(THIS_ REFGUID  refguid,CONST void * pData,DWORD  SizeOfData,DWORD  Flags) PURE; \
     STDMETHOD(GetPrivateData)(THIS_ REFGUID  refguid,void * pData,DWORD * pSizeOfData) PURE; \
@@ -434,12 +414,7 @@ ICOM_DEFINE(IDirect3DSwapChain8,IUnknown)
     STDMETHOD(GetContainer)(THIS_ REFIID  riid, void ** ppContainer) PURE; \
     STDMETHOD(GetDesc)(THIS_ D3DSURFACE_DESC * pDesc) PURE; \
     STDMETHOD(LockRect)(THIS_ D3DLOCKED_RECT * pLockedRect, CONST RECT * pRect,DWORD  Flags) PURE; \
-    STDMETHOD(UnlockRect)(THIS) PURE; \
-
-    /*** IDirect3DSurface8 methods ***/
-#define IDirect3DSurface8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DSurface8_METHODS
+    STDMETHOD(UnlockRect)(THIS) PURE;
 ICOM_DEFINE(IDirect3DSurface8,IUnknown)
 #undef INTERFACE
 
@@ -464,7 +439,7 @@ ICOM_DEFINE(IDirect3DSurface8,IUnknown)
  */
 #define INTERFACE IDirect3DResource8
 #define IDirect3DResource8_METHODS \
-    /*** IDirect3DResource8 methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8 ** ppDevice) PURE; \
     STDMETHOD(SetPrivateData)(THIS_ REFGUID  refguid, CONST void * pData, DWORD  SizeOfData, DWORD  Flags) PURE; \
     STDMETHOD(GetPrivateData)(THIS_ REFGUID  refguid, void * pData, DWORD * pSizeOfData) PURE; \
@@ -473,11 +448,6 @@ ICOM_DEFINE(IDirect3DSurface8,IUnknown)
     STDMETHOD_(DWORD,GetPriority)(THIS) PURE; \
     STDMETHOD_(void,PreLoad)(THIS) PURE; \
     STDMETHOD_(D3DRESOURCETYPE,GetType)(THIS) PURE;
-
-    /*** IDirect3DResource8 methods ***/
-#define IDirect3DResource8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DResource8_METHODS
 ICOM_DEFINE(IDirect3DResource8,IUnknown)
 #undef INTERFACE
 
@@ -502,16 +472,10 @@ ICOM_DEFINE(IDirect3DResource8,IUnknown)
  */
 #define INTERFACE IDirect3DVertexBuffer8
 #define IDirect3DVertexBuffer8_METHODS \
-    /*** IDirect3DVertexBuffer8 methods ***/ \
+    IDirect3DResource8_METHODS \
     STDMETHOD(Lock)(THIS_ UINT  OffsetToLock, UINT  SizeToLock, BYTE ** ppbData, DWORD  Flags) PURE; \
     STDMETHOD(Unlock)(THIS) PURE; \
     STDMETHOD(GetDesc)(THIS_ D3DVERTEXBUFFER_DESC  * pDesc) PURE;
-
-    /*** IDirect3DVertexBuffer8 methods ***/
-#define IDirect3DVertexBuffer8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DResource8_METHODS \
-    IDirect3DVertexBuffer8_METHODS
 ICOM_DEFINE(IDirect3DVertexBuffer8,IDirect3DResource8)
 #undef INTERFACE
 
@@ -540,16 +504,10 @@ ICOM_DEFINE(IDirect3DVertexBuffer8,IDirect3DResource8)
  */
 #define INTERFACE IDirect3DIndexBuffer8
 #define IDirect3DIndexBuffer8_METHODS \
-    /*** IDirect3DIndexBuffer8 methods ***/ \
+    IDirect3DResource8_METHODS \
     STDMETHOD(Lock)(THIS_ UINT  OffsetToLock, UINT  SizeToLock, BYTE ** ppbData, DWORD  Flags) PURE; \
     STDMETHOD(Unlock)(THIS) PURE; \
-    STDMETHOD(GetDesc)(THIS_ D3DINDEXBUFFER_DESC * pDesc) PURE; \
-
-    /*** IDirect3DIndexBuffer8 methods ***/
-#define IDirect3DIndexBuffer8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DResource8_METHODS \
-    IDirect3DIndexBuffer8_METHODS
+    STDMETHOD(GetDesc)(THIS_ D3DINDEXBUFFER_DESC * pDesc) PURE;
 ICOM_DEFINE(IDirect3DIndexBuffer8,IDirect3DResource8)
 #undef INTERFACE
 
@@ -578,16 +536,10 @@ ICOM_DEFINE(IDirect3DIndexBuffer8,IDirect3DResource8)
  */
 #define INTERFACE IDirect3DBaseTexture8
 #define IDirect3DBaseTexture8_METHODS \
-    /*** IDirect3DBaseTexture8 methods ***/ \
+    IDirect3DResource8_METHODS \
     STDMETHOD_(DWORD,SetLOD)(THIS_ DWORD  LODNew) PURE; \
     STDMETHOD_(DWORD,GetLOD)(THIS) PURE; \
     STDMETHOD_(DWORD,GetLevelCount)(THIS) PURE;
-
-    /*** IDirect3DBaseTexture8 methods ***/
-#define IDirect3DBaseTexture8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DResource8_METHODS \
-    IDirect3DBaseTexture8_METHODS
 ICOM_DEFINE(IDirect3DBaseTexture8,IDirect3DResource8)
 #undef INTERFACE
 
@@ -616,19 +568,12 @@ ICOM_DEFINE(IDirect3DBaseTexture8,IDirect3DResource8)
  */
 #define INTERFACE IDirect3DCubeTexture8
 #define IDirect3DCubeTexture8_METHODS \
-    /*** IDirect3DCubeTexture8 methods ***/ \
+    IDirect3DBaseTexture8_METHODS \
     STDMETHOD(GetLevelDesc)(THIS_ UINT  Level,D3DSURFACE_DESC * pDesc) PURE; \
     STDMETHOD(GetCubeMapSurface)(THIS_ D3DCUBEMAP_FACES  FaceType,UINT  Level,IDirect3DSurface8 ** ppCubeMapSurface) PURE; \
     STDMETHOD(LockRect)(THIS_ D3DCUBEMAP_FACES  FaceType,UINT  Level,D3DLOCKED_RECT * pLockedRect,CONST RECT * pRect,DWORD  Flags) PURE; \
     STDMETHOD(UnlockRect)(THIS_ D3DCUBEMAP_FACES  FaceType,UINT  Level) PURE; \
-    STDMETHOD(AddDirtyRect)(THIS_ D3DCUBEMAP_FACES  FaceType,CONST RECT * pDirtyRect) PURE; \
-
-    /*** IDirect3DCubeTexture8 methods ***/
-#define IDirect3DCubeTexture8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DResource8_METHODS \
-    IDirect3DBaseTexture8_METHODS \
-    IDirect3DCubeTexture8_METHODS
+    STDMETHOD(AddDirtyRect)(THIS_ D3DCUBEMAP_FACES  FaceType,CONST RECT * pDirtyRect) PURE;
 ICOM_DEFINE(IDirect3DCubeTexture8,IDirect3DBaseTexture8)
 #undef INTERFACE
 
@@ -663,19 +608,12 @@ ICOM_DEFINE(IDirect3DCubeTexture8,IDirect3DBaseTexture8)
  */
 #define INTERFACE IDirect3DTexture8
 #define IDirect3DTexture8_METHODS \
-    /*** IDirect3DTexture8 methods ***/ \
+    IDirect3DBaseTexture8_METHODS \
     STDMETHOD(GetLevelDesc)(THIS_ UINT  Level,D3DSURFACE_DESC * pDesc) PURE; \
     STDMETHOD(GetSurfaceLevel)(THIS_ UINT  Level,IDirect3DSurface8 ** ppSurfaceLevel) PURE; \
     STDMETHOD(LockRect)(THIS_ UINT  Level,D3DLOCKED_RECT * pLockedRect,CONST RECT * pRect,DWORD  Flags) PURE; \
     STDMETHOD(UnlockRect)(THIS_ UINT  Level) PURE; \
-    STDMETHOD(AddDirtyRect)(THIS_ CONST RECT * pDirtyRect) PURE; \
-
-    /*** IDirect3DTexture8 methods ***/
-#define IDirect3DTexture8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DResource8_METHODS \
-    IDirect3DBaseTexture8_METHODS \
-    IDirect3DTexture8_METHODS
+    STDMETHOD(AddDirtyRect)(THIS_ CONST RECT * pDirtyRect) PURE;
 ICOM_DEFINE(IDirect3DTexture8,IDirect3DBaseTexture8)
 #undef INTERFACE
 
@@ -710,19 +648,12 @@ ICOM_DEFINE(IDirect3DTexture8,IDirect3DBaseTexture8)
  */
 #define INTERFACE IDirect3DVolumeTexture8
 #define IDirect3DVolumeTexture8_METHODS \
-    /*** IDirect3DVolumeTexture8 methods ***/ \
+    IDirect3DBaseTexture8_METHODS \
     STDMETHOD(GetLevelDesc)(THIS_ UINT  Level,D3DVOLUME_DESC * pDesc) PURE; \
     STDMETHOD(GetVolumeLevel)(THIS_ UINT  Level,IDirect3DVolume8 ** ppVolumeLevel) PURE; \
     STDMETHOD(LockBox)(THIS_ UINT  Level,D3DLOCKED_BOX * pLockedVolume,CONST D3DBOX * pBox,DWORD  Flags) PURE; \
     STDMETHOD(UnlockBox)(THIS_ UINT  Level) PURE; \
     STDMETHOD(AddDirtyBox)(THIS_ CONST D3DBOX * pDirtyBox) PURE;
-
-    /*** IDirect3DVolumeTexture8 methods ***/
-#define IDirect3DVolumeTexture8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirect3DResource8_METHODS \
-    IDirect3DBaseTexture8_METHODS \
-    IDirect3DVolumeTexture8_METHODS
 ICOM_DEFINE(IDirect3DVolumeTexture8,IDirect3DBaseTexture8)
 #undef INTERFACE
 
diff --git a/include/d3dx8core.h b/include/d3dx8core.h
index a0f614a3be..610b7d9248 100644
--- a/include/d3dx8core.h
+++ b/include/d3dx8core.h
@@ -58,14 +58,9 @@ typedef struct ID3DXFont                ID3DXFont, *LPD3DXFONT;
 #undef INTERFACE
 #define INTERFACE ID3DXBuffer
 #define ID3DXBuffer_METHODS \
-    /*** ID3DXBuffer methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD_(LPVOID,GetBufferPointer)(THIS) PURE; \
     STDMETHOD_(DWORD,GetBufferSize)(THIS) PURE;
-
-    /*** ID3DXBuffer methods ***/
-#define ID3DXBuffer_IMETHODS \
-    IUnknown_IMETHODS \
-    ID3DXBuffer_METHODS
 ICOM_DEFINE(ID3DXBuffer,IUnknown)
 #undef INTERFACE
 
@@ -85,15 +80,10 @@ ICOM_DEFINE(ID3DXBuffer,IUnknown)
 #undef INTERFACE
 #define INTERFACE ID3DXFont
 #define ID3DXFont_METHODS \
-    /*** ID3DXFont methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Begin)(THIS) PURE; \
     STDMETHOD(DrawTextA)(THIS) PURE; \
     STDMETHOD(End)(THIS) PURE;
-
-    /*** ID3DXFont methods ***/
-#define ID3DXFont_IMETHODS \
-    IUnknown_IMETHODS \
-    ID3DXFont_METHODS
 ICOM_DEFINE(ID3DXFont,IUnknown)
 #undef INTERFACE
 
diff --git a/include/ddraw.h b/include/ddraw.h
index d0ea95d82b..ba42399d2c 100644
--- a/include/ddraw.h
+++ b/include/ddraw.h
@@ -1203,13 +1203,11 @@ typedef struct tagDDDEVICEIDENTIFIER2 {
  */
 #define INTERFACE IDirectDrawPalette
 #define IDirectDrawPalette_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetCaps)(THIS_ LPDWORD lpdwCaps) PURE; \
     STDMETHOD(GetEntries)(THIS_ DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries) PURE; \
     STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW lpDD, DWORD dwFlags, LPPALETTEENTRY lpDDColorTable) PURE; \
     STDMETHOD(SetEntries)(THIS_ DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries) PURE;
-#define IDirectDrawPalette_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDrawPalette_METHODS
 ICOM_DEFINE(IDirectDrawPalette,IUnknown)
 #undef INTERFACE
 
@@ -1231,15 +1229,13 @@ ICOM_DEFINE(IDirectDrawPalette,IUnknown)
  */
 #define INTERFACE IDirectDrawClipper
 #define IDirectDrawClipper_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetClipList)(THIS_ LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSize) PURE; \
     STDMETHOD(GetHWnd)(THIS_ HWND *lphWnd) PURE; \
     STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW lpDD, DWORD dwFlags) PURE; \
     STDMETHOD(IsClipListChanged)(THIS_ BOOL *lpbChanged) PURE; \
     STDMETHOD(SetClipList)(THIS_ LPRGNDATA lpClipList, DWORD dwFlags) PURE; \
     STDMETHOD(SetHWnd)(THIS_ DWORD dwFlags, HWND hWnd) PURE;
-#define IDirectDrawClipper_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDrawClipper_METHODS
 ICOM_DEFINE(IDirectDrawClipper,IUnknown)
 #undef INTERFACE
 
@@ -1263,6 +1259,7 @@ ICOM_DEFINE(IDirectDrawClipper,IUnknown)
  */
 #define INTERFACE IDirectDraw
 #define IDirectDraw_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Compact)(THIS) PURE; \
     STDMETHOD(CreateClipper)(THIS_ DWORD dwFlags, LPDIRECTDRAWCLIPPER *lplpDDClipper, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(CreatePalette)(THIS_ DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE *lplpDDPalette, IUnknown *pUnkOuter) PURE; \
@@ -1283,9 +1280,6 @@ ICOM_DEFINE(IDirectDrawClipper,IUnknown)
     STDMETHOD(SetCooperativeLevel)(THIS_ HWND hWnd, DWORD dwFlags) PURE; \
     STDMETHOD(SetDisplayMode)(THIS_ DWORD dwWidth, DWORD dwHeight, DWORD dwBPP) PURE; \
     STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD dwFlags, HANDLE hEvent) PURE;
-#define IDirectDraw_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDraw_METHODS
 ICOM_DEFINE(IDirectDraw,IUnknown)
 #undef INTERFACE
 
@@ -1337,6 +1331,7 @@ ICOM_DEFINE(IDirectDraw,IUnknown)
  */
 #define INTERFACE IDirectDraw2
 #define IDirectDraw2_METHODS \
+/*00*/    IUnknown_METHODS \
 /*0c*/    STDMETHOD(Compact)(THIS) PURE; \
 /*10*/    STDMETHOD(CreateClipper)(THIS_ DWORD dwFlags, LPDIRECTDRAWCLIPPER *lplpDDClipper, IUnknown *pUnkOuter) PURE; \
 /*14*/    STDMETHOD(CreatePalette)(THIS_ DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE *lplpDDPalette, IUnknown *pUnkOuter) PURE; \
@@ -1359,9 +1354,6 @@ ICOM_DEFINE(IDirectDraw,IUnknown)
 /*58*/    STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD dwFlags, HANDLE hEvent) PURE; \
           /* added in v2 */ \
 /*5c*/    STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) PURE;
-#define IDirectDraw2_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDraw2_METHODS
 ICOM_DEFINE(IDirectDraw2,IUnknown)
 #undef INTERFACE
 
@@ -1401,6 +1393,7 @@ ICOM_DEFINE(IDirectDraw2,IUnknown)
  */
 #define INTERFACE IDirectDraw4
 #define IDirectDraw4_METHODS \
+/*00*/    IUnknown_METHODS \
 /*0c*/    STDMETHOD(Compact)(THIS) PURE; \
 /*10*/    STDMETHOD(CreateClipper)(THIS_ DWORD dwFlags, LPDIRECTDRAWCLIPPER *lplpDDClipper, IUnknown *pUnkOuter) PURE; \
 /*14*/    STDMETHOD(CreatePalette)(THIS_ DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE *lplpDDPalette, IUnknown *pUnkOuter) PURE; \
@@ -1428,9 +1421,6 @@ ICOM_DEFINE(IDirectDraw2,IUnknown)
 /*64*/    STDMETHOD(RestoreAllSurfaces)(THIS) PURE; \
 /*68*/    STDMETHOD(TestCooperativeLevel)(THIS) PURE; \
 /*6c*/    STDMETHOD(GetDeviceIdentifier)(THIS_ LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags) PURE;
-#define IDirectDraw4_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDraw4_METHODS
 ICOM_DEFINE(IDirectDraw4,IUnknown)
 #undef INTERFACE
 
@@ -1478,6 +1468,7 @@ ICOM_DEFINE(IDirectDraw4,IUnknown)
  */
 #define INTERFACE IDirectDraw7
 #define IDirectDraw7_METHODS \
+/*00*/    IUnknown_METHODS \
 /*0c*/    STDMETHOD(Compact)(THIS) PURE; \
 /*10*/    STDMETHOD(CreateClipper)(THIS_ DWORD dwFlags, LPDIRECTDRAWCLIPPER *lplpDDClipper, IUnknown *pUnkOuter) PURE; \
 /*14*/    STDMETHOD(CreatePalette)(THIS_ DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE *lplpDDPalette, IUnknown *pUnkOuter) PURE; \
@@ -1508,9 +1499,6 @@ ICOM_DEFINE(IDirectDraw4,IUnknown)
           /* added in v7 */ \
 /*70*/    STDMETHOD(StartModeTest)(THIS_ LPSIZE pModes, DWORD dwNumModes, DWORD dwFlags) PURE; \
 /*74*/    STDMETHOD(EvaluateMode)(THIS_ DWORD dwFlags, DWORD  *pTimeout) PURE;
-#define IDirectDraw7_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDraw7_METHODS
 ICOM_DEFINE(IDirectDraw7,IUnknown)
 #undef INTERFACE
 
@@ -1558,6 +1546,7 @@ ICOM_DEFINE(IDirectDraw7,IUnknown)
  */
 #define INTERFACE IDirectDrawSurface
 #define IDirectDrawSurface_METHODS \
+/*00*/    IUnknown_METHODS \
 /*0c*/    STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDSAttachedSurface) PURE; \
 /*10*/    STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE; \
 /*14*/    STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE; \
@@ -1591,9 +1580,6 @@ ICOM_DEFINE(IDirectDraw7,IUnknown)
 /*84*/    STDMETHOD(UpdateOverlay)(THIS_ LPRECT lpSrcRect, LPDIRECTDRAWSURFACE lpDDDestSurface, LPRECT lpDestRect, DWORD dwFlags, LPDDOVERLAYFX lpDDOverlayFx) PURE; \
 /*88*/    STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD dwFlags) PURE; \
 /*8c*/    STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE lpDDSReference) PURE;
-#define IDirectDrawSurface_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDrawSurface_METHODS
 ICOM_DEFINE(IDirectDrawSurface,IUnknown)
 #undef INTERFACE
 
@@ -1647,6 +1633,7 @@ ICOM_DEFINE(IDirectDrawSurface,IUnknown)
  */
 #define INTERFACE IDirectDrawSurface2
 #define IDirectDrawSurface2_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE2 lpDDSAttachedSurface) PURE; \
     STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE; \
     STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE2 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE; \
@@ -1684,9 +1671,6 @@ ICOM_DEFINE(IDirectDrawSurface,IUnknown)
     STDMETHOD(GetDDInterface)(THIS_ LPVOID *lplpDD) PURE; \
     STDMETHOD(PageLock)(THIS_ DWORD dwFlags) PURE; \
     STDMETHOD(PageUnlock)(THIS_ DWORD dwFlags) PURE;
-#define IDirectDrawSurface2_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDrawSurface2_METHODS
 ICOM_DEFINE(IDirectDrawSurface2,IUnknown)
 #undef INTERFACE
 
@@ -1744,6 +1728,7 @@ ICOM_DEFINE(IDirectDrawSurface2,IUnknown)
  */
 #define INTERFACE IDirectDrawSurface3
 #define IDirectDrawSurface3_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE3 lpDDSAttachedSurface) PURE; \
     STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE; \
     STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE3 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE; \
@@ -1783,9 +1768,6 @@ ICOM_DEFINE(IDirectDrawSurface2,IUnknown)
     STDMETHOD(PageUnlock)(THIS_ DWORD dwFlags) PURE; \
     /* added in v3 */ \
     STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC lpDDSD, DWORD dwFlags) PURE;
-#define IDirectDrawSurface3_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDrawSurface3_METHODS
 ICOM_DEFINE(IDirectDrawSurface3,IUnknown)
 #undef INTERFACE
 
@@ -1844,6 +1826,7 @@ ICOM_DEFINE(IDirectDrawSurface3,IUnknown)
  */
 #define INTERFACE IDirectDrawSurface4
 #define IDirectDrawSurface4_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE4 lpDDSAttachedSurface) PURE; \
     STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE; \
     STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE4 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE; \
@@ -1889,9 +1872,6 @@ ICOM_DEFINE(IDirectDrawSurface3,IUnknown)
     STDMETHOD(FreePrivateData)(THIS_ REFGUID tag) PURE; \
     STDMETHOD(GetUniquenessValue)(THIS_ LPDWORD pValue) PURE; \
     STDMETHOD(ChangeUniquenessValue)(THIS) PURE;
-#define IDirectDrawSurface4_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDrawSurface4_METHODS
 ICOM_DEFINE(IDirectDrawSurface4,IUnknown)
 #undef INTERFACE
 
@@ -1954,6 +1934,7 @@ ICOM_DEFINE(IDirectDrawSurface4,IUnknown)
  */
 #define INTERFACE IDirectDrawSurface7
 #define IDirectDrawSurface7_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE7 lpDDSAttachedSurface) PURE; \
     STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE; \
     STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE7 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE; \
@@ -2004,9 +1985,6 @@ ICOM_DEFINE(IDirectDrawSurface4,IUnknown)
     STDMETHOD(GetPriority)(THIS_ LPDWORD prio) PURE; \
     STDMETHOD(SetLOD)(THIS_ DWORD lod) PURE; \
     STDMETHOD(GetLOD)(THIS_ LPDWORD lod) PURE;
-#define IDirectDrawSurface7_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDrawSurface7_METHODS
 ICOM_DEFINE(IDirectDrawSurface7,IUnknown)
 #undef INTERFACE
 
@@ -2073,11 +2051,9 @@ ICOM_DEFINE(IDirectDrawSurface7,IUnknown)
  */
 #define INTERFACE IDirectDrawColorControl
 #define IDirectDrawColorControl_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetColorControls)(THIS_ LPDDCOLORCONTROL lpColorControl) PURE; \
     STDMETHOD(SetColorControls)(THIS_ LPDDCOLORCONTROL lpColorControl) PURE;
-#define IDirectDrawColorControl_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDrawColorControl_METHODS
 ICOM_DEFINE(IDirectDrawColorControl,IUnknown)
 #undef INTERFACE
 
@@ -2096,11 +2072,9 @@ ICOM_DEFINE(IDirectDrawColorControl,IUnknown)
  */
 #define INTERFACE IDirectDrawGammaControl
 #define IDirectDrawGammaControl_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetGammaRamp)(THIS_ DWORD dwFlags, LPDDGAMMARAMP lpGammaRamp) PURE; \
     STDMETHOD(SetGammaRamp)(THIS_ DWORD dwFlags, LPDDGAMMARAMP lpGammaRamp) PURE;
-#define IDirectDrawGammaControl_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectDrawGammaControl_METHODS
 ICOM_DEFINE(IDirectDrawGammaControl,IUnknown)
 #undef INTERFACE
 
diff --git a/include/dinput.h b/include/dinput.h
index 80692858fb..d93de95835 100644
--- a/include/dinput.h
+++ b/include/dinput.h
@@ -1050,6 +1050,7 @@ DECL_WINELIB_TYPE_AW(LPCDIDEVICEIMAGEINFOHEADER)
  */
 #define INTERFACE IDirectInputEffect
 #define IDirectInputEffect_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Initialize)(THIS_ HINSTANCE, DWORD, REFGUID) PURE; \
     STDMETHOD(GetEffectGuid)(THIS_ LPGUID) PURE; \
     STDMETHOD(GetParameters)(THIS_ LPDIEFFECT, DWORD) PURE; \
@@ -1060,9 +1061,6 @@ DECL_WINELIB_TYPE_AW(LPCDIDEVICEIMAGEINFOHEADER)
     STDMETHOD(Download)(THIS) PURE; \
     STDMETHOD(Unload)(THIS) PURE; \
     STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE;
-#define IDirectInputEffect_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectInputEffect_METHODS
 ICOM_DEFINE(IDirectInputEffect,IUnknown)
 #undef INTERFACE
 
@@ -1090,6 +1088,7 @@ ICOM_DEFINE(IDirectInputEffect,IUnknown)
  */
 #define INTERFACE IDirectInputDeviceA
 #define IDirectInputDeviceA_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; \
     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; \
     STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; \
@@ -1105,9 +1104,6 @@ ICOM_DEFINE(IDirectInputEffect,IUnknown)
     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA pdidi) PURE; \
     STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; \
     STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE;
-#define IDirectInputDeviceA_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectInputDeviceA_METHODS
 ICOM_DEFINE(IDirectInputDeviceA,IUnknown)
 #undef INTERFACE
 
@@ -1140,6 +1136,7 @@ ICOM_DEFINE(IDirectInputDeviceA,IUnknown)
  */
 #define INTERFACE IDirectInputDevice2A
 #define IDirectInputDevice2A_METHODS \
+    IDirectInputDeviceA_METHODS \
     STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE; \
     STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwEffType) PURE; \
     STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA pdei, REFGUID rguid) PURE; \
@@ -1149,9 +1146,6 @@ ICOM_DEFINE(IDirectInputDeviceA,IUnknown)
     STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE; \
     STDMETHOD(Poll)(THIS) PURE; \
     STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE;
-#define IDirectInputDevice2A_IMETHODS \
-    IDirectInputDeviceA_IMETHODS \
-    IDirectInputDevice2A_METHODS
 ICOM_DEFINE(IDirectInputDevice2A,IDirectInputDeviceA)
 #undef INTERFACE
 
@@ -1194,11 +1188,9 @@ ICOM_DEFINE(IDirectInputDevice2A,IDirectInputDeviceA)
  */
 #define INTERFACE IDirectInputDevice7A
 #define IDirectInputDevice7A_METHODS \
+    IDirectInputDevice2A_METHODS \
     STDMETHOD(EnumEffectsInFile)(THIS_ LPCSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE; \
     STDMETHOD(WriteEffectToFile)(THIS_ LPCSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE;
-#define IDirectInputDevice7A_IMETHODS \
-    IDirectInputDevice2A_IMETHODS \
-    IDirectInputDevice7A_METHODS
 ICOM_DEFINE(IDirectInputDevice7A,IDirectInputDevice2A)
 #undef INTERFACE
 
@@ -1246,12 +1238,10 @@ ICOM_DEFINE(IDirectInputDevice7A,IDirectInputDevice2A)
  */
 #define INTERFACE IDirectInputDevice8A
 #define IDirectInputDevice8A_METHODS \
+    IDirectInputDevice7A_METHODS \
     STDMETHOD(BuildActionMap)(THIS_ LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) PURE; \
     STDMETHOD(SetActionMap)(THIS_ LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) PURE; \
     STDMETHOD(GetImageInfo)(THIS_ LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader) PURE;
-#define IDirectInputDevice8A_IMETHODS \
-    IDirectInputDevice7A_IMETHODS \
-    IDirectInputDevice8A_METHODS
 ICOM_DEFINE(IDirectInputDevice8A,IDirectInputDevice7A)
 #undef INTERFACE
 
@@ -1338,14 +1328,12 @@ extern const DIDATAFORMAT c_dfDIJoystick2;
  */
 #define INTERFACE IDirectInputA
 #define IDirectInputA_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEA *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; \
     STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; \
     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; \
     STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; \
     STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE;
-#define IDirectInputA_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectInputA_METHODS
 ICOM_DEFINE(IDirectInputA,IUnknown)
 #undef INTERFACE
 
@@ -1367,10 +1355,8 @@ ICOM_DEFINE(IDirectInputA,IUnknown)
  */
 #define INTERFACE IDirectInput2A
 #define IDirectInput2A_METHODS \
+    IDirectInputA_METHODS \
     STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) PURE;
-#define IDirectInput2A_IMETHODS \
-    IDirectInputA_IMETHODS \
-    IDirectInput2A_METHODS
 ICOM_DEFINE(IDirectInput2A,IDirectInputA)
 #undef INTERFACE
 
@@ -1395,10 +1381,8 @@ ICOM_DEFINE(IDirectInput2A,IDirectInputA)
  */
 #define INTERFACE IDirectInput7A
 #define IDirectInput7A_METHODS \
+    IDirectInput2A_METHODS \
     STDMETHOD(CreateDeviceEx)(THIS_ REFGUID rguid, REFIID riid, LPVOID *pvOut, LPUNKNOWN lpUnknownOuter) PURE;
-#define IDirectInput7A_IMETHODS \
-    IDirectInput2A_IMETHODS \
-    IDirectInput7A_METHODS
 ICOM_DEFINE(IDirectInput7A,IDirectInput2A)
 #undef INTERFACE
 
@@ -1427,6 +1411,7 @@ ICOM_DEFINE(IDirectInput7A,IDirectInput2A)
  */
 #define INTERFACE IDirectInput8A
 #define IDirectInput8A_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICE8A *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; \
     STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; \
     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; \
@@ -1435,9 +1420,6 @@ ICOM_DEFINE(IDirectInput7A,IDirectInput2A)
     STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) PURE; \
     STDMETHOD(EnumDevicesBySemantics)(THIS_ LPCSTR ptszUserName, LPDIACTIONFORMATA lpdiActionFormat, LPDIENUMDEVICESBYSEMANTICSCBA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; \
     STDMETHOD(ConfigureDevices)(THIS_ LPDICONFIGUREDEVICESCALLBACK lpdiCallback, LPDICONFIGUREDEVICESPARAMSA lpdiCDParams, DWORD dwFlags, LPVOID pvRefData) PURE;
-#define IDirectInput8A_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectInput8A_METHODS
 ICOM_DEFINE(IDirectInput8A,IUnknown)
 #undef INTERFACE
 
diff --git a/include/dmplugin.h b/include/dmplugin.h
index a1564a889e..a0c38c6b9b 100644
--- a/include/dmplugin.h
+++ b/include/dmplugin.h
@@ -67,18 +67,13 @@ DEFINE_GUID(CLSID_DirectMusicWaveTrack,						0xeed36461,0x9ea5,0x11d3,0x9b,0xd1,
 #undef  INTERFACE
 #define INTERFACE IDirectMusicTool
 #define IDirectMusicTool_METHODS \
-    /*** IDirectMusicTool methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Init)(THIS_ IDirectMusicGraph *pGraph) PURE; \
     STDMETHOD(GetMsgDeliveryType)(THIS_ DWORD *pdwDeliveryType) PURE; \
     STDMETHOD(GetMediaTypeArraySize)(THIS_ DWORD *pdwNumElements) PURE; \
     STDMETHOD(GetMediaTypes)(THIS_ DWORD **padwMediaTypes, DWORD dwNumElements) PURE; \
     STDMETHOD(ProcessPMsg)(THIS_ IDirectMusicPerformance *pPerf, DMUS_PMSG *pPMSG) PURE; \
     STDMETHOD(Flush)(THIS_ IDirectMusicPerformance *pPerf, DMUS_PMSG *pPMSG, REFERENCE_TIME rtTime) PURE;
-
-	/*** IDirectMusicTool methods ***/
-#define IDirectMusicTool_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicTool_METHODS
 ICOM_DEFINE(IDirectMusicTool,IUnknown)
 #undef INTERFACE
 
@@ -103,14 +98,8 @@ ICOM_DEFINE(IDirectMusicTool,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicTool8
 #define IDirectMusicTool8_METHODS \
-    /*** IDirectMusicTool8 methods ***/ \
-    STDMETHOD(Clone)(THIS_ IDirectMusicTool **ppTool) PURE;
-
-	/*** IDirectMusicTool8 methods ***/
-#define IDirectMusicTool8_IMETHODS \
-    IUnknown_IMETHODS \
     IDirectMusicTool_METHODS \
-    IDirectMusicTool8_METHODS
+    STDMETHOD(Clone)(THIS_ IDirectMusicTool **ppTool) PURE;
 ICOM_DEFINE(IDirectMusicTool8,IDirectMusicTool)
 #undef INTERFACE
 
@@ -156,7 +145,7 @@ typedef enum enumDMUS_TRACKF_FLAGS
 #undef  INTERFACE
 #define INTERFACE IDirectMusicTrack
 #define IDirectMusicTrack_METHODS \
-    /*** IDirectMusicTrack methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Init)(THIS_ IDirectMusicSegment *pSegment) PURE; \
     STDMETHOD(InitPlay)(THIS_ IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance, void **ppStateData, DWORD dwVirtualTrackID, DWORD dwFlags) PURE; \
     STDMETHOD(EndPlay)(THIS_ void *pStateData) PURE; \
@@ -167,11 +156,6 @@ typedef enum enumDMUS_TRACKF_FLAGS
     STDMETHOD(AddNotificationType)(THIS_ REFGUID rguidNotificationType) PURE; \
     STDMETHOD(RemoveNotificationType)(THIS_ REFGUID rguidNotificationType) PURE; \
     STDMETHOD(Clone)(THIS_ MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack) PURE;
-
-	/*** IDirectMusicTrack methods ***/
-#define IDirectMusicTrack_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicTrack_METHODS
 ICOM_DEFINE(IDirectMusicTrack,IUnknown)
 #undef INTERFACE
 
@@ -200,19 +184,12 @@ ICOM_DEFINE(IDirectMusicTrack,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicTrack8
 #define IDirectMusicTrack8_METHODS \
-    /*** IDirectMusicTrack8 methods ***/ \
+    IDirectMusicTrack_METHODS \
     STDMETHOD(PlayEx)(THIS_ void *pStateData, REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags, IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID) PURE; \
     STDMETHOD(GetParamEx)(THIS_ REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *prtNext, void *pParam, void *pStateData, DWORD dwFlags) PURE; \
     STDMETHOD(SetParamEx)(THIS_ REFGUID rguidType, REFERENCE_TIME rtTime, void *pParam, void *pStateData, DWORD dwFlags) PURE; \
     STDMETHOD(Compose)(THIS_ IUnknown *pContext, DWORD dwTrackGroup, IDirectMusicTrack **ppResultTrack) PURE; \
     STDMETHOD(Join)(THIS_ IDirectMusicTrack *pNewTrack, MUSIC_TIME mtJoin, IUnknown *pContext, DWORD dwTrackGroup, IDirectMusicTrack **ppResultTrack) PURE;
-
-	/*** IDirectMusicTrack8 methods ***/
-#define IDirectMusicTrack8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicTrack_METHODS \
-    IDirectMusicTrack8_METHODS
-
 ICOM_DEFINE(IDirectMusicTrack8,IDirectMusicTrack)
 #undef INTERFACE
 
diff --git a/include/dmusicc.h b/include/dmusicc.h
index f731b9334e..c0008c2d34 100644
--- a/include/dmusicc.h
+++ b/include/dmusicc.h
@@ -288,7 +288,7 @@ typedef struct _DMUS_CLOCKINFO8
 #undef INTERFACE
 #define INTERFACE IDirectMusic
 #define IDirectMusic_METHODS \
-    /*** IDirectMusic methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(EnumPort)(THIS_ DWORD dwIndex, LPDMUS_PORTCAPS pPortCaps) PURE; \
     STDMETHOD(CreateMusicBuffer)(THIS_ LPDMUS_BUFFERDESC pBufferDesc, LPDIRECTMUSICBUFFER **ppBuffer, LPUNKNOWN pUnkOuter) PURE; \
     STDMETHOD(CreatePort)(THIS_ REFCLSID rclsidPort, LPDMUS_PORTPARAMS pPortParams, LPDIRECTMUSICPORT *ppPort, LPUNKNOWN pUnkOuter) PURE; \
@@ -298,11 +298,6 @@ typedef struct _DMUS_CLOCKINFO8
     STDMETHOD(Activate)(THIS_ BOOL fEnable) PURE; \
     STDMETHOD(GetDefaultPort)(THIS_ LPGUID pguidPort) PURE; \
     STDMETHOD(SetDirectSound)(THIS_ LPDIRECTSOUND pDirectSound, HWND hWnd) PURE;
-
-    /*** IDirectMusic methods ***/
-#define IDirectMusic_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusic_METHODS
 ICOM_DEFINE(IDirectMusic,IUnknown)
 #undef INTERFACE
 
@@ -330,14 +325,8 @@ ICOM_DEFINE(IDirectMusic,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusic8
 #define IDirectMusic8_METHODS \
-    /*** IDirectMusic8 methods ***/ \
-    STDMETHOD(SetExternalMasterClock)(THIS_ IReferenceClock *pClock) PURE;
-
-    /*** IDirectMusic8 methods ***/
-#define IDirectMusic8_IMETHODS \
-    IUnknown_IMETHODS \
     IDirectMusic_METHODS \
-	IDirectMusic8_METHODS
+    STDMETHOD(SetExternalMasterClock)(THIS_ IReferenceClock *pClock) PURE;
 ICOM_DEFINE(IDirectMusic8,IDirectMusic)
 #undef INTERFACE
 
@@ -367,7 +356,7 @@ ICOM_DEFINE(IDirectMusic8,IDirectMusic)
 #undef INTERFACE
 #define INTERFACE IDirectMusicBuffer
 #define IDirectMusicBuffer_METHODS \
-    /*** IDirectMusicBuffer methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Flush)(THIS) PURE; \
     STDMETHOD(TotalTime)(THIS_ LPREFERENCE_TIME prtTime) PURE; \
     STDMETHOD(PackStructured)(THIS_ REFERENCE_TIME rt, DWORD dwChannelGroup, DWORD dwChannelMessage) PURE; \
@@ -381,11 +370,6 @@ ICOM_DEFINE(IDirectMusic8,IDirectMusic)
     STDMETHOD(GetBufferFormat)(THIS_ LPGUID pGuidFormat) PURE; \
     STDMETHOD(SetStartTime)(THIS_ REFERENCE_TIME rt) PURE; \
     STDMETHOD(SetUsedBytes)(THIS_ DWORD cb) PURE;
-
-    /*** IDirectMusicBuffer methods ***/
-#define IDirectMusicBuffer_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicBuffer_METHODS
 ICOM_DEFINE(IDirectMusicBuffer,IUnknown)
 #undef INTERFACE
 
@@ -416,14 +400,9 @@ ICOM_DEFINE(IDirectMusicBuffer,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicInstrument
 #define IDirectMusicInstrument_METHODS \
-    /*** IDirectMusicInstrument methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetPatch)(THIS_ DWORD *pdwPatch) PURE; \
     STDMETHOD(SetPatch)(THIS_ DWORD dwPatch) PURE;
-
-    /*** IDirectMusicInstrument methods ***/
-#define IDirectMusicInstrument_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicInstrument_METHODS
 ICOM_DEFINE(IDirectMusicInstrument,IUnknown)
 #undef INTERFACE
 
@@ -444,13 +423,8 @@ ICOM_DEFINE(IDirectMusicInstrument,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicDownloadedInstrument
 #define IDirectMusicDownloadedInstrument_METHODS \
-    /*** IDirectMusicDownloadedInstrument methods ***/ \
-    /* none at this time */
-	
-	/*** IDirectMusicDownloadedInstrument methods ***/
-#define IDirectMusicDownloadedInstrument_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicDownloadedInstrument_METHODS
+    IUnknown_METHODS \
+    /* no IDirectMusicDownloadedInstrument methods at this time */
 ICOM_DEFINE(IDirectMusicDownloadedInstrument,IUnknown)
 #undef INTERFACE
 
@@ -470,14 +444,9 @@ ICOM_DEFINE(IDirectMusicDownloadedInstrument,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicCollection
 #define IDirectMusicCollection_METHODS \
-    /*** IDirectMusicCollection methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetInstrument)(THIS_ DWORD dwPatch, IDirectMusicInstrument **ppInstrument) PURE; \
     STDMETHOD(EnumInstrument)(THIS_ DWORD dwIndex, DWORD *pdwPatch, LPWSTR pwszName, DWORD dwNameLen) PURE;
-
-    /*** IDirectMusicCollection methods ***/
-#define IDirectMusicCollection_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicCollection_METHODS
 ICOM_DEFINE(IDirectMusicCollection,IUnknown)
 #undef INTERFACE
 
@@ -498,13 +467,8 @@ ICOM_DEFINE(IDirectMusicCollection,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicDownload
 #define IDirectMusicDownload_METHODS \
-    /*** IDirectMusicDownload methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetBuffer)(THIS_ void **ppvBuffer, DWORD *pdwSize) PURE;
-
-    /*** IDirectMusicDownload methods ***/
-#define IDirectMusicDownload_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicDownload_METHODS
 ICOM_DEFINE(IDirectMusicDownload,IUnknown)
 #undef INTERFACE
 
@@ -524,18 +488,13 @@ ICOM_DEFINE(IDirectMusicDownload,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicPortDownload
 #define IDirectMusicPortDownload_METHODS \
-    /*** IDirectMusicPortDownload methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetBuffer)(THIS_ DWORD dwDLId, IDirectMusicDownload **ppIDMDownload) PURE; \
     STDMETHOD(AllocateBuffer)(THIS_ DWORD dwSize, IDirectMusicDownload **ppIDMDownload) PURE; \
     STDMETHOD(GetDLId)(THIS_ DWORD *pdwStartDLId, DWORD dwCount) PURE; \
     STDMETHOD(GetAppend)(THIS_ DWORD *pdwAppend) PURE; \
     STDMETHOD(Download)(THIS_ IDirectMusicDownload *pIDMDownload) PURE; \
     STDMETHOD(Unload)(THIS_ IDirectMusicDownload *pIDMDownload) PURE;
-
-    /*** IDirectMusicPortDownload methods ***/
-#define IDirectMusicPortDownload_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicPortDownload_METHODS
 ICOM_DEFINE(IDirectMusicPortDownload,IUnknown)
 #undef INTERFACE
 
@@ -606,7 +565,7 @@ ICOM_DEFINE(IDirectMusicPortDownload,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicPort
 #define IDirectMusicPort_METHODS \
-    /*** IDirectMusicPort methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(PlayBuffer)(THIS_ LPDIRECTMUSICBUFFER pBuffer) PURE; \
     STDMETHOD(SetReadNotificationHandle)(THIS_ HANDLE hEvent) PURE; \
     STDMETHOD(Read)(THIS_ LPDIRECTMUSICBUFFER pBuffer) PURE; \
@@ -623,11 +582,6 @@ ICOM_DEFINE(IDirectMusicPortDownload,IUnknown)
     STDMETHOD(GetChannelPriority)(THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwPriority) PURE; \
     STDMETHOD(SetDirectSound)(THIS_ LPDIRECTSOUND pDirectSound, LPDIRECTSOUNDBUFFER pDirectSoundBuffer) PURE; \
     STDMETHOD(GetFormat)(THIS_ LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize, LPDWORD pdwBufferSize) PURE;
-
-/*** IDirectMusicPort methods ***/
-#define IDirectMusicPort_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicPort_METHODS
 ICOM_DEFINE(IDirectMusicPort,IUnknown)
 #undef INTERFACE
 
@@ -662,13 +616,8 @@ ICOM_DEFINE(IDirectMusicPort,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicThru
 #define IDirectMusicThru_METHODS \
-    /*** IDirectMusicThru methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(ThruChannel)(THIS_ DWORD dwSourceChannelGroup, DWORD dwSourceChannel, DWORD dwDestinationChannelGroup, DWORD dwDestinationChannel, LPDIRECTMUSICPORT pDestinationPort) PURE;
-
-/*** IDirectMusicThru methods ***/
-#define IDirectMusicThru_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicThru_METHODS
 ICOM_DEFINE(IDirectMusicThru,IUnknown)
 #undef INTERFACE
 
@@ -692,16 +641,11 @@ ICOM_DEFINE(IDirectMusicThru,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IReferenceClock
 #define IReferenceClock_METHODS \
-    /*** IReferenceClock methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetTime)(THIS_ REFERENCE_TIME *pTime) PURE; \
     STDMETHOD(AdviseTime)(THIS_ REFERENCE_TIME baseTime, REFERENCE_TIME streamTime, HANDLE hEvent, DWORD *pdwAdviseCookie) PURE; \
     STDMETHOD(AdvisePeriodic)(THIS_ REFERENCE_TIME startTime, REFERENCE_TIME periodTime, HANDLE hSemaphore, DWORD *pdwAdviseCookie) PURE; \
     STDMETHOD(Unadvise)(THIS_ DWORD dwAdviseCookie) PURE;
-
-    /*** IReferenceClock methods ***/
-#define IReferenceClock_IMETHODS \
-    IUnknown_IMETHODS \
-    IReferenceClock_METHODS
 ICOM_DEFINE(IReferenceClock,IUnknown)
 #undef INTERFACE
 
diff --git a/include/dmusici.h b/include/dmusici.h
index 9a0128fdd9..7e2ef155cf 100644
--- a/include/dmusici.h
+++ b/include/dmusici.h
@@ -797,15 +797,10 @@ typedef struct _DMUS_VARIATIONS_PARAM
 #undef INTERFACE
 #define INTERFACE IDirectMusicBand
 #define IDirectMusicBand_METHODS \
-    /*** IDirectMusicBand methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(CreateSegment)(THIS_ IDirectMusicSegment **ppSegment) PURE; \
     STDMETHOD(Download)(THIS_ IDirectMusicPerformance *pPerformance) PURE; \
     STDMETHOD(Unload)(THIS_ IDirectMusicPerformance *pPerformance) PURE;
-
-    /*** IDirectMusicBand methods ***/
-#define IDirectMusicBand_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicBand_METHODS
 ICOM_DEFINE(IDirectMusicBand,IUnknown)
 #undef INTERFACE
 
@@ -827,15 +822,10 @@ ICOM_DEFINE(IDirectMusicBand,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicObject
 #define IDirectMusicObject_METHODS \
-    /*** IDirectMusicObject methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetDescriptor)(THIS_ LPDMUS_OBJECTDESC pDesc) PURE; \
     STDMETHOD(SetDescriptor)(THIS_ LPDMUS_OBJECTDESC pDesc) PURE; \
     STDMETHOD(ParseDescriptor)(THIS_ LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc) PURE;
-
-    /*** IDirectMusicObject methods ***/
-#define IDirectMusicObject_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicObject_METHODS
 ICOM_DEFINE(IDirectMusicObject,IUnknown)
 #undef INTERFACE
 
@@ -857,7 +847,7 @@ ICOM_DEFINE(IDirectMusicObject,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicLoader
 #define IDirectMusicLoader_METHODS \
-    /*** IDirectMusicLoader methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(_GetObject)(THIS_ LPDMUS_OBJECTDESC pDesc, REFIID riid, LPVOID *ppv) PURE; \
     STDMETHOD(SetObject)(THIS_ LPDMUS_OBJECTDESC pDesc) PURE; \
     STDMETHOD(SetSearchDirectory)(THIS_ REFGUID rguidClass, WCHAR *pwzPath, BOOL fClear) PURE; \
@@ -867,11 +857,6 @@ ICOM_DEFINE(IDirectMusicObject,IUnknown)
     STDMETHOD(ClearCache)(THIS_ REFGUID rguidClass) PURE; \
     STDMETHOD(EnableCache)(THIS_ REFGUID rguidClass, BOOL fEnable) PURE; \
     STDMETHOD(EnumObject)(THIS_ REFGUID rguidClass, DWORD dwIndex, LPDMUS_OBJECTDESC pDesc) PURE;
-
-    /*** IDirectMusicLoader methods ***/
-#define IDirectMusicLoader_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicLoader_METHODS
 ICOM_DEFINE(IDirectMusicLoader,IUnknown)
 #undef INTERFACE
 
@@ -899,16 +884,10 @@ ICOM_DEFINE(IDirectMusicLoader,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicLoader8
 #define IDirectMusicLoader8_METHODS \
-    /*** IDirectMusicLoader8 methods ***/ \
+    IDirectMusicLoader_METHODS \
     STDMETHOD_(void,CollectGarbage)(THIS) PURE; \
     STDMETHOD(ReleaseObjectByUnknown)(THIS_ IUnknown *pObject) PURE; \
     STDMETHOD(LoadObjectFromFile)(THIS_ REFGUID rguidClassID, REFIID iidInterfaceID, WCHAR *pwzFilePath, void **ppObject) PURE;
-
-    /*** IDirectMusicLoader8 methods ***/
-#define IDirectMusicLoader8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicLoader_METHODS \
-	IDirectMusicLoader8_METHODS
 ICOM_DEFINE(IDirectMusicLoader8,IDirectMusicLoader)
 #undef INTERFACE
 
@@ -940,13 +919,8 @@ ICOM_DEFINE(IDirectMusicLoader8,IDirectMusicLoader)
 #undef INTERFACE
 #define INTERFACE IDirectMusicGetLoader
 #define IDirectMusicGetLoader_METHODS \
-    /*** IDirectMusicGetLoader methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetLoader)(THIS_ IDirectMusicLoader **ppLoader) PURE;
-
-    /*** IDirectMusicGetLoader methods ***/
-#define IDirectMusicGetLoader_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicGetLoader_METHODS
 ICOM_DEFINE(IDirectMusicGetLoader,IUnknown)
 #undef INTERFACE
 
@@ -966,7 +940,7 @@ ICOM_DEFINE(IDirectMusicGetLoader,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicSegment
 #define IDirectMusicSegment_METHODS \
-    /*** IDirectMusicSegment methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetLength)(THIS_ MUSIC_TIME *pmtLength) PURE; \
     STDMETHOD(SetLength)(THIS_ MUSIC_TIME mtLength) PURE; \
     STDMETHOD(GetRepeats)(THIS_ DWORD *pdwRepeats) PURE; \
@@ -990,11 +964,6 @@ ICOM_DEFINE(IDirectMusicGetLoader,IUnknown)
     STDMETHOD(SetLoopPoints)(THIS_ MUSIC_TIME mtStart, MUSIC_TIME mtEnd) PURE; \
     STDMETHOD(GetLoopPoints)(THIS_ MUSIC_TIME *pmtStart, MUSIC_TIME *pmtEnd) PURE; \
     STDMETHOD(SetPChannelsUsed)(THIS_ DWORD dwNumPChannels, DWORD *paPChannels) PURE;
-
-    /*** IDirectMusicSegment methods ***/
-#define IDirectMusicSegment_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicSegment_METHODS
 ICOM_DEFINE(IDirectMusicSegment,IUnknown)
 #undef INTERFACE
 
@@ -1036,18 +1005,12 @@ ICOM_DEFINE(IDirectMusicSegment,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicSegment8
 #define IDirectMusicSegment8_METHODS \
-    /*** IDirectMusicSegment8 methods ***/ \
+    IDirectMusicSegment_METHODS \
     STDMETHOD(SetTrackConfig)(THIS_ REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff) PURE; \
     STDMETHOD(GetAudioPathConfig)(THIS_ IUnknown **ppAudioPathConfig) PURE; \
     STDMETHOD(Compose)(THIS_ MUSIC_TIME mtTime, IDirectMusicSegment *pFromSegment, IDirectMusicSegment *pToSegment, IDirectMusicSegment **ppComposedSegment) PURE; \
     STDMETHOD(Download)(THIS_ IUnknown *pAudioPath) PURE; \
     STDMETHOD(Unload)(THIS_ IUnknown *pAudioPath) PURE;
-
-    /*** IDirectMusicSegment8 methods ***/
-#define IDirectMusicSegment8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicSegment_METHODS \
-	IDirectMusicSegment8_METHODS
 ICOM_DEFINE(IDirectMusicSegment8,IDirectMusicSegment)
 #undef INTERFACE
 
@@ -1095,17 +1058,12 @@ ICOM_DEFINE(IDirectMusicSegment8,IDirectMusicSegment)
 #undef INTERFACE
 #define INTERFACE IDirectMusicSegmentState
 #define IDirectMusicSegmentState_METHODS \
-    /*** IDirectMusicSegmentState methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetRepeats)(THIS_ DWORD *pdwRepeats) PURE; \
     STDMETHOD(GetSegment)(THIS_ IDirectMusicSegment **ppSegment) PURE; \
     STDMETHOD(GetStartTime)(THIS_ MUSIC_TIME *pmtStart) PURE; \
     STDMETHOD(GetSeek)(THIS_ MUSIC_TIME *pmtSeek) PURE; \
     STDMETHOD(GetStartPoint)(THIS_ MUSIC_TIME *pmtStart) PURE;
-
-    /*** IDirectMusicSegmentState methods ***/
-#define IDirectMusicSegmentState_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicSegmentState_METHODS
 ICOM_DEFINE(IDirectMusicSegmentState,IUnknown)
 #undef INTERFACE
 
@@ -1129,15 +1087,9 @@ ICOM_DEFINE(IDirectMusicSegmentState,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicSegmentState8
 #define IDirectMusicSegmentState8_METHODS \
-    /*** IDirectMusicSegmentState8 methods ***/ \
+    IDirectMusicSegmentState_METHODS \
     STDMETHOD(SetTrackConfig)(THIS_ REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff) PURE; \
     STDMETHOD(GetObjectInPath)(THIS_ DWORD dwPChannel, DWORD dwStage, DWORD dwBuffer, REFGUID guidObject, DWORD dwIndex, REFGUID iidInterface, void **ppObject) PURE;
-
-    /*** IDirectMusicSegmentState8 methods ***/
-#define IDirectMusicSegmentState8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicSegmentState_METHODS \
-    IDirectMusicSegmentState8_METHODS
 ICOM_DEFINE(IDirectMusicSegmentState8,IDirectMusicSegmentState)
 #undef INTERFACE
 
@@ -1164,16 +1116,11 @@ ICOM_DEFINE(IDirectMusicSegmentState8,IDirectMusicSegmentState)
 #undef INTERFACE
 #define INTERFACE IDirectMusicAudioPath
 #define IDirectMusicAudioPath_METHODS \
-    /*** IDirectMusicAudioPath methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetObjectInPath)(THIS_ DWORD dwPChannel, DWORD dwStage, DWORD dwBuffer, REFGUID guidObject, WORD dwIndex, REFGUID iidInterface, void **ppObject) PURE; \
     STDMETHOD(Activate)(THIS_ BOOL fActivate) PURE; \
     STDMETHOD(SetVolume)(THIS_ long lVolume, DWORD dwDuration) PURE; \
     STDMETHOD(ConvertPChannel)(THIS_ DWORD dwPChannelIn, DWORD *pdwPChannelOut) PURE;
-
-    /*** IDirectMusicAudioPath methods ***/
-#define IDirectMusicAudioPath_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicAudioPath_METHODS
 ICOM_DEFINE(IDirectMusicAudioPath,IUnknown)
 #undef INTERFACE
 
@@ -1196,7 +1143,7 @@ ICOM_DEFINE(IDirectMusicAudioPath,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicPerformance
 #define IDirectMusicPerformance_METHODS \
-    /*** IDirectMusicPerformance methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Init)(THIS_ IDirectMusic **ppDirectMusic, LPDIRECTSOUND pDirectSound, HWND hWnd) PURE; \
     STDMETHOD(PlaySegment)(THIS_ IDirectMusicSegment *pSegment, DWORD dwFlags, __int64 i64StartTime, IDirectMusicSegmentState **ppSegmentState) PURE; \
     STDMETHOD(Stop)(THIS_ IDirectMusicSegment *pSegment, IDirectMusicSegmentState *pSegmentState, MUSIC_TIME mtTime, DWORD dwFlags) PURE; \
@@ -1238,11 +1185,6 @@ ICOM_DEFINE(IDirectMusicAudioPath,IUnknown)
     STDMETHOD(MusicToMIDI)(THIS_ WORD wMusicValue, DMUS_CHORD_KEY *pChord, BYTE bPlayMode, BYTE bChordLevel, BYTE *pbMIDIValue) PURE; \
     STDMETHOD(TimeToRhythm)(THIS_ MUSIC_TIME mtTime, DMUS_TIMESIGNATURE *pTimeSig, WORD *pwMeasure, BYTE *pbBeat, BYTE *pbGrid, short *pnOffset) PURE; \
     STDMETHOD(RhythmToTime)(THIS_ WORD wMeasure, BYTE bBeat, BYTE bGrid, short nOffset, DMUS_TIMESIGNATURE *pTimeSig, MUSIC_TIME *pmtTime) PURE;
-
-    /*** IDirectMusicPerformance methods ***/
-#define IDirectMusicPerformance_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicPerformance_METHODS
 ICOM_DEFINE(IDirectMusicPerformance,IUnknown)
 #undef INTERFACE
 
@@ -1302,7 +1244,7 @@ ICOM_DEFINE(IDirectMusicPerformance,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicPerformance8
 #define IDirectMusicPerformance8_METHODS \
-    /*** IDirectMusicPerformance8 methods ***/ \
+    IDirectMusicPerformance_METHODS \
     STDMETHOD(InitAudio)(THIS_ IDirectMusic **ppDirectMusic, IDirectSound **ppDirectSound, HWND hWnd, DWORD dwDefaultPathType, DWORD dwPChannelCount, DWORD dwFlags, DMUS_AUDIOPARAMS *pParams) PURE; \
     STDMETHOD(PlaySegmentEx)(THIS_ IUnknown *pSource, WCHAR *pwzSegmentName, IUnknown *pTransition, DWORD dwFlags, __int64 i64StartTime, IDirectMusicSegmentState **ppSegmentState, IUnknown *pFrom, IUnknown *pAudioPath) PURE; \
     STDMETHOD(StopEx)(THIS_ IUnknown *pObjectToStop, __int64 i64StopTime, DWORD dwFlags) PURE; \
@@ -1312,12 +1254,6 @@ ICOM_DEFINE(IDirectMusicPerformance,IUnknown)
     STDMETHOD(SetDefaultAudioPath)(THIS_ IDirectMusicAudioPath *pAudioPath) PURE; \
     STDMETHOD(GetDefaultAudioPath)(THIS_ IDirectMusicAudioPath **ppAudioPath) PURE; \
     STDMETHOD(GetParamEx)(THIS_ REFGUID rguidType, DWORD dwTrackID, DWORD dwGroupBits, DWORD dwIndex, MUSIC_TIME mtTime, MUSIC_TIME *pmtNext, void *pParam) PURE;
-
-    /*** IDirectMusicPerformance8 methods ***/
-#define IDirectMusicPerformance8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicPerformance_METHODS \
-    IDirectMusicPerformance8_METHODS
 ICOM_DEFINE(IDirectMusicPerformance8,IDirectMusicPerformance)
 #undef INTERFACE
 
@@ -1387,16 +1323,11 @@ ICOM_DEFINE(IDirectMusicPerformance8,IDirectMusicPerformance)
 #undef INTERFACE
 #define INTERFACE IDirectMusicGraph
 #define IDirectMusicGraph_METHODS \
-    /*** IDirectMusicGraph methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(StampPMsg)(THIS_ DMUS_PMSG *pPMSG) PURE; \
     STDMETHOD(InsertTool)(THIS_ IDirectMusicTool *pTool, DWORD *pdwPChannels, DWORD cPChannels, LONG lIndex) PURE; \
     STDMETHOD(GetTool)(THIS_ DWORD dwIndex, IDirectMusicTool **ppTool) PURE; \
     STDMETHOD(RemoveTool)(THIS_ IDirectMusicTool *pTool) PURE;
-
-    /*** IDirectMusicGraph methods ***/
-#define IDirectMusicGraph_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicGraph_METHODS
 ICOM_DEFINE(IDirectMusicGraph,IUnknown)
 #undef INTERFACE
 
@@ -1419,7 +1350,7 @@ ICOM_DEFINE(IDirectMusicGraph,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicStyle
 #define IDirectMusicStyle_METHODS \
-    /*** IDirectMusicStyle methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetBand)(THIS_ WCHAR *pwszName, IDirectMusicBand **ppBand) PURE; \
     STDMETHOD(EnumBand)(THIS_ DWORD dwIndex, WCHAR *pwszName) PURE; \
     STDMETHOD(GetDefaultBand)(THIS_ IDirectMusicBand **ppBand) PURE; \
@@ -1431,11 +1362,6 @@ ICOM_DEFINE(IDirectMusicGraph,IUnknown)
     STDMETHOD(GetTimeSignature)(THIS_ DMUS_TIMESIGNATURE *pTimeSig) PURE; \
     STDMETHOD(GetEmbellishmentLength)(THIS_ DWORD dwType, DWORD dwLevel, DWORD *pdwMin, DWORD *pdwMax) PURE; \
     STDMETHOD(GetTempo)(THIS_ double *pTempo) PURE;
-
-    /*** IDirectMusicStyle methods ***/
-#define IDirectMusicStyle_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicStyle_METHODS
 ICOM_DEFINE(IDirectMusicStyle,IUnknown)
 #undef INTERFACE
 
@@ -1465,14 +1391,8 @@ ICOM_DEFINE(IDirectMusicStyle,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicStyle8
 #define IDirectMusicStyle8_METHODS \
-    /*** IDirectMusicStyle8 methods ***/ \
-    STDMETHOD(EnumPattern)(THIS_ DWORD dwIndex, DWORD dwPatternType, WCHAR *pwszName) PURE;
-
-    /*** IDirectMusicStyle8 methods ***/
-#define IDirectMusicStyle8_IMETHODS \
-    IUnknown_IMETHODS \
     IDirectMusicStyle_METHODS \
-    IDirectMusicStyle8_METHODS
+    STDMETHOD(EnumPattern)(THIS_ DWORD dwIndex, DWORD dwPatternType, WCHAR *pwszName) PURE;
 ICOM_DEFINE(IDirectMusicStyle8,IDirectMusicStyle)
 #undef INTERFACE
 
@@ -1504,13 +1424,8 @@ ICOM_DEFINE(IDirectMusicStyle8,IDirectMusicStyle)
 #undef INTERFACE
 #define INTERFACE IDirectMusicChordMap
 #define IDirectMusicChordMap_METHODS \
-    /*** IDirectMusicChordMap methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(GetScale)(THIS_ DWORD *pdwScale) PURE;
-
-    /*** IDirectMusicChordMap methods ***/
-#define IDirectMusicChordMap_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicChordMap_METHODS
 ICOM_DEFINE(IDirectMusicChordMap,IUnknown)
 #undef INTERFACE
 
@@ -1530,18 +1445,13 @@ ICOM_DEFINE(IDirectMusicChordMap,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicComposer
 #define IDirectMusicComposer_METHODS \
-    /*** IDirectMusicComposer methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(ComposeSegmentFromTemplate)(THIS_ IDirectMusicStyle *pStyle, IDirectMusicSegment *pTemplate, WORD wActivity, IDirectMusicChordMap *pChordMap, IDirectMusicSegment **ppSegment) PURE; \
     STDMETHOD(ComposeSegmentFromShape)(THIS_ IDirectMusicStyle *pStyle, WORD wNumMeasures, WORD wShape, WORD wActivity, BOOL fIntro, BOOL fEnd, IDirectMusicChordMap *pChordMap, IDirectMusicSegment **ppSegment) PURE; \
     STDMETHOD(ComposeTransition)(THIS_ IDirectMusicSegment *pFromSeg, IDirectMusicSegment *pToSeg, MUSIC_TIME mtTime, WORD wCommand, DWORD dwFlags, IDirectMusicChordMap *pChordMap, IDirectMusicSegment **ppTransSeg) PURE; \
     STDMETHOD(AutoTransition)(THIS_ IDirectMusicPerformance *pPerformance, IDirectMusicSegment *pToSeg, WORD wCommand, DWORD dwFlags, IDirectMusicChordMap *pChordMap, IDirectMusicSegment **ppTransSeg, IDirectMusicSegmentState **ppToSegState, IDirectMusicSegmentState **ppTransSegState) PURE; \
     STDMETHOD(ComposeTemplateFromShape)(THIS_ WORD wNumMeasures, WORD wShape, BOOL fIntro, BOOL fEnd, WORD wEndLength, IDirectMusicSegment **ppTemplate) PURE; \
     STDMETHOD(ChangeChordMap)(THIS_ IDirectMusicSegment *pSegment, BOOL fTrackScale, IDirectMusicChordMap *pChordMap) PURE;
-
-    /*** IDirectMusicComposer methods ***/
-#define IDirectMusicComposer_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicComposer_METHODS
 ICOM_DEFINE(IDirectMusicComposer,IUnknown)
 #undef INTERFACE
 
@@ -1566,15 +1476,10 @@ ICOM_DEFINE(IDirectMusicComposer,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicPatternTrack
 #define IDirectMusicPatternTrack_METHODS \
-    /*** IDirectMusicPatternTrack methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(CreateSegment)(THIS_ IDirectMusicStyle *pStyle, IDirectMusicSegment **ppSegment) PURE; \
     STDMETHOD(SetVariation)(THIS_ IDirectMusicSegmentState *pSegState, DWORD dwVariationFlags, DWORD dwPart) PURE; \
     STDMETHOD(SetPatternByName)(THIS_ IDirectMusicSegmentState *pSegState, WCHAR *wszName, IDirectMusicStyle *pStyle, DWORD dwPatternType, DWORD *pdwLength) PURE;
-
-    /*** IDirectMusicPatternTrack methods ***/
-#define IDirectMusicPatternTrack_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicPatternTrack_METHODS
 ICOM_DEFINE(IDirectMusicPatternTrack,IUnknown)
 #undef INTERFACE
 
@@ -1596,7 +1501,7 @@ ICOM_DEFINE(IDirectMusicPatternTrack,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicScript
 #define IDirectMusicScript_METHODS \
-    /*** IDirectMusicScript methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Init)(THIS_ IDirectMusicPerformance *pPerformance, DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; \
     STDMETHOD(CallRoutine)(THIS_ WCHAR *pwszRoutineName, DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; \
     STDMETHOD(SetVariableVariant)(THIS_ WCHAR *pwszVariableName, VARIANT varValue, BOOL fSetRef, DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; \
@@ -1607,11 +1512,6 @@ ICOM_DEFINE(IDirectMusicPatternTrack,IUnknown)
     STDMETHOD(GetVariableObject)(THIS_ WCHAR *pwszVariableName, REFIID riid, LPVOID *ppv, DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; \
     STDMETHOD(EnumRoutine)(THIS_ DWORD dwIndex, WCHAR *pwszName) PURE; \
     STDMETHOD(EnumVariable)(THIS_ DWORD dwIndex, WCHAR *pwszName) PURE;
-
-    /*** IDirectMusicScript methods ***/
-#define IDirectMusicScript_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicScript_METHODS
 ICOM_DEFINE(IDirectMusicScript,IUnknown)
 #undef INTERFACE
 
@@ -1640,13 +1540,8 @@ ICOM_DEFINE(IDirectMusicScript,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicContainer
 #define IDirectMusicContainer_METHODS \
-    /*** IDirectMusicContainer methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(EnumObject)(THIS_ REFGUID rguidClass, DWORD dwIndex, LPDMUS_OBJECTDESC pDesc, WCHAR *pwszAlias) PURE;
-
-    /*** IDirectMusicContainer methods ***/
-#define IDirectMusicContainer_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicContainer_METHODS
 ICOM_DEFINE(IDirectMusicContainer,IUnknown)
 #undef INTERFACE
 
@@ -1666,7 +1561,7 @@ ICOM_DEFINE(IDirectMusicContainer,IUnknown)
 #undef INTERFACE
 #define INTERFACE IDirectMusicSong
 #define IDirectMusicSong_METHODS \
-    /*** IDirectMusicSong methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Compose)(THIS) PURE; \
     STDMETHOD(GetParam)(THIS_ REFGUID rguidType, DWORD dwGroupBits, DWORD dwIndex, MUSIC_TIME mtTime, MUSIC_TIME *pmtNext, void *pParam) PURE; \
     STDMETHOD(GetSegment)(THIS_ WCHAR *pwzName, IDirectMusicSegment **ppSegment) PURE; \
@@ -1674,11 +1569,6 @@ ICOM_DEFINE(IDirectMusicContainer,IUnknown)
     STDMETHOD(Download)(THIS_ IUnknown *pAudioPath) PURE; \
     STDMETHOD(Unload)(THIS_ IUnknown *pAudioPath) PURE; \
     STDMETHOD(EnumSegment)(THIS_ DWORD dwIndex, IDirectMusicSegment **ppSegment) PURE;
-
-    /*** IDirectMusicSong methods ***/
-#define IDirectMusicSong_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicSong_METHODS
 ICOM_DEFINE(IDirectMusicSong,IUnknown)
 #undef INTERFACE
 
diff --git a/include/dmusics.h b/include/dmusics.h
index c6e2da6f08..5192ee81cd 100644
--- a/include/dmusics.h
+++ b/include/dmusics.h
@@ -66,7 +66,7 @@ typedef struct _DMUS_VOICE_STATE
 #undef  INTERFACE
 #define INTERFACE IDirectMusicSynth
 #define IDirectMusicSynth_METHODS \
-    /*** IDirectMusicSynth methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Open)(THIS_ LPDMUS_PORTPARAMS pPortParams) PURE; \
     STDMETHOD(Close)(THIS) PURE; \
     STDMETHOD(SetNumChannelGroups)(THIS_ DWORD dwGroups) PURE; \
@@ -84,11 +84,6 @@ typedef struct _DMUS_VOICE_STATE
     STDMETHOD(GetChannelPriority)(THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwPriority) PURE; \
     STDMETHOD(GetFormat)(THIS_ LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSiz) PURE; \
     STDMETHOD(GetAppend)(THIS_ DWORD *pdwAppend) PURE;
-
-/*** IDirectMusicSynth methods ***/
-#define IDirectMusicSynth_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicSynth_METHODS
 ICOM_DEFINE(IDirectMusicSynth,IUnknown)
 #undef INTERFACE
 
@@ -124,18 +119,12 @@ ICOM_DEFINE(IDirectMusicSynth,IUnknown)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicSynth8
 #define IDirectMusicSynth8_METHODS \
-    /*** IDirectMusicSynth8 methods ***/ \
+    IDirectMusicSynth_METHODS \
     STDMETHOD(PlayVoice)(THIS_ REFERENCE_TIME rt, DWORD dwVoiceId, DWORD dwChannelGroup, DWORD dwChannel, DWORD dwDLId, long prPitch, long vrVolume, SAMPLE_TIME stVoiceStart, SAMPLE_TIME stLoopStart, SAMPLE_TIME stLoopEnd) PURE; \
     STDMETHOD(StopVoice)(THIS_ REFERENCE_TIME rt, DWORD dwVoiceId) PURE; \
     STDMETHOD(GetVoiceState)(THIS_ DWORD dwVoice[], DWORD cbVoice, DMUS_VOICE_STATE dwVoiceState[]) PURE; \
     STDMETHOD(Refresh)(THIS_ DWORD dwDownloadID, DWORD dwFlags) PURE; \
     STDMETHOD(AssignChannelToBuses)(THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwBuses, DWORD cBuses) PURE;
-
-/*** IDirectMusicSynth methods ***/
-#define IDirectMusicSynth8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicSynth_METHODS \
-    IDirectMusicSynth8_METHODS
 ICOM_DEFINE(IDirectMusicSynth8,IDirectMusicSynth)
 #undef INTERFACE
 
@@ -177,7 +166,7 @@ ICOM_DEFINE(IDirectMusicSynth8,IDirectMusicSynth)
 #undef  INTERFACE
 #define INTERFACE IDirectMusicSynthSink
 #define IDirectMusicSynthSink_METHODS \
-    /*** IDirectMusicSynthSink methods ***/ \
+    IUnknown_METHODS \
     STDMETHOD(Init)(THIS_ IDirectMusicSynth *pSynth) PURE; \
     STDMETHOD(SetMasterClock)(THIS_ IReferenceClock *pClock) PURE; \
     STDMETHOD(GetLatencyClock)(THIS_ IReferenceClock **ppClock) PURE; \
@@ -186,11 +175,6 @@ ICOM_DEFINE(IDirectMusicSynth8,IDirectMusicSynth)
     STDMETHOD(RefTimeToSample)(THIS_ REFERENCE_TIME rfTime, LONGLONG *pllSampleTime) PURE; \
     STDMETHOD(SetDirectSound)(THIS_ LPDIRECTSOUND pDirectSound, LPDIRECTSOUNDBUFFER pDirectSoundBuffer) PURE; \
     STDMETHOD(GetDesiredBufferSize)(THIS_ LPDWORD pdwBufferSizeInSamples) PURE;
-
-/*** IDirectMusicSynthSink methods ***/
-#define IDirectMusicSynthSink_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectMusicSynthSink_METHODS
 ICOM_DEFINE(IDirectMusicSynthSink,IUnknown)
 #undef INTERFACE
 
diff --git a/include/docobj.h b/include/docobj.h
index 7de03ae4f3..ac856b38c3 100644
--- a/include/docobj.h
+++ b/include/docobj.h
@@ -195,12 +195,10 @@ typedef struct IPrint IPrint, *LPPRINT;
  */
 #define INTERFACE IOleDocument
 #define IOleDocument_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(CreateView)(THIS_ IOleInPlaceSite *pIPSite, IStream *pstm, DWORD dwReserved, IOleDocumentView **ppView) PURE; \
 	STDMETHOD(GetDocMiscStatus)(THIS_ DWORD *pdwStatus) PURE; \
 	STDMETHOD(EnumViews)(THIS_ IEnumOleDocumentViews **ppEnum, IOleDocumentView **ppView) PURE;
-#define IOleDocument_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleDocument_METHODS
 ICOM_DEFINE(IOleDocument,IUnknown)
 #undef INTERFACE
 
@@ -221,10 +219,8 @@ ICOM_DEFINE(IOleDocument,IUnknown)
  */
 #define INTERFACE IOleDocumentSite
 #define IOleDocumentSite_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(ActivateMe)(THIS_ IOleDocumentView *pViewToActivate) PURE;
-#define IOleDocumentSite_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleDocumentSite_METHODS
 ICOM_DEFINE(IOleDocumentSite,IUnknown)
 #undef INTERFACE
 
@@ -243,6 +239,7 @@ ICOM_DEFINE(IOleDocumentSite,IUnknown)
  */
 #define INTERFACE IOleDocumentView
 #define IOleDocumentView_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(SetInPlaceSite)(THIS_ IOleInPlaceSite *pIPSite) PURE; \
 	STDMETHOD(GetInPlaceSite)(THIS_ IOleInPlaceSite **ppIPSite) PURE; \
 	STDMETHOD(GetDocument)(THIS_ IUnknown **ppunk) PURE; \
@@ -256,9 +253,6 @@ ICOM_DEFINE(IOleDocumentSite,IUnknown)
 	STDMETHOD(SaveViewState)(THIS_ LPSTREAM pstm) PURE; \
 	STDMETHOD(ApplyViewState)(THIS_ LPSTREAM pstm) PURE; \
 	STDMETHOD(Clone)(THIS_ IOleInPlaceSite *pIPSiteNew, IOleDocumentView **ppViewNew) PURE;
-#define IOleDocumentView_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleDocumentView_METHODS
 ICOM_DEFINE(IOleDocumentView,IUnknown)
 #undef INTERFACE
 
@@ -289,13 +283,11 @@ ICOM_DEFINE(IOleDocumentView,IUnknown)
  */
 #define INTERFACE IEnumOleDocumentViews
 #define IEnumOleDocumentViews_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Next)(THIS_ ULONG cViews, IOleDocumentView **rgpView, ULONG *pcFetched) PURE; \
 	STDMETHOD(Skip)(THIS_ ULONG cViews) PURE; \
 	STDMETHOD(Reset)(THIS) PURE; \
 	STDMETHOD(Clone)(THIS_ IEnumOleDocumentViews **ppEnum) PURE;
-#define IEnumOleDocumentViews_IMETHODS \
-	IUnknown_IMETHODS \
-	IEnumOleDocumentViews_METHODS
 ICOM_DEFINE(IEnumOleDocumentViews,IUnknown)
 #undef INTERFACE
 
@@ -317,11 +309,9 @@ ICOM_DEFINE(IEnumOleDocumentViews,IUnknown)
  */
 #define INTERFACE IOleCommandTarget
 #define IOleCommandTarget_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(QueryStatus)(THIS_ const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText) PURE; \
 	STDMETHOD(Exec)(THIS_ const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) PURE;
-#define IOleCommandTarget_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleCommandTarget_METHODS
 ICOM_DEFINE(IOleCommandTarget,IUnknown)
 #undef INTERFACE
 
@@ -341,11 +331,9 @@ ICOM_DEFINE(IOleCommandTarget,IUnknown)
  */
 #define INTERFACE IContinueCallback
 #define IContinueCallback_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(FContinue)(THIS) PURE; \
 	STDMETHOD(FContinuePrinting)(THIS_ LONG nCntPrinted, LONG nCurPage, WCHAR *pwszPrintStatus) PURE;
-#define IContinueCallback_IMETHODS \
-	IUnknown_IMETHODS \
-	IContinueCallback_METHODS
 ICOM_DEFINE(IContinueCallback,IUnknown)
 #undef INTERFACE
 
@@ -365,12 +353,10 @@ ICOM_DEFINE(IContinueCallback,IUnknown)
  */
 #define INTERFACE IPrint
 #define IPrint_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(SetInitialPageNum)(THIS_ LONG nFirstPage) PURE; \
 	STDMETHOD(GetPageInfo)(THIS_ LONG *pnFirstPage, LONG *pcPages) PURE; \
 	STDMETHOD(Print)(THIS_ DWORD grfFlags, DVTARGETDEVICE **pptd, PAGESET **ppPageSet, STGMEDIUM *pstgmOptions, IContinueCallback *pcallback, LONG nFirstPage, LONG *pcPagesPrinted, LONG *pnLastPage) PURE;
-#define IPrint_IMETHODS \
-	IUnknown_IMETHODS \
-	IPrint_METHODS
 ICOM_DEFINE(IPrint,IUnknown)
 #undef INTERFACE
 
diff --git a/include/dplay.h b/include/dplay.h
index 827131c041..e893262974 100644
--- a/include/dplay.h
+++ b/include/dplay.h
@@ -421,6 +421,7 @@ typedef BOOL (CALLBACK *LPDPENUMSESSIONSCALLBACK2)(
  */
 #define INTERFACE IDirectPlay
 #define IDirectPlay_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(AddPlayerToGroup)(THIS_ DPID idGroup, DPID idPlayer) PURE; \
     STDMETHOD(Close)(THIS) PURE; \
     STDMETHOD(CreatePlayer)(THIS_ LPDPID lpidPlayer, LPSTR lpPlayerName, LPSTR, LPHANDLE) PURE; \
@@ -443,9 +444,6 @@ typedef BOOL (CALLBACK *LPDPENUMSESSIONSCALLBACK2)(
     STDMETHOD(SaveSession)(THIS_ LPSTR) PURE; \
     STDMETHOD(Send)(THIS_ DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize) PURE; \
     STDMETHOD(SetPlayerName)(THIS_ DPID idPlayer, LPSTR lpPlayerName, LPSTR) PURE;
-#define IDirectPlay_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectPlay_METHODS
 ICOM_DEFINE(IDirectPlay,IUnknown)
 #undef INTERFACE
 
@@ -485,6 +483,7 @@ ICOM_DEFINE(IDirectPlay,IUnknown)
  */
 #define INTERFACE IDirectPlay2
 #define IDirectPlay2_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(AddPlayerToGroup)(THIS_ DPID idGroup, DPID idPlayer) PURE; \
     STDMETHOD(Close)(THIS) PURE; \
     STDMETHOD(CreateGroup)(THIS_ LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags) PURE; \
@@ -514,9 +513,6 @@ ICOM_DEFINE(IDirectPlay,IUnknown)
     STDMETHOD(SetPlayerData)(THIS_ DPID idPlayer, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags) PURE; \
     STDMETHOD(SetPlayerName)(THIS_ DPID idPlayer, LPDPNAME lpPlayerName, DWORD dwFlags) PURE; \
     STDMETHOD(SetSessionDesc)(THIS_ LPDPSESSIONDESC2 lpSessDesc, DWORD dwFlags) PURE;
-#define IDirectPlay2_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectPlay2_METHODS
 ICOM_DEFINE(IDirectPlay2,IUnknown)
 #undef INTERFACE
 
@@ -563,6 +559,7 @@ ICOM_DEFINE(IDirectPlay2,IUnknown)
  */
 #define INTERFACE IDirectPlay3
 #define IDirectPlay3_METHODS \
+    IDirectPlay2_METHODS \
     STDMETHOD(AddGroupToGroup)(THIS_ DPID idParentGroup, DPID idGroup) PURE; \
     STDMETHOD(CreateGroupInGroup)(THIS_ DPID idParentGroup, LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags) PURE; \
     STDMETHOD(DeleteGroupFromGroup)(THIS_ DPID idParentGroup, DPID idGroup) PURE; \
@@ -578,9 +575,6 @@ ICOM_DEFINE(IDirectPlay2,IUnknown)
     STDMETHOD(GetGroupParent)(THIS_ DPID idGroup, LPDPID lpidParent) PURE; \
     STDMETHOD(GetPlayerAccount)(THIS_ DPID idPlayer, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize) PURE; \
     STDMETHOD(GetPlayerFlags)(THIS_ DPID idPlayer, LPDWORD lpdwFlags) PURE;
-#define IDirectPlay3_IMETHODS \
-    IDirectPlay2_IMETHODS \
-    IDirectPlay3_METHODS
 ICOM_DEFINE(IDirectPlay3,IDirectPlay2)
 #undef INTERFACE
 
@@ -642,16 +636,13 @@ ICOM_DEFINE(IDirectPlay3,IDirectPlay2)
  */
 #define INTERFACE IDirectPlay4
 #define IDirectPlay4_METHODS \
+    IDirectPlay3_METHODS \
     STDMETHOD(GetGroupOwner)(THIS_ DPID , LPDPID  ) PURE; \
     STDMETHOD(SetGroupOwner)(THIS_ DPID , DPID  ) PURE; \
     STDMETHOD(SendEx)(THIS_ DPID , DPID , DWORD , LPVOID , DWORD , DWORD , DWORD , LPVOID , LPDWORD  ) PURE; \
     STDMETHOD(GetMessageQueue)(THIS_ DPID , DPID , DWORD , LPDWORD , LPDWORD  ) PURE; \
     STDMETHOD(CancelMessage)(THIS_ DWORD , DWORD  ) PURE; \
     STDMETHOD(CancelPriority)(THIS_ DWORD , DWORD , DWORD  ) PURE;
-
-#define IDirectPlay4_IMETHODS \
-    IDirectPlay3_IMETHODS \
-    IDirectPlay4_METHODS
 ICOM_DEFINE(IDirectPlay4,IDirectPlay3)
 #undef INTERFACE
 
diff --git a/include/dplobby.h b/include/dplobby.h
index 4f7ee3907c..792d3f090d 100644
--- a/include/dplobby.h
+++ b/include/dplobby.h
@@ -370,6 +370,7 @@ typedef BOOL (CALLBACK *LPDPLENUMLOCALAPPLICATIONSCALLBACK)(
  */
 #define INTERFACE IDirectPlayLobby
 #define IDirectPlayLobby_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Connect)(THIS_ DWORD, LPDIRECTPLAY2*, IUnknown*) PURE; \
     STDMETHOD(CreateAddress)(THIS_ REFGUID, REFGUID, LPCVOID, DWORD, LPVOID, LPDWORD) PURE; \
     STDMETHOD(EnumAddress)(THIS_ LPDPENUMADDRESSCALLBACK, LPCVOID, DWORD, LPVOID) PURE; \
@@ -381,9 +382,6 @@ typedef BOOL (CALLBACK *LPDPLENUMLOCALAPPLICATIONSCALLBACK)(
     STDMETHOD(SendLobbyMessage)(THIS_ DWORD, DWORD, LPVOID, DWORD) PURE; \
     STDMETHOD(SetConnectionSettings)(THIS_ DWORD, DWORD, LPDPLCONNECTION) PURE; \
     STDMETHOD(SetLobbyMessageEvent)(THIS_ DWORD, DWORD, HANDLE) PURE;
-#define IDirectPlayLobby_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectPlayLobby_METHODS
 ICOM_DEFINE(IDirectPlayLobby,IUnknown)
 #undef INTERFACE
 
@@ -392,10 +390,8 @@ ICOM_DEFINE(IDirectPlayLobby,IUnknown)
  */
 #define INTERFACE IDirectPlayLobby2
 #define IDirectPlayLobby2_METHODS \
+    IDirectPlayLobby_METHODS \
     STDMETHOD(CreateCompoundAddress)(THIS_ LPCDPCOMPOUNDADDRESSELEMENT, DWORD, LPVOID, LPDWORD) PURE;
-#define IDirectPlayLobby2_IMETHODS \
-    IDirectPlayLobby_IMETHODS \
-    IDirectPlayLobby2_METHODS
 ICOM_DEFINE(IDirectPlayLobby2,IDirectPlayLobby)
 #undef INTERFACE
 
@@ -404,14 +400,11 @@ ICOM_DEFINE(IDirectPlayLobby2,IDirectPlayLobby)
  */
 #define INTERFACE IDirectPlayLobby3
 #define IDirectPlayLobby3_METHODS \
+    IDirectPlayLobby2_METHODS \
     STDMETHOD(ConnectEx)(THIS_ DWORD, REFIID, LPVOID *, IUnknown *) PURE; \
     STDMETHOD(RegisterApplication)(THIS_ DWORD, LPDPAPPLICATIONDESC) PURE; \
     STDMETHOD(UnregisterApplication)(THIS_ DWORD, REFGUID) PURE; \
     STDMETHOD(WaitForConnectionSettings)(THIS_ DWORD) PURE;
-
-#define IDirectPlayLobby3_IMETHODS \
-    IDirectPlayLobby2_IMETHODS \
-    IDirectPlayLobby3_METHODS
 ICOM_DEFINE(IDirectPlayLobby3,IDirectPlayLobby2)
 #undef INTERFACE
 
diff --git a/include/dsdriver.h b/include/dsdriver.h
index e482991e1c..00d5e46484 100644
--- a/include/dsdriver.h
+++ b/include/dsdriver.h
@@ -134,15 +134,13 @@ typedef struct _DSCDRIVERCAPS
  */
 #define INTERFACE IDsDriver
 #define IDsDriver_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetDriverDesc)(THIS_ PDSDRIVERDESC pDsDriverDesc) PURE; \
     STDMETHOD(Open)(THIS) PURE; \
     STDMETHOD(Close)(THIS) PURE; \
     STDMETHOD(GetCaps)(THIS_ PDSDRIVERCAPS pDsDrvCaps) PURE; \
     STDMETHOD(CreateSoundBuffer)(THIS_ LPWAVEFORMATEX pwfx,DWORD dwFlags,DWORD dwCardAddress,LPDWORD pdwcbBufferSize,LPBYTE *ppbBuffer,LPVOID *ppvObj) PURE; \
     STDMETHOD(DuplicateSoundBuffer)(THIS_ PIDSDRIVERBUFFER pIDsDriverBuffer,LPVOID *ppvObj) PURE;
-#define IDsDriver_IMETHODS \
-    IUnknown_METHODS \
-    IDsDriver_METHODS
 ICOM_DEFINE(IDsDriver,IUnknown)
 #undef INTERFACE
 
@@ -165,6 +163,7 @@ ICOM_DEFINE(IDsDriver,IUnknown)
  */
 #define INTERFACE IDsDriverBuffer
 #define IDsDriverBuffer_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Lock)(THIS_ LPVOID *ppvAudio1,LPDWORD pdwLen1,LPVOID *pdwAudio2,LPDWORD pdwLen2,DWORD dwWritePosition,DWORD dwWriteLen,DWORD dwFlags) PURE; \
     STDMETHOD(Unlock)(THIS_ LPVOID pvAudio1,DWORD dwLen1,LPVOID pvAudio2,DWORD dwLen2) PURE; \
     STDMETHOD(SetFormat)(THIS_ LPWAVEFORMATEX pwfxToSet) PURE; \
@@ -174,9 +173,6 @@ ICOM_DEFINE(IDsDriver,IUnknown)
     STDMETHOD(GetPosition)(THIS_ LPDWORD lpdwCurrentPlayCursor,LPDWORD lpdwCurrentWriteCursor) PURE; \
     STDMETHOD(Play)(THIS_ DWORD dwReserved1,DWORD dwReserved2,DWORD dwFlags) PURE; \
     STDMETHOD(Stop)(THIS) PURE;
-#define IDsDriverBuffer_IMETHODS \
-    IUnknown_METHODS \
-    IDsDriverBuffer_METHODS
 ICOM_DEFINE(IDsDriverBuffer,IUnknown)
 #undef INTERFACE
 
@@ -202,12 +198,10 @@ ICOM_DEFINE(IDsDriverBuffer,IUnknown)
  */
 #define INTERFACE IDsDriverPropertySet
 #define IDsDriverPropertySet_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Get)(THIS_ PDSPROPERTY pDsProperty,LPVOID pPropertyParams,ULONG cbPropertyParams,LPVOID pPropertyData,ULONG cbPropertyData,PULONG pcbReturnedData) PURE; \
     STDMETHOD(Set)(THIS_ PDSPROPERTY pDsProperty,LPVOID pPropertyParams,ULONG cbPropertyParams,LPVOID pPropertyData,ULONG cbPropertyData) PURE; \
     STDMETHOD(QuerySupport)(THIS_ REFGUID PropertySetId,ULONG PropertyId,PULONG pSupport) PURE;
-#define IDsDriverPropertySet_IMETHODS \
-    IUnknown_METHODS \
-    IDsDriverPropertySet_METHODS
 ICOM_DEFINE(IDsDriverPropertySet,IUnknown)
 #undef INTERFACE
 
@@ -262,10 +256,8 @@ typedef enum
  */
 #define INTERFACE IDsDriverNotify
 #define IDsDriverNotify_METHODS \
-    STDMETHOD(SetNotificationPositions)(THIS_ DWORD dwPositionNotifies,LPCDSBPOSITIONNOTIFY pcPositionNotifies) PURE;
-#define IDsDriverNotify_IMETHODS \
     IUnknown_METHODS \
-    IDsDriverNotify_METHODS
+    STDMETHOD(SetNotificationPositions)(THIS_ DWORD dwPositionNotifies,LPCDSBPOSITIONNOTIFY pcPositionNotifies) PURE;
 ICOM_DEFINE(IDsDriverNotify,IUnknown)
 #undef INTERFACE
 
@@ -283,14 +275,12 @@ ICOM_DEFINE(IDsDriverNotify,IUnknown)
  */
 #define INTERFACE IDsCaptureDriver
 #define IDsCaptureDriver_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetDriverDesc)(THIS_ PDSDRIVERDESC pDsDriverDesc) PURE; \
     STDMETHOD(Open)(THIS) PURE; \
     STDMETHOD(Close)(THIS) PURE; \
     STDMETHOD(GetCaps)(THIS_ PDSCDRIVERCAPS pDsDrvCaps) PURE; \
     STDMETHOD(CreateCaptureBuffer)(THIS_ LPWAVEFORMATEX pwfx,DWORD dwFlags,DWORD dwCardAddress,LPDWORD pdwcbBufferSize,LPBYTE *ppbBuffer,LPVOID *ppvObj) PURE;
-#define IDsCaptureDriver_IMETHODS \
-    IUnknown_METHODS \
-    IDsCaptureDriver_METHODS
 ICOM_DEFINE(IDsCaptureDriver,IUnknown)
 #undef INTERFACE
 
@@ -312,6 +302,7 @@ ICOM_DEFINE(IDsCaptureDriver,IUnknown)
  */
 #define INTERFACE IDsCaptureDriverBuffer
 #define IDsCaptureDriverBuffer_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Lock)(THIS_ LPVOID *ppvAudio1,LPDWORD pdwLen1,LPVOID *ppvAudio2,LPDWORD pdwLen2,DWORD dwWritePosition,DWORD dwWriteLen,DWORD dwFlags) PURE; \
     STDMETHOD(Unlock)(THIS_ LPVOID pvAudio1,DWORD dwLen1,LPVOID pvAudio2,DWORD dwLen2) PURE; \
     STDMETHOD(SetFormat)(THIS_ LPWAVEFORMATEX pwfxToSet) PURE; \
@@ -319,9 +310,6 @@ ICOM_DEFINE(IDsCaptureDriver,IUnknown)
     STDMETHOD(GetStatus)(THIS_ LPDWORD lpdwStatus) PURE; \
     STDMETHOD(Start)(THIS_ DWORD dwFlags) PURE; \
     STDMETHOD(Stop)(THIS) PURE;
-#define IDsCaptureDriverBuffer_IMETHODS \
-    IUnknown_METHODS \
-    IDsCaptureDriverBuffer_METHODS
 ICOM_DEFINE(IDsCaptureDriverBuffer,IUnknown)
 #undef INTERFACE
 
diff --git a/include/dsound.h b/include/dsound.h
index 313d84019d..7c11240ee4 100644
--- a/include/dsound.h
+++ b/include/dsound.h
@@ -332,6 +332,7 @@ extern HRESULT WINAPI GetDeviceID(LPCGUID lpGuidSrc, LPGUID lpGuidDest);
  */
 #define INTERFACE IDirectSound
 #define IDirectSound_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(CreateSoundBuffer)(THIS_ LPDSBUFFERDESC lpcDSBufferDesc, LPLPDIRECTSOUNDBUFFER lplpDirectSoundBuffer, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(GetCaps)(THIS_ LPDSCAPS lpDSCaps) PURE; \
     STDMETHOD(DuplicateSoundBuffer)(THIS_ LPDIRECTSOUNDBUFFER lpDsbOriginal, LPLPDIRECTSOUNDBUFFER lplpDsbDuplicate) PURE; \
@@ -340,9 +341,6 @@ extern HRESULT WINAPI GetDeviceID(LPCGUID lpGuidSrc, LPGUID lpGuidDest);
     STDMETHOD(GetSpeakerConfig)(THIS_ LPDWORD lpdwSpeakerConfig) PURE; \
     STDMETHOD(SetSpeakerConfig)(THIS_ DWORD dwSpeakerConfig) PURE; \
     STDMETHOD(Initialize)(THIS_ LPCGUID lpcGuid) PURE;
-#define IDirectSound_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectSound_METHODS
 ICOM_DEFINE(IDirectSound,IUnknown)
 #undef INTERFACE
 
@@ -368,6 +366,7 @@ ICOM_DEFINE(IDirectSound,IUnknown)
  */
 #define INTERFACE IDirectSound8
 #define IDirectSound8_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(CreateSoundBuffer)(THIS_ LPDSBUFFERDESC lpcDSBufferDesc, LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer, IUnknown *pUnkOuter) PURE; \
     STDMETHOD(GetCaps)(THIS_ LPDSCAPS lpDSCaps) PURE; \
     STDMETHOD(DuplicateSoundBuffer)(THIS_ LPDIRECTSOUNDBUFFER8 lpDsbOriginal, LPLPDIRECTSOUNDBUFFER8 lplpDsbDuplicate) PURE; \
@@ -377,9 +376,6 @@ ICOM_DEFINE(IDirectSound,IUnknown)
     STDMETHOD(SetSpeakerConfig)(THIS_ DWORD dwSpeakerConfig) PURE; \
     STDMETHOD(Initialize)(THIS_ LPCGUID lpcGuid) PURE; \
     STDMETHOD(VerifyCertification)(THIS_ LPDWORD pdwCertified) PURE;
-#define IDirectSound8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectSound8_METHODS
 ICOM_DEFINE(IDirectSound8,IUnknown)
 #undef INTERFACE
 
@@ -407,6 +403,7 @@ ICOM_DEFINE(IDirectSound8,IUnknown)
  */
 #define INTERFACE IDirectSoundBuffer
 #define IDirectSoundBuffer_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetCaps)(THIS_ LPDSBCAPS lpDSBufferCaps) PURE; \
     STDMETHOD(GetCurrentPosition)(THIS_ LPDWORD lpdwCurrentPlayCursor, LPDWORD lpdwCurrentWriteCursor) PURE; \
     STDMETHOD(GetFormat)(THIS_ LPWAVEFORMATEX lpwfxFormat, DWORD dwSizeAllocated, LPDWORD lpdwSizeWritten) PURE; \
@@ -425,9 +422,6 @@ ICOM_DEFINE(IDirectSound8,IUnknown)
     STDMETHOD(Stop)(THIS) PURE; \
     STDMETHOD(Unlock)(THIS_ LPVOID lpvAudioPtr1, DWORD dwAudioBytes1, LPVOID lpvAudioPtr2, DWORD dwAudioPtr2) PURE; \
     STDMETHOD(Restore)(THIS) PURE;
-#define IDirectSoundBuffer_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectSoundBuffer_METHODS
 ICOM_DEFINE(IDirectSoundBuffer,IUnknown)
 #undef INTERFACE
 
@@ -463,6 +457,7 @@ ICOM_DEFINE(IDirectSoundBuffer,IUnknown)
  */
 #define INTERFACE IDirectSoundBuffer8
 #define IDirectSoundBuffer8_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetCaps)(THIS_ LPDSBCAPS lpDSBufferCaps) PURE; \
     STDMETHOD(GetCurrentPosition)(THIS_ LPDWORD lpdwCurrentPlayCursor, LPDWORD lpdwCurrentWriteCursor) PURE; \
     STDMETHOD(GetFormat)(THIS_ LPWAVEFORMATEX lpwfxFormat, DWORD dwSizeAllocated, LPDWORD lpdwSizeWritten) PURE; \
@@ -484,9 +479,6 @@ ICOM_DEFINE(IDirectSoundBuffer,IUnknown)
     STDMETHOD(SetFX)(THIS_ DWORD dwEffectsCount, LPDSEFFECTDESC pDSFXDesc, LPDWORD pdwResultCodes) PURE; \
     STDMETHOD(AcquireResources)(THIS_ DWORD dwFlags, DWORD dwEffectsCount, LPDWORD pdwResultCodes) PURE; \
     STDMETHOD(GetObjectInPath)(THIS_ REFGUID rguidObject, DWORD dwIndex, REFGUID rguidInterface, LPVOID *ppObject) PURE;
-#define IDirectSoundBuffer8_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectSoundBuffer8_METHODS
 ICOM_DEFINE(IDirectSoundBuffer8,IUnknown)
 #undef INTERFACE
 
@@ -526,13 +518,10 @@ ICOM_DEFINE(IDirectSoundBuffer8,IUnknown)
  */
 #define INTERFACE IDirectSoundCapture
 #define IDirectSoundCapture_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(CreateCaptureBuffer)(THIS_ LPCDSCBUFFERDESC lpcDSCBufferDesc,LPDIRECTSOUNDCAPTUREBUFFER *lplpDSCaptureBuffer, LPUNKNOWN pUnk) PURE; \
     STDMETHOD(GetCaps)(THIS_ LPDSCCAPS lpDSCCaps) PURE; \
     STDMETHOD(Initialize)(THIS_ LPCGUID lpcGUID) PURE;
-
-#define IDirectSoundCapture_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectSoundCapture_METHODS
 ICOM_DEFINE(IDirectSoundCapture,IUnknown)
 #undef INTERFACE
 
@@ -550,6 +539,7 @@ ICOM_DEFINE(IDirectSoundCapture,IUnknown)
  */
 #define INTERFACE IDirectSoundCaptureBuffer
 #define IDirectSoundCaptureBuffer_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetCaps)(THIS_ LPDSCBCAPS lpDSCBCaps) PURE; \
     STDMETHOD(GetCurrentPosition)(THIS_ LPDWORD lpdwCapturePosition,LPDWORD lpdwReadPosition) PURE; \
     STDMETHOD(GetFormat)(THIS_ LPWAVEFORMATEX lpwfxFormat, DWORD dwSizeAllocated, LPDWORD lpdwSizeWritten) PURE; \
@@ -559,10 +549,6 @@ ICOM_DEFINE(IDirectSoundCapture,IUnknown)
     STDMETHOD(Start)(THIS_ DWORD dwFlags) PURE; \
     STDMETHOD(Stop)(THIS) PURE; \
     STDMETHOD(Unlock)(THIS_ LPVOID lpvAudioPtr1, DWORD dwAudioBytes1, LPVOID lpvAudioPtr2, DWORD dwAudioBytes2) PURE;
-
-#define IDirectSoundCaptureBuffer_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectSoundCaptureBuffer_METHODS
 ICOM_DEFINE(IDirectSoundCaptureBuffer,IUnknown)
 #undef INTERFACE
 
@@ -586,12 +572,9 @@ ICOM_DEFINE(IDirectSoundCaptureBuffer,IUnknown)
  */
 #define INTERFACE IDirectSoundCaptureBuffer8
 #define IDirectSoundCaptureBuffer8_METHODS \
+    IDirectSoundCaptureBuffer_METHODS \
     STDMETHOD(GetObjectInPath)(THIS_ REFGUID rguidObject, DWORD dwIndex, REFGUID rguidInterface, LPVOID *ppObject) PURE; \
     STDMETHOD(GetFXStatus)(THIS_ DWORD dwFXCount, LPDWORD pdwFXStatus) PURE;
-
-#define IDirectSoundCaptureBuffer8_IMETHODS \
-    IDirectSoundCaptureBuffer_IMETHODS \
-    IDirectSoundCaptureBuffer8_METHODS
 ICOM_DEFINE(IDirectSoundCaptureBuffer8,IDirectSoundCaptureBuffer)
 #undef INTERFACE
 
@@ -621,10 +604,8 @@ ICOM_DEFINE(IDirectSoundCaptureBuffer8,IDirectSoundCaptureBuffer)
 
 #define INTERFACE IDirectSoundNotify
 #define IDirectSoundNotify_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(SetNotificationPositions)(THIS_ DWORD cPositionNotifies, LPCDSBPOSITIONNOTIFY lpcPositionNotifies) PURE;
-#define IDirectSoundNotify_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectSoundNotify_METHODS
 ICOM_DEFINE(IDirectSoundNotify,IUnknown)
 #undef INTERFACE
 
@@ -684,6 +665,7 @@ typedef const DS3DLISTENER *LPCDS3DLISTENER;
 
 #define INTERFACE IDirectSound3DListener
 #define IDirectSound3DListener_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetAllParameters)(THIS_ LPDS3DLISTENER lpListener) PURE; \
     STDMETHOD(GetDistanceFactor)(THIS_ LPD3DVALUE lpflDistanceFactor) PURE; \
     STDMETHOD(GetDopplerFactor)(THIS_ LPD3DVALUE lpflDopplerFactor) PURE; \
@@ -699,9 +681,6 @@ typedef const DS3DLISTENER *LPCDS3DLISTENER;
     STDMETHOD(SetRolloffFactor)(THIS_ D3DVALUE flRolloffFactor, DWORD dwApply) PURE; \
     STDMETHOD(SetVelocity)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; \
     STDMETHOD(CommitDeferredSettings)(THIS) PURE;
-#define IDirectSound3DListener_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectSound3DListener_METHODS
 ICOM_DEFINE(IDirectSound3DListener,IUnknown)
 #undef INTERFACE
 
@@ -749,6 +728,7 @@ typedef const DS3DBUFFER *LPCDS3DBUFFER;
 
 #define INTERFACE IDirectSound3DBuffer
 #define IDirectSound3DBuffer_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetAllParameters)(THIS_ LPDS3DBUFFER lpDs3dBuffer) PURE; \
     STDMETHOD(GetConeAngles)(THIS_ LPDWORD lpdwInsideConeAngle, LPDWORD lpdwOutsideConeAngle) PURE; \
     STDMETHOD(GetConeOrientation)(THIS_ LPD3DVECTOR lpvOrientation) PURE; \
@@ -767,9 +747,6 @@ typedef const DS3DBUFFER *LPCDS3DBUFFER;
     STDMETHOD(SetMode)(THIS_ DWORD dwMode, DWORD dwApply) PURE; \
     STDMETHOD(SetPosition)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; \
     STDMETHOD(SetVelocity)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE;
-#define IDirectSound3DBuffer_IMETHODS \
-    IUnknown_IMETHODS \
-    IDirectSound3DBuffer_METHODS
 ICOM_DEFINE(IDirectSound3DBuffer,IUnknown)
 #undef INTERFACE
 
@@ -807,12 +784,10 @@ ICOM_DEFINE(IDirectSound3DBuffer,IUnknown)
 
 #define INTERFACE IKsPropertySet
 #define IKsPropertySet_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Get)(THIS_ REFGUID rgid,ULONG x1,LPVOID p1,ULONG x2,LPVOID p2,ULONG x3,ULONG *px4) PURE;\
     STDMETHOD(Set)(THIS_ REFGUID rgid,ULONG x1,LPVOID p1,ULONG x2,LPVOID p2,ULONG x3) PURE;\
     STDMETHOD(QuerySupport)(THIS_ REFGUID rgid,ULONG x1,ULONG *px2) PURE;
-#define IKsPropertySet_IMETHODS \
-        IUnknown_IMETHODS \
-	IKsPropertySet_METHODS
 ICOM_DEFINE(IKsPropertySet,IUnknown)
 #undef INTERFACE
 
@@ -831,10 +806,8 @@ ICOM_DEFINE(IKsPropertySet,IUnknown)
  */
 #define INTERFACE IDirectSoundFullDuplex
 #define IDirectSoundFullDuplex_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Initialize)(THIS_ LPCGUID pCaptureGuid,LPCGUID pRendererGuid,LPCDSCBUFFERDESC lpDscBufferDesc,LPCDSBUFFERDESC lpDsBufferDesc,HWND hWnd,DWORD dwLevel,LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8,LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8) PURE;
-#define IDirectSoundFullDuplex_IMETHODS \
-        IUnknown_IMETHODS \
-	IDirectSoundFullDuplex_METHODS
 ICOM_DEFINE(IDirectSoundFullDuplex,IUnknown)
 #undef INTERFACE
 
diff --git a/include/oaidl.h b/include/oaidl.h
index 26545a9b11..df7a2a9e2a 100644
--- a/include/oaidl.h
+++ b/include/oaidl.h
@@ -663,17 +663,6 @@ struct IDispatchVtbl {
 
 };
 
-#define IDispatch_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IDispatch methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(INTERFACE *This, UINT* pctinfo); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(INTERFACE *This, UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo); \
-    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(INTERFACE *This, REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId); \
-    HRESULT (STDMETHODCALLTYPE *Invoke)(INTERFACE *This, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr);
-
 /*** IUnknown methods ***/
 #define IDispatch_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IDispatch_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -686,6 +675,18 @@ struct IDispatchVtbl {
 
 #endif
 
+#define IDispatch_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IDispatch methods ***/ \
+    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ UINT* pctinfo) PURE; \
+    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) PURE; \
+    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) PURE; \
+    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) PURE;
+
 HRESULT CALLBACK IDispatch_GetTypeInfoCount_Proxy(
     IDispatch* This,
     UINT* pctinfo);
@@ -823,17 +824,6 @@ struct IEnumVARIANTVtbl {
 
 };
 
-#define IEnumVARIANT_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IEnumVARIANT methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Next)(INTERFACE *This, ULONG celt, VARIANT* rgVar, ULONG* pCeltFetched); \
-    HRESULT (STDMETHODCALLTYPE *Skip)(INTERFACE *This, ULONG celt); \
-    HRESULT (STDMETHODCALLTYPE *Reset)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IEnumVARIANT** ppEnum);
-
 /*** IUnknown methods ***/
 #define IEnumVARIANT_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IEnumVARIANT_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -846,6 +836,18 @@ struct IEnumVARIANTVtbl {
 
 #endif
 
+#define IEnumVARIANT_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IEnumVARIANT methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, VARIANT* rgVar, ULONG* pCeltFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumVARIANT** ppEnum) PURE;
+
 HRESULT CALLBACK IEnumVARIANT_RemoteNext_Proxy(
     IEnumVARIANT* This,
     ULONG celt,
@@ -969,15 +971,6 @@ struct ITypeCompVtbl {
 
 };
 
-#define ITypeComp_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ITypeComp methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Bind)(INTERFACE *This, LPOLESTR szName, ULONG lHashVal, WORD wFlags, ITypeInfo** ppTInfo, DESCKIND* pDescKind, BINDPTR* pBindPtr); \
-    HRESULT (STDMETHODCALLTYPE *BindType)(INTERFACE *This, LPOLESTR szName, ULONG lHashVal, ITypeInfo** ppTInfo, ITypeComp** ppTComp);
-
 /*** IUnknown methods ***/
 #define ITypeComp_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ITypeComp_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -988,6 +981,16 @@ struct ITypeCompVtbl {
 
 #endif
 
+#define ITypeComp_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ITypeComp methods ***/ \
+    STDMETHOD_(HRESULT,Bind)(THIS_ LPOLESTR szName, ULONG lHashVal, WORD wFlags, ITypeInfo** ppTInfo, DESCKIND* pDescKind, BINDPTR* pBindPtr) PURE; \
+    STDMETHOD_(HRESULT,BindType)(THIS_ LPOLESTR szName, ULONG lHashVal, ITypeInfo** ppTInfo, ITypeComp** ppTComp) PURE;
+
 HRESULT CALLBACK ITypeComp_RemoteBind_Proxy(
     ITypeComp* This,
     LPOLESTR szName,
@@ -1271,32 +1274,6 @@ struct ITypeInfoVtbl {
 
 };
 
-#define ITypeInfo_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ITypeInfo methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetTypeAttr)(INTERFACE *This, TYPEATTR** ppTypeAttr); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeComp)(INTERFACE *This, ITypeComp** ppTComp); \
-    HRESULT (STDMETHODCALLTYPE *GetFuncDesc)(INTERFACE *This, UINT index, FUNCDESC** ppFuncDesc); \
-    HRESULT (STDMETHODCALLTYPE *GetVarDesc)(INTERFACE *This, UINT index, VARDESC** ppVarDesc); \
-    HRESULT (STDMETHODCALLTYPE *GetNames)(INTERFACE *This, MEMBERID memid, BSTR* rgBstrNames, UINT cMaxNames, UINT* pcNames); \
-    HRESULT (STDMETHODCALLTYPE *GetRefTypeOfImplType)(INTERFACE *This, UINT index, HREFTYPE* pRefType); \
-    HRESULT (STDMETHODCALLTYPE *GetImplTypeFlags)(INTERFACE *This, UINT index, INT* pImplTypeFlags); \
-    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(INTERFACE *This, LPOLESTR* rgszNames, UINT cNames, MEMBERID* pMemId); \
-    HRESULT (STDMETHODCALLTYPE *Invoke)(INTERFACE *This, PVOID pvInstance, MEMBERID memid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr); \
-    HRESULT (STDMETHODCALLTYPE *GetDocumentation)(INTERFACE *This, MEMBERID memid, BSTR* pBstrName, BSTR* pBstrDocString, DWORD* pdwHelpContext, BSTR* pBstrHelpFile); \
-    HRESULT (STDMETHODCALLTYPE *GetDllEntry)(INTERFACE *This, MEMBERID memid, INVOKEKIND invKind, BSTR* pBstrDllName, BSTR* pBstrName, WORD* pwOrdinal); \
-    HRESULT (STDMETHODCALLTYPE *GetRefTypeInfo)(INTERFACE *This, HREFTYPE hRefType, ITypeInfo** ppTInfo); \
-    HRESULT (STDMETHODCALLTYPE *AddressOfMember)(INTERFACE *This, MEMBERID memid, INVOKEKIND invKind, PVOID* ppv); \
-    HRESULT (STDMETHODCALLTYPE *CreateInstance)(INTERFACE *This, IUnknown* pUnkOuter, REFIID riid, PVOID* ppvObj); \
-    HRESULT (STDMETHODCALLTYPE *GetMops)(INTERFACE *This, MEMBERID memid, BSTR* pBstrMops); \
-    HRESULT (STDMETHODCALLTYPE *GetContainingTypeLib)(INTERFACE *This, ITypeLib** ppTLib, UINT* pIndex); \
-    void (STDMETHODCALLTYPE *ReleaseTypeAttr)(INTERFACE *This, TYPEATTR* pTypeAttr); \
-    void (STDMETHODCALLTYPE *ReleaseFuncDesc)(INTERFACE *This, FUNCDESC* pFuncDesc); \
-    void (STDMETHODCALLTYPE *ReleaseVarDesc)(INTERFACE *This, VARDESC* pVarDesc);
-
 /*** IUnknown methods ***/
 #define ITypeInfo_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ITypeInfo_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -1324,6 +1301,33 @@ struct ITypeInfoVtbl {
 
 #endif
 
+#define ITypeInfo_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ITypeInfo methods ***/ \
+    STDMETHOD_(HRESULT,GetTypeAttr)(THIS_ TYPEATTR** ppTypeAttr) PURE; \
+    STDMETHOD_(HRESULT,GetTypeComp)(THIS_ ITypeComp** ppTComp) PURE; \
+    STDMETHOD_(HRESULT,GetFuncDesc)(THIS_ UINT index, FUNCDESC** ppFuncDesc) PURE; \
+    STDMETHOD_(HRESULT,GetVarDesc)(THIS_ UINT index, VARDESC** ppVarDesc) PURE; \
+    STDMETHOD_(HRESULT,GetNames)(THIS_ MEMBERID memid, BSTR* rgBstrNames, UINT cMaxNames, UINT* pcNames) PURE; \
+    STDMETHOD_(HRESULT,GetRefTypeOfImplType)(THIS_ UINT index, HREFTYPE* pRefType) PURE; \
+    STDMETHOD_(HRESULT,GetImplTypeFlags)(THIS_ UINT index, INT* pImplTypeFlags) PURE; \
+    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ LPOLESTR* rgszNames, UINT cNames, MEMBERID* pMemId) PURE; \
+    STDMETHOD_(HRESULT,Invoke)(THIS_ PVOID pvInstance, MEMBERID memid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) PURE; \
+    STDMETHOD_(HRESULT,GetDocumentation)(THIS_ MEMBERID memid, BSTR* pBstrName, BSTR* pBstrDocString, DWORD* pdwHelpContext, BSTR* pBstrHelpFile) PURE; \
+    STDMETHOD_(HRESULT,GetDllEntry)(THIS_ MEMBERID memid, INVOKEKIND invKind, BSTR* pBstrDllName, BSTR* pBstrName, WORD* pwOrdinal) PURE; \
+    STDMETHOD_(HRESULT,GetRefTypeInfo)(THIS_ HREFTYPE hRefType, ITypeInfo** ppTInfo) PURE; \
+    STDMETHOD_(HRESULT,AddressOfMember)(THIS_ MEMBERID memid, INVOKEKIND invKind, PVOID* ppv) PURE; \
+    STDMETHOD_(HRESULT,CreateInstance)(THIS_ IUnknown* pUnkOuter, REFIID riid, PVOID* ppvObj) PURE; \
+    STDMETHOD_(HRESULT,GetMops)(THIS_ MEMBERID memid, BSTR* pBstrMops) PURE; \
+    STDMETHOD_(HRESULT,GetContainingTypeLib)(THIS_ ITypeLib** ppTLib, UINT* pIndex) PURE; \
+    STDMETHOD_(void,ReleaseTypeAttr)(THIS_ TYPEATTR* pTypeAttr) PURE; \
+    STDMETHOD_(void,ReleaseFuncDesc)(THIS_ FUNCDESC* pFuncDesc) PURE; \
+    STDMETHOD_(void,ReleaseVarDesc)(THIS_ VARDESC* pVarDesc) PURE;
+
 HRESULT CALLBACK ITypeInfo_RemoteGetTypeAttr_Proxy(
     ITypeInfo* This,
     LPTYPEATTR* ppTypeAttr,
@@ -1909,48 +1913,6 @@ struct ITypeInfo2Vtbl {
 
 };
 
-#define ITypeInfo2_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ITypeInfo methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetTypeAttr)(INTERFACE *This, TYPEATTR** ppTypeAttr); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeComp)(INTERFACE *This, ITypeComp** ppTComp); \
-    HRESULT (STDMETHODCALLTYPE *GetFuncDesc)(INTERFACE *This, UINT index, FUNCDESC** ppFuncDesc); \
-    HRESULT (STDMETHODCALLTYPE *GetVarDesc)(INTERFACE *This, UINT index, VARDESC** ppVarDesc); \
-    HRESULT (STDMETHODCALLTYPE *GetNames)(INTERFACE *This, MEMBERID memid, BSTR* rgBstrNames, UINT cMaxNames, UINT* pcNames); \
-    HRESULT (STDMETHODCALLTYPE *GetRefTypeOfImplType)(INTERFACE *This, UINT index, HREFTYPE* pRefType); \
-    HRESULT (STDMETHODCALLTYPE *GetImplTypeFlags)(INTERFACE *This, UINT index, INT* pImplTypeFlags); \
-    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(INTERFACE *This, LPOLESTR* rgszNames, UINT cNames, MEMBERID* pMemId); \
-    HRESULT (STDMETHODCALLTYPE *Invoke)(INTERFACE *This, PVOID pvInstance, MEMBERID memid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr); \
-    HRESULT (STDMETHODCALLTYPE *GetDocumentation)(INTERFACE *This, MEMBERID memid, BSTR* pBstrName, BSTR* pBstrDocString, DWORD* pdwHelpContext, BSTR* pBstrHelpFile); \
-    HRESULT (STDMETHODCALLTYPE *GetDllEntry)(INTERFACE *This, MEMBERID memid, INVOKEKIND invKind, BSTR* pBstrDllName, BSTR* pBstrName, WORD* pwOrdinal); \
-    HRESULT (STDMETHODCALLTYPE *GetRefTypeInfo)(INTERFACE *This, HREFTYPE hRefType, ITypeInfo** ppTInfo); \
-    HRESULT (STDMETHODCALLTYPE *AddressOfMember)(INTERFACE *This, MEMBERID memid, INVOKEKIND invKind, PVOID* ppv); \
-    HRESULT (STDMETHODCALLTYPE *CreateInstance)(INTERFACE *This, IUnknown* pUnkOuter, REFIID riid, PVOID* ppvObj); \
-    HRESULT (STDMETHODCALLTYPE *GetMops)(INTERFACE *This, MEMBERID memid, BSTR* pBstrMops); \
-    HRESULT (STDMETHODCALLTYPE *GetContainingTypeLib)(INTERFACE *This, ITypeLib** ppTLib, UINT* pIndex); \
-    void (STDMETHODCALLTYPE *ReleaseTypeAttr)(INTERFACE *This, TYPEATTR* pTypeAttr); \
-    void (STDMETHODCALLTYPE *ReleaseFuncDesc)(INTERFACE *This, FUNCDESC* pFuncDesc); \
-    void (STDMETHODCALLTYPE *ReleaseVarDesc)(INTERFACE *This, VARDESC* pVarDesc); \
-    /*** ITypeInfo2 methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetTypeKind)(INTERFACE *This, TYPEKIND* pTypeKind); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeFlags)(INTERFACE *This, ULONG* pTypeFlags); \
-    HRESULT (STDMETHODCALLTYPE *GetFuncIndexOfMemId)(INTERFACE *This, MEMBERID memid, INVOKEKIND invKind, UINT* pFuncIndex); \
-    HRESULT (STDMETHODCALLTYPE *GetVarIndexOfMemId)(INTERFACE *This, MEMBERID memid, UINT* pVarIndex); \
-    HRESULT (STDMETHODCALLTYPE *GetCustData)(INTERFACE *This, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *GetFuncCustData)(INTERFACE *This, UINT index, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *GetParamCustData)(INTERFACE *This, UINT indexFunc, UINT indexParam, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *GetVarCustData)(INTERFACE *This, UINT index, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *GetImplTypeCustData)(INTERFACE *This, UINT index, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *GetDocumentation2)(INTERFACE *This, MEMBERID memid, LCID lcid, BSTR* pbstrHelpString, DWORD* pdwHelpStringContext, BSTR* pbstrHelpStringDll); \
-    HRESULT (STDMETHODCALLTYPE *GetAllCustData)(INTERFACE *This, CUSTDATA* pCustData); \
-    HRESULT (STDMETHODCALLTYPE *GetAllFuncCustData)(INTERFACE *This, UINT index, CUSTDATA* pCustData); \
-    HRESULT (STDMETHODCALLTYPE *GetAllParamCustData)(INTERFACE *This, UINT indexFunc, UINT indexParam, CUSTDATA* pCustData); \
-    HRESULT (STDMETHODCALLTYPE *GetAllVarCustData)(INTERFACE *This, UINT index, CUSTDATA* pCustData); \
-    HRESULT (STDMETHODCALLTYPE *GetAllImplTypeCustData)(INTERFACE *This, UINT index, CUSTDATA* pCustData);
-
 /*** IUnknown methods ***/
 #define ITypeInfo2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ITypeInfo2_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -1994,6 +1956,49 @@ struct ITypeInfo2Vtbl {
 
 #endif
 
+#define ITypeInfo2_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ITypeInfo methods ***/ \
+    STDMETHOD_(HRESULT,GetTypeAttr)(THIS_ TYPEATTR** ppTypeAttr) PURE; \
+    STDMETHOD_(HRESULT,GetTypeComp)(THIS_ ITypeComp** ppTComp) PURE; \
+    STDMETHOD_(HRESULT,GetFuncDesc)(THIS_ UINT index, FUNCDESC** ppFuncDesc) PURE; \
+    STDMETHOD_(HRESULT,GetVarDesc)(THIS_ UINT index, VARDESC** ppVarDesc) PURE; \
+    STDMETHOD_(HRESULT,GetNames)(THIS_ MEMBERID memid, BSTR* rgBstrNames, UINT cMaxNames, UINT* pcNames) PURE; \
+    STDMETHOD_(HRESULT,GetRefTypeOfImplType)(THIS_ UINT index, HREFTYPE* pRefType) PURE; \
+    STDMETHOD_(HRESULT,GetImplTypeFlags)(THIS_ UINT index, INT* pImplTypeFlags) PURE; \
+    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ LPOLESTR* rgszNames, UINT cNames, MEMBERID* pMemId) PURE; \
+    STDMETHOD_(HRESULT,Invoke)(THIS_ PVOID pvInstance, MEMBERID memid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) PURE; \
+    STDMETHOD_(HRESULT,GetDocumentation)(THIS_ MEMBERID memid, BSTR* pBstrName, BSTR* pBstrDocString, DWORD* pdwHelpContext, BSTR* pBstrHelpFile) PURE; \
+    STDMETHOD_(HRESULT,GetDllEntry)(THIS_ MEMBERID memid, INVOKEKIND invKind, BSTR* pBstrDllName, BSTR* pBstrName, WORD* pwOrdinal) PURE; \
+    STDMETHOD_(HRESULT,GetRefTypeInfo)(THIS_ HREFTYPE hRefType, ITypeInfo** ppTInfo) PURE; \
+    STDMETHOD_(HRESULT,AddressOfMember)(THIS_ MEMBERID memid, INVOKEKIND invKind, PVOID* ppv) PURE; \
+    STDMETHOD_(HRESULT,CreateInstance)(THIS_ IUnknown* pUnkOuter, REFIID riid, PVOID* ppvObj) PURE; \
+    STDMETHOD_(HRESULT,GetMops)(THIS_ MEMBERID memid, BSTR* pBstrMops) PURE; \
+    STDMETHOD_(HRESULT,GetContainingTypeLib)(THIS_ ITypeLib** ppTLib, UINT* pIndex) PURE; \
+    STDMETHOD_(void,ReleaseTypeAttr)(THIS_ TYPEATTR* pTypeAttr) PURE; \
+    STDMETHOD_(void,ReleaseFuncDesc)(THIS_ FUNCDESC* pFuncDesc) PURE; \
+    STDMETHOD_(void,ReleaseVarDesc)(THIS_ VARDESC* pVarDesc) PURE; \
+    /*** ITypeInfo2 methods ***/ \
+    STDMETHOD_(HRESULT,GetTypeKind)(THIS_ TYPEKIND* pTypeKind) PURE; \
+    STDMETHOD_(HRESULT,GetTypeFlags)(THIS_ ULONG* pTypeFlags) PURE; \
+    STDMETHOD_(HRESULT,GetFuncIndexOfMemId)(THIS_ MEMBERID memid, INVOKEKIND invKind, UINT* pFuncIndex) PURE; \
+    STDMETHOD_(HRESULT,GetVarIndexOfMemId)(THIS_ MEMBERID memid, UINT* pVarIndex) PURE; \
+    STDMETHOD_(HRESULT,GetCustData)(THIS_ REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,GetFuncCustData)(THIS_ UINT index, REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,GetParamCustData)(THIS_ UINT indexFunc, UINT indexParam, REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,GetVarCustData)(THIS_ UINT index, REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,GetImplTypeCustData)(THIS_ UINT index, REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,GetDocumentation2)(THIS_ MEMBERID memid, LCID lcid, BSTR* pbstrHelpString, DWORD* pdwHelpStringContext, BSTR* pbstrHelpStringDll) PURE; \
+    STDMETHOD_(HRESULT,GetAllCustData)(THIS_ CUSTDATA* pCustData) PURE; \
+    STDMETHOD_(HRESULT,GetAllFuncCustData)(THIS_ UINT index, CUSTDATA* pCustData) PURE; \
+    STDMETHOD_(HRESULT,GetAllParamCustData)(THIS_ UINT indexFunc, UINT indexParam, CUSTDATA* pCustData) PURE; \
+    STDMETHOD_(HRESULT,GetAllVarCustData)(THIS_ UINT index, CUSTDATA* pCustData) PURE; \
+    STDMETHOD_(HRESULT,GetAllImplTypeCustData)(THIS_ UINT index, CUSTDATA* pCustData) PURE;
+
 HRESULT CALLBACK ITypeInfo2_GetTypeKind_Proxy(
     ITypeInfo2* This,
     TYPEKIND* pTypeKind);
@@ -2303,23 +2308,6 @@ struct ITypeLibVtbl {
 
 };
 
-#define ITypeLib_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ITypeLib methods ***/ \
-    UINT (STDMETHODCALLTYPE *GetTypeInfoCount)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(INTERFACE *This, UINT index, ITypeInfo** ppTInfo); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeInfoType)(INTERFACE *This, UINT index, TYPEKIND* pTKind); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeInfoOfGuid)(INTERFACE *This, REFGUID guid, ITypeInfo** ppTinfo); \
-    HRESULT (STDMETHODCALLTYPE *GetLibAttr)(INTERFACE *This, TLIBATTR** ppTLibAttr); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeComp)(INTERFACE *This, ITypeComp** ppTComp); \
-    HRESULT (STDMETHODCALLTYPE *GetDocumentation)(INTERFACE *This, INT index, BSTR* pBstrName, BSTR* pBstrDocString, DWORD* pdwHelpContext, BSTR* pBstrHelpFile); \
-    HRESULT (STDMETHODCALLTYPE *IsName)(INTERFACE *This, LPOLESTR szNameBuf, ULONG lHashVal, BOOL* pfName); \
-    HRESULT (STDMETHODCALLTYPE *FindName)(INTERFACE *This, LPOLESTR szNameBuf, ULONG lHashVal, ITypeInfo** ppTInfo, MEMBERID* rgMemId, USHORT* pcFound); \
-    void (STDMETHODCALLTYPE *ReleaseTLibAttr)(INTERFACE *This, TLIBATTR* pTLibAttr);
-
 /*** IUnknown methods ***/
 #define ITypeLib_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ITypeLib_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2338,6 +2326,24 @@ struct ITypeLibVtbl {
 
 #endif
 
+#define ITypeLib_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ITypeLib methods ***/ \
+    STDMETHOD_(UINT,GetTypeInfoCount)(THIS) PURE; \
+    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ UINT index, ITypeInfo** ppTInfo) PURE; \
+    STDMETHOD_(HRESULT,GetTypeInfoType)(THIS_ UINT index, TYPEKIND* pTKind) PURE; \
+    STDMETHOD_(HRESULT,GetTypeInfoOfGuid)(THIS_ REFGUID guid, ITypeInfo** ppTinfo) PURE; \
+    STDMETHOD_(HRESULT,GetLibAttr)(THIS_ TLIBATTR** ppTLibAttr) PURE; \
+    STDMETHOD_(HRESULT,GetTypeComp)(THIS_ ITypeComp** ppTComp) PURE; \
+    STDMETHOD_(HRESULT,GetDocumentation)(THIS_ INT index, BSTR* pBstrName, BSTR* pBstrDocString, DWORD* pdwHelpContext, BSTR* pBstrHelpFile) PURE; \
+    STDMETHOD_(HRESULT,IsName)(THIS_ LPOLESTR szNameBuf, ULONG lHashVal, BOOL* pfName) PURE; \
+    STDMETHOD_(HRESULT,FindName)(THIS_ LPOLESTR szNameBuf, ULONG lHashVal, ITypeInfo** ppTInfo, MEMBERID* rgMemId, USHORT* pcFound) PURE; \
+    STDMETHOD_(void,ReleaseTLibAttr)(THIS_ TLIBATTR* pTLibAttr) PURE;
+
 HRESULT CALLBACK ITypeLib_RemoteGetTypeInfoCount_Proxy(
     ITypeLib* This,
     UINT* pcTInfo);
@@ -2620,28 +2626,6 @@ struct ITypeLib2Vtbl {
 
 };
 
-#define ITypeLib2_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ITypeLib methods ***/ \
-    UINT (STDMETHODCALLTYPE *GetTypeInfoCount)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(INTERFACE *This, UINT index, ITypeInfo** ppTInfo); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeInfoType)(INTERFACE *This, UINT index, TYPEKIND* pTKind); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeInfoOfGuid)(INTERFACE *This, REFGUID guid, ITypeInfo** ppTinfo); \
-    HRESULT (STDMETHODCALLTYPE *GetLibAttr)(INTERFACE *This, TLIBATTR** ppTLibAttr); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeComp)(INTERFACE *This, ITypeComp** ppTComp); \
-    HRESULT (STDMETHODCALLTYPE *GetDocumentation)(INTERFACE *This, INT index, BSTR* pBstrName, BSTR* pBstrDocString, DWORD* pdwHelpContext, BSTR* pBstrHelpFile); \
-    HRESULT (STDMETHODCALLTYPE *IsName)(INTERFACE *This, LPOLESTR szNameBuf, ULONG lHashVal, BOOL* pfName); \
-    HRESULT (STDMETHODCALLTYPE *FindName)(INTERFACE *This, LPOLESTR szNameBuf, ULONG lHashVal, ITypeInfo** ppTInfo, MEMBERID* rgMemId, USHORT* pcFound); \
-    void (STDMETHODCALLTYPE *ReleaseTLibAttr)(INTERFACE *This, TLIBATTR* pTLibAttr); \
-    /*** ITypeLib2 methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetCustData)(INTERFACE *This, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *GetLibStatistics)(INTERFACE *This, ULONG* pcUniqueNames, ULONG* pcchUniqueNames); \
-    HRESULT (STDMETHODCALLTYPE *GetDocumentation2)(INTERFACE *This, INT index, LCID lcid, BSTR* pbstrHelpString, DWORD* pdwHelpStringContext, BSTR* pbstrHelpStringDll); \
-    HRESULT (STDMETHODCALLTYPE *GetAllCustData)(INTERFACE *This, CUSTDATA* pCustData);
-
 /*** IUnknown methods ***/
 #define ITypeLib2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ITypeLib2_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2665,6 +2649,29 @@ struct ITypeLib2Vtbl {
 
 #endif
 
+#define ITypeLib2_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ITypeLib methods ***/ \
+    STDMETHOD_(UINT,GetTypeInfoCount)(THIS) PURE; \
+    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ UINT index, ITypeInfo** ppTInfo) PURE; \
+    STDMETHOD_(HRESULT,GetTypeInfoType)(THIS_ UINT index, TYPEKIND* pTKind) PURE; \
+    STDMETHOD_(HRESULT,GetTypeInfoOfGuid)(THIS_ REFGUID guid, ITypeInfo** ppTinfo) PURE; \
+    STDMETHOD_(HRESULT,GetLibAttr)(THIS_ TLIBATTR** ppTLibAttr) PURE; \
+    STDMETHOD_(HRESULT,GetTypeComp)(THIS_ ITypeComp** ppTComp) PURE; \
+    STDMETHOD_(HRESULT,GetDocumentation)(THIS_ INT index, BSTR* pBstrName, BSTR* pBstrDocString, DWORD* pdwHelpContext, BSTR* pBstrHelpFile) PURE; \
+    STDMETHOD_(HRESULT,IsName)(THIS_ LPOLESTR szNameBuf, ULONG lHashVal, BOOL* pfName) PURE; \
+    STDMETHOD_(HRESULT,FindName)(THIS_ LPOLESTR szNameBuf, ULONG lHashVal, ITypeInfo** ppTInfo, MEMBERID* rgMemId, USHORT* pcFound) PURE; \
+    STDMETHOD_(void,ReleaseTLibAttr)(THIS_ TLIBATTR* pTLibAttr) PURE; \
+    /*** ITypeLib2 methods ***/ \
+    STDMETHOD_(HRESULT,GetCustData)(THIS_ REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,GetLibStatistics)(THIS_ ULONG* pcUniqueNames, ULONG* pcchUniqueNames) PURE; \
+    STDMETHOD_(HRESULT,GetDocumentation2)(THIS_ INT index, LCID lcid, BSTR* pbstrHelpString, DWORD* pdwHelpStringContext, BSTR* pbstrHelpStringDll) PURE; \
+    STDMETHOD_(HRESULT,GetAllCustData)(THIS_ CUSTDATA* pCustData) PURE;
+
 HRESULT CALLBACK ITypeLib2_GetCustData_Proxy(
     ITypeLib2* This,
     REFGUID guid,
@@ -2797,15 +2804,6 @@ struct ITypeChangeEventsVtbl {
 
 };
 
-#define ITypeChangeEvents_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ITypeChangeEvents methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *RequestTypeChange)(INTERFACE *This, CHANGEKIND changeKind, ITypeInfo* pTInfoBefore, LPOLESTR pStrName, INT* pfCancel); \
-    HRESULT (STDMETHODCALLTYPE *AfterTypeChange)(INTERFACE *This, CHANGEKIND changeKind, ITypeInfo* pTInfoAfter, LPOLESTR pStrName);
-
 /*** IUnknown methods ***/
 #define ITypeChangeEvents_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ITypeChangeEvents_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2816,6 +2814,16 @@ struct ITypeChangeEventsVtbl {
 
 #endif
 
+#define ITypeChangeEvents_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ITypeChangeEvents methods ***/ \
+    STDMETHOD_(HRESULT,RequestTypeChange)(THIS_ CHANGEKIND changeKind, ITypeInfo* pTInfoBefore, LPOLESTR pStrName, INT* pfCancel) PURE; \
+    STDMETHOD_(HRESULT,AfterTypeChange)(THIS_ CHANGEKIND changeKind, ITypeInfo* pTInfoAfter, LPOLESTR pStrName) PURE;
+
 HRESULT CALLBACK ITypeChangeEvents_RequestTypeChange_Proxy(
     ITypeChangeEvents* This,
     CHANGEKIND changeKind,
@@ -2907,18 +2915,6 @@ struct IErrorInfoVtbl {
 
 };
 
-#define IErrorInfo_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IErrorInfo methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetGUID)(INTERFACE *This, GUID* pGUID); \
-    HRESULT (STDMETHODCALLTYPE *GetSource)(INTERFACE *This, BSTR* pBstrSource); \
-    HRESULT (STDMETHODCALLTYPE *GetDescription)(INTERFACE *This, BSTR* pBstrDescription); \
-    HRESULT (STDMETHODCALLTYPE *GetHelpFile)(INTERFACE *This, BSTR* pBstrHelpFile); \
-    HRESULT (STDMETHODCALLTYPE *GetHelpContext)(INTERFACE *This, DWORD* pdwHelpContext);
-
 /*** IUnknown methods ***/
 #define IErrorInfo_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IErrorInfo_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2932,6 +2928,19 @@ struct IErrorInfoVtbl {
 
 #endif
 
+#define IErrorInfo_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IErrorInfo methods ***/ \
+    STDMETHOD_(HRESULT,GetGUID)(THIS_ GUID* pGUID) PURE; \
+    STDMETHOD_(HRESULT,GetSource)(THIS_ BSTR* pBstrSource) PURE; \
+    STDMETHOD_(HRESULT,GetDescription)(THIS_ BSTR* pBstrDescription) PURE; \
+    STDMETHOD_(HRESULT,GetHelpFile)(THIS_ BSTR* pBstrHelpFile) PURE; \
+    STDMETHOD_(HRESULT,GetHelpContext)(THIS_ DWORD* pdwHelpContext) PURE;
+
 HRESULT CALLBACK IErrorInfo_GetGUID_Proxy(
     IErrorInfo* This,
     GUID* pGUID);
@@ -3042,18 +3051,6 @@ struct ICreateErrorInfoVtbl {
 
 };
 
-#define ICreateErrorInfo_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ICreateErrorInfo methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *SetGUID)(INTERFACE *This, REFGUID rguid); \
-    HRESULT (STDMETHODCALLTYPE *SetSource)(INTERFACE *This, LPOLESTR szSource); \
-    HRESULT (STDMETHODCALLTYPE *SetDescription)(INTERFACE *This, LPOLESTR szDescription); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpFile)(INTERFACE *This, LPOLESTR szHelpFile); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(INTERFACE *This, DWORD dwHelpContext);
-
 /*** IUnknown methods ***/
 #define ICreateErrorInfo_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ICreateErrorInfo_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -3067,6 +3064,19 @@ struct ICreateErrorInfoVtbl {
 
 #endif
 
+#define ICreateErrorInfo_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ICreateErrorInfo methods ***/ \
+    STDMETHOD_(HRESULT,SetGUID)(THIS_ REFGUID rguid) PURE; \
+    STDMETHOD_(HRESULT,SetSource)(THIS_ LPOLESTR szSource) PURE; \
+    STDMETHOD_(HRESULT,SetDescription)(THIS_ LPOLESTR szDescription) PURE; \
+    STDMETHOD_(HRESULT,SetHelpFile)(THIS_ LPOLESTR szHelpFile) PURE; \
+    STDMETHOD_(HRESULT,SetHelpContext)(THIS_ DWORD dwHelpContext) PURE;
+
 HRESULT CALLBACK ICreateErrorInfo_SetGUID_Proxy(
     ICreateErrorInfo* This,
     REFGUID rguid);
@@ -3149,14 +3159,6 @@ struct ISupportErrorInfoVtbl {
 
 };
 
-#define ISupportErrorInfo_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ISupportErrorInfo methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *InterfaceSupportsErrorInfo)(INTERFACE *This, REFIID riid);
-
 /*** IUnknown methods ***/
 #define ISupportErrorInfo_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ISupportErrorInfo_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -3166,6 +3168,15 @@ struct ISupportErrorInfoVtbl {
 
 #endif
 
+#define ISupportErrorInfo_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ISupportErrorInfo methods ***/ \
+    STDMETHOD_(HRESULT,InterfaceSupportsErrorInfo)(THIS_ REFIID riid) PURE;
+
 HRESULT CALLBACK ISupportErrorInfo_InterfaceSupportsErrorInfo_Proxy(
     ISupportErrorInfo* This,
     REFIID riid);
@@ -3218,14 +3229,6 @@ struct ITypeFactoryVtbl {
 
 };
 
-#define ITypeFactory_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ITypeFactory methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *CreateFromTypeInfo)(INTERFACE *This, ITypeInfo* pTypeInfo, REFIID riid, IUnknown** ppv);
-
 /*** IUnknown methods ***/
 #define ITypeFactory_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ITypeFactory_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -3235,6 +3238,15 @@ struct ITypeFactoryVtbl {
 
 #endif
 
+#define ITypeFactory_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ITypeFactory methods ***/ \
+    STDMETHOD_(HRESULT,CreateFromTypeInfo)(THIS_ ITypeInfo* pTypeInfo, REFIID riid, IUnknown** ppv) PURE;
+
 HRESULT CALLBACK ITypeFactory_CreateFromTypeInfo_Proxy(
     ITypeFactory* This,
     ITypeInfo* pTypeInfo,
@@ -3330,17 +3342,6 @@ struct ITypeMarshalVtbl {
 
 };
 
-#define ITypeMarshal_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ITypeMarshal methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Size)(INTERFACE *This, PVOID pvType, DWORD dwDestContext, PVOID pvDestContext, ULONG* pSize); \
-    HRESULT (STDMETHODCALLTYPE *Marshal)(INTERFACE *This, PVOID pvType, DWORD dwDestContext, PVOID pvDestContext, ULONG cbBufferLength, BYTE* pBuffer, ULONG* pcbWritten); \
-    HRESULT (STDMETHODCALLTYPE *Unmarshal)(INTERFACE *This, PVOID pvType, DWORD dwFlags, ULONG cbBufferLength, BYTE* pBuffer, ULONG* pcbRead); \
-    HRESULT (STDMETHODCALLTYPE *Free)(INTERFACE *This, PVOID pvType);
-
 /*** IUnknown methods ***/
 #define ITypeMarshal_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ITypeMarshal_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -3353,6 +3354,18 @@ struct ITypeMarshalVtbl {
 
 #endif
 
+#define ITypeMarshal_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ITypeMarshal methods ***/ \
+    STDMETHOD_(HRESULT,Size)(THIS_ PVOID pvType, DWORD dwDestContext, PVOID pvDestContext, ULONG* pSize) PURE; \
+    STDMETHOD_(HRESULT,Marshal)(THIS_ PVOID pvType, DWORD dwDestContext, PVOID pvDestContext, ULONG cbBufferLength, BYTE* pBuffer, ULONG* pcbWritten) PURE; \
+    STDMETHOD_(HRESULT,Unmarshal)(THIS_ PVOID pvType, DWORD dwFlags, ULONG cbBufferLength, BYTE* pBuffer, ULONG* pcbRead) PURE; \
+    STDMETHOD_(HRESULT,Free)(THIS_ PVOID pvType) PURE;
+
 HRESULT CALLBACK ITypeMarshal_Size_Proxy(
     ITypeMarshal* This,
     PVOID pvType,
@@ -3570,29 +3583,6 @@ struct IRecordInfoVtbl {
 
 };
 
-#define IRecordInfo_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IRecordInfo methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *RecordInit)(INTERFACE *This, PVOID pvNew); \
-    HRESULT (STDMETHODCALLTYPE *RecordClear)(INTERFACE *This, PVOID pvExisting); \
-    HRESULT (STDMETHODCALLTYPE *RecordCopy)(INTERFACE *This, PVOID pvExisting, PVOID pvNew); \
-    HRESULT (STDMETHODCALLTYPE *GetGuid)(INTERFACE *This, GUID* pguid); \
-    HRESULT (STDMETHODCALLTYPE *GetName)(INTERFACE *This, BSTR* pbstrName); \
-    HRESULT (STDMETHODCALLTYPE *GetSize)(INTERFACE *This, ULONG* pcbSize); \
-    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(INTERFACE *This, ITypeInfo** ppTypeInfo); \
-    HRESULT (STDMETHODCALLTYPE *GetField)(INTERFACE *This, PVOID pvData, LPCOLESTR szFieldName, VARIANT* pvarField); \
-    HRESULT (STDMETHODCALLTYPE *GetFieldNoCopy)(INTERFACE *This, PVOID pvData, LPCOLESTR szFieldName, VARIANT* pvarField, PVOID* ppvDataCArray); \
-    HRESULT (STDMETHODCALLTYPE *PutField)(INTERFACE *This, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT* pvarField); \
-    HRESULT (STDMETHODCALLTYPE *PutFieldNoCopy)(INTERFACE *This, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT* pvarField); \
-    HRESULT (STDMETHODCALLTYPE *GetFieldNames)(INTERFACE *This, ULONG* pcNames, BSTR* rgBstrNames); \
-    BOOL (STDMETHODCALLTYPE *IsMatchingType)(INTERFACE *This, IRecordInfo* pRecordInfo); \
-    PVOID (STDMETHODCALLTYPE *RecordCreate)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *RecordCreateCopy)(INTERFACE *This, PVOID pvSource, PVOID* ppvDest); \
-    HRESULT (STDMETHODCALLTYPE *RecordDestroy)(INTERFACE *This, PVOID pvRecord);
-
 /*** IUnknown methods ***/
 #define IRecordInfo_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IRecordInfo_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -3617,6 +3607,30 @@ struct IRecordInfoVtbl {
 
 #endif
 
+#define IRecordInfo_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IRecordInfo methods ***/ \
+    STDMETHOD_(HRESULT,RecordInit)(THIS_ PVOID pvNew) PURE; \
+    STDMETHOD_(HRESULT,RecordClear)(THIS_ PVOID pvExisting) PURE; \
+    STDMETHOD_(HRESULT,RecordCopy)(THIS_ PVOID pvExisting, PVOID pvNew) PURE; \
+    STDMETHOD_(HRESULT,GetGuid)(THIS_ GUID* pguid) PURE; \
+    STDMETHOD_(HRESULT,GetName)(THIS_ BSTR* pbstrName) PURE; \
+    STDMETHOD_(HRESULT,GetSize)(THIS_ ULONG* pcbSize) PURE; \
+    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ ITypeInfo** ppTypeInfo) PURE; \
+    STDMETHOD_(HRESULT,GetField)(THIS_ PVOID pvData, LPCOLESTR szFieldName, VARIANT* pvarField) PURE; \
+    STDMETHOD_(HRESULT,GetFieldNoCopy)(THIS_ PVOID pvData, LPCOLESTR szFieldName, VARIANT* pvarField, PVOID* ppvDataCArray) PURE; \
+    STDMETHOD_(HRESULT,PutField)(THIS_ ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT* pvarField) PURE; \
+    STDMETHOD_(HRESULT,PutFieldNoCopy)(THIS_ ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT* pvarField) PURE; \
+    STDMETHOD_(HRESULT,GetFieldNames)(THIS_ ULONG* pcNames, BSTR* rgBstrNames) PURE; \
+    STDMETHOD_(BOOL,IsMatchingType)(THIS_ IRecordInfo* pRecordInfo) PURE; \
+    STDMETHOD_(PVOID,RecordCreate)(THIS) PURE; \
+    STDMETHOD_(HRESULT,RecordCreateCopy)(THIS_ PVOID pvSource, PVOID* ppvDest) PURE; \
+    STDMETHOD_(HRESULT,RecordDestroy)(THIS_ PVOID pvRecord) PURE;
+
 HRESULT CALLBACK IRecordInfo_RecordInit_Proxy(
     IRecordInfo* This,
     PVOID pvNew);
@@ -3985,36 +3999,6 @@ struct ICreateTypeInfoVtbl {
 
 };
 
-#define ICreateTypeInfo_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ICreateTypeInfo methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *SetGuid)(INTERFACE *This, REFGUID guid); \
-    HRESULT (STDMETHODCALLTYPE *SetTypeFlags)(INTERFACE *This, UINT uTypeFlags); \
-    HRESULT (STDMETHODCALLTYPE *SetDocString)(INTERFACE *This, LPOLESTR pStrDoc); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(INTERFACE *This, DWORD dwHelpContext); \
-    HRESULT (STDMETHODCALLTYPE *SetVersion)(INTERFACE *This, WORD wMajorVerNum, WORD wMinorVerNum); \
-    HRESULT (STDMETHODCALLTYPE *AddRefTypeInfo)(INTERFACE *This, ITypeInfo* pTInfo, HREFTYPE* phRefType); \
-    HRESULT (STDMETHODCALLTYPE *AddFuncDesc)(INTERFACE *This, UINT index, FUNCDESC* pFuncDesc); \
-    HRESULT (STDMETHODCALLTYPE *AddImplType)(INTERFACE *This, UINT index, HREFTYPE hRefType); \
-    HRESULT (STDMETHODCALLTYPE *SetImplTypeFlags)(INTERFACE *This, UINT index, INT implTypeFlags); \
-    HRESULT (STDMETHODCALLTYPE *SetAlignment)(INTERFACE *This, WORD cbAlignment); \
-    HRESULT (STDMETHODCALLTYPE *SetSchema)(INTERFACE *This, LPOLESTR pStrSchema); \
-    HRESULT (STDMETHODCALLTYPE *AddVarDesc)(INTERFACE *This, UINT index, VARDESC* pVarDesc); \
-    HRESULT (STDMETHODCALLTYPE *SetFuncAndParamNames)(INTERFACE *This, UINT index, LPOLESTR* rgszNames, UINT cNames); \
-    HRESULT (STDMETHODCALLTYPE *SetVarName)(INTERFACE *This, UINT index, LPOLESTR szName); \
-    HRESULT (STDMETHODCALLTYPE *SetTypeDescAlias)(INTERFACE *This, TYPEDESC* pTDescAlias); \
-    HRESULT (STDMETHODCALLTYPE *DefineFuncAsDllEntry)(INTERFACE *This, UINT index, LPOLESTR szDllName, LPOLESTR szProcName); \
-    HRESULT (STDMETHODCALLTYPE *SetFuncDocString)(INTERFACE *This, UINT index, LPOLESTR szDocString); \
-    HRESULT (STDMETHODCALLTYPE *SetVarDocString)(INTERFACE *This, UINT index, LPOLESTR szDocString); \
-    HRESULT (STDMETHODCALLTYPE *SetFuncHelpContext)(INTERFACE *This, UINT index, DWORD dwHelpContext); \
-    HRESULT (STDMETHODCALLTYPE *SetVarHelpContext)(INTERFACE *This, UINT index, DWORD dwHelpContext); \
-    HRESULT (STDMETHODCALLTYPE *SetMops)(INTERFACE *This, UINT index, BSTR bstrMops); \
-    HRESULT (STDMETHODCALLTYPE *SetTypeIdldesc)(INTERFACE *This, IDLDESC* pIdlDesc); \
-    HRESULT (STDMETHODCALLTYPE *LayOut)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define ICreateTypeInfo_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ICreateTypeInfo_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -4046,6 +4030,37 @@ struct ICreateTypeInfoVtbl {
 
 #endif
 
+#define ICreateTypeInfo_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ICreateTypeInfo methods ***/ \
+    STDMETHOD_(HRESULT,SetGuid)(THIS_ REFGUID guid) PURE; \
+    STDMETHOD_(HRESULT,SetTypeFlags)(THIS_ UINT uTypeFlags) PURE; \
+    STDMETHOD_(HRESULT,SetDocString)(THIS_ LPOLESTR pStrDoc) PURE; \
+    STDMETHOD_(HRESULT,SetHelpContext)(THIS_ DWORD dwHelpContext) PURE; \
+    STDMETHOD_(HRESULT,SetVersion)(THIS_ WORD wMajorVerNum, WORD wMinorVerNum) PURE; \
+    STDMETHOD_(HRESULT,AddRefTypeInfo)(THIS_ ITypeInfo* pTInfo, HREFTYPE* phRefType) PURE; \
+    STDMETHOD_(HRESULT,AddFuncDesc)(THIS_ UINT index, FUNCDESC* pFuncDesc) PURE; \
+    STDMETHOD_(HRESULT,AddImplType)(THIS_ UINT index, HREFTYPE hRefType) PURE; \
+    STDMETHOD_(HRESULT,SetImplTypeFlags)(THIS_ UINT index, INT implTypeFlags) PURE; \
+    STDMETHOD_(HRESULT,SetAlignment)(THIS_ WORD cbAlignment) PURE; \
+    STDMETHOD_(HRESULT,SetSchema)(THIS_ LPOLESTR pStrSchema) PURE; \
+    STDMETHOD_(HRESULT,AddVarDesc)(THIS_ UINT index, VARDESC* pVarDesc) PURE; \
+    STDMETHOD_(HRESULT,SetFuncAndParamNames)(THIS_ UINT index, LPOLESTR* rgszNames, UINT cNames) PURE; \
+    STDMETHOD_(HRESULT,SetVarName)(THIS_ UINT index, LPOLESTR szName) PURE; \
+    STDMETHOD_(HRESULT,SetTypeDescAlias)(THIS_ TYPEDESC* pTDescAlias) PURE; \
+    STDMETHOD_(HRESULT,DefineFuncAsDllEntry)(THIS_ UINT index, LPOLESTR szDllName, LPOLESTR szProcName) PURE; \
+    STDMETHOD_(HRESULT,SetFuncDocString)(THIS_ UINT index, LPOLESTR szDocString) PURE; \
+    STDMETHOD_(HRESULT,SetVarDocString)(THIS_ UINT index, LPOLESTR szDocString) PURE; \
+    STDMETHOD_(HRESULT,SetFuncHelpContext)(THIS_ UINT index, DWORD dwHelpContext) PURE; \
+    STDMETHOD_(HRESULT,SetVarHelpContext)(THIS_ UINT index, DWORD dwHelpContext) PURE; \
+    STDMETHOD_(HRESULT,SetMops)(THIS_ UINT index, BSTR bstrMops) PURE; \
+    STDMETHOD_(HRESULT,SetTypeIdldesc)(THIS_ IDLDESC* pIdlDesc) PURE; \
+    STDMETHOD_(HRESULT,LayOut)(THIS) PURE;
+
 HRESULT CALLBACK ICreateTypeInfo_SetGuid_Proxy(
     ICreateTypeInfo* This,
     REFGUID guid);
@@ -4518,52 +4533,6 @@ struct ICreateTypeInfo2Vtbl {
 
 };
 
-#define ICreateTypeInfo2_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ICreateTypeInfo methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *SetGuid)(INTERFACE *This, REFGUID guid); \
-    HRESULT (STDMETHODCALLTYPE *SetTypeFlags)(INTERFACE *This, UINT uTypeFlags); \
-    HRESULT (STDMETHODCALLTYPE *SetDocString)(INTERFACE *This, LPOLESTR pStrDoc); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(INTERFACE *This, DWORD dwHelpContext); \
-    HRESULT (STDMETHODCALLTYPE *SetVersion)(INTERFACE *This, WORD wMajorVerNum, WORD wMinorVerNum); \
-    HRESULT (STDMETHODCALLTYPE *AddRefTypeInfo)(INTERFACE *This, ITypeInfo* pTInfo, HREFTYPE* phRefType); \
-    HRESULT (STDMETHODCALLTYPE *AddFuncDesc)(INTERFACE *This, UINT index, FUNCDESC* pFuncDesc); \
-    HRESULT (STDMETHODCALLTYPE *AddImplType)(INTERFACE *This, UINT index, HREFTYPE hRefType); \
-    HRESULT (STDMETHODCALLTYPE *SetImplTypeFlags)(INTERFACE *This, UINT index, INT implTypeFlags); \
-    HRESULT (STDMETHODCALLTYPE *SetAlignment)(INTERFACE *This, WORD cbAlignment); \
-    HRESULT (STDMETHODCALLTYPE *SetSchema)(INTERFACE *This, LPOLESTR pStrSchema); \
-    HRESULT (STDMETHODCALLTYPE *AddVarDesc)(INTERFACE *This, UINT index, VARDESC* pVarDesc); \
-    HRESULT (STDMETHODCALLTYPE *SetFuncAndParamNames)(INTERFACE *This, UINT index, LPOLESTR* rgszNames, UINT cNames); \
-    HRESULT (STDMETHODCALLTYPE *SetVarName)(INTERFACE *This, UINT index, LPOLESTR szName); \
-    HRESULT (STDMETHODCALLTYPE *SetTypeDescAlias)(INTERFACE *This, TYPEDESC* pTDescAlias); \
-    HRESULT (STDMETHODCALLTYPE *DefineFuncAsDllEntry)(INTERFACE *This, UINT index, LPOLESTR szDllName, LPOLESTR szProcName); \
-    HRESULT (STDMETHODCALLTYPE *SetFuncDocString)(INTERFACE *This, UINT index, LPOLESTR szDocString); \
-    HRESULT (STDMETHODCALLTYPE *SetVarDocString)(INTERFACE *This, UINT index, LPOLESTR szDocString); \
-    HRESULT (STDMETHODCALLTYPE *SetFuncHelpContext)(INTERFACE *This, UINT index, DWORD dwHelpContext); \
-    HRESULT (STDMETHODCALLTYPE *SetVarHelpContext)(INTERFACE *This, UINT index, DWORD dwHelpContext); \
-    HRESULT (STDMETHODCALLTYPE *SetMops)(INTERFACE *This, UINT index, BSTR bstrMops); \
-    HRESULT (STDMETHODCALLTYPE *SetTypeIdldesc)(INTERFACE *This, IDLDESC* pIdlDesc); \
-    HRESULT (STDMETHODCALLTYPE *LayOut)(INTERFACE *This); \
-    /*** ICreateTypeInfo2 methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *DeleteFuncDesc)(INTERFACE *This, UINT index); \
-    HRESULT (STDMETHODCALLTYPE *DeleteFuncDescByMemId)(INTERFACE *This, MEMBERID memid, INVOKEKIND invKind); \
-    HRESULT (STDMETHODCALLTYPE *DeleteVarDesc)(INTERFACE *This, UINT index); \
-    HRESULT (STDMETHODCALLTYPE *DeleteVarDescByMemId)(INTERFACE *This, MEMBERID memid); \
-    HRESULT (STDMETHODCALLTYPE *DeleteImplType)(INTERFACE *This, UINT index); \
-    HRESULT (STDMETHODCALLTYPE *SetCustData)(INTERFACE *This, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *SetFuncCustData)(INTERFACE *This, UINT index, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *SetParamCustData)(INTERFACE *This, UINT indexFunc, UINT indexParam, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *SetVarCustData)(INTERFACE *This, UINT index, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *SetImplTypeCustData)(INTERFACE *This, UINT index, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpStringContext)(INTERFACE *This, ULONG dwHelpStringContext); \
-    HRESULT (STDMETHODCALLTYPE *SetFuncHelpStringContext)(INTERFACE *This, UINT index, ULONG dwHelpStringContext); \
-    HRESULT (STDMETHODCALLTYPE *SetVarHelpStringContext)(INTERFACE *This, UINT index, ULONG dwHelpStringContext); \
-    HRESULT (STDMETHODCALLTYPE *Invalidate)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *SetName)(INTERFACE *This, LPOLESTR szName);
-
 /*** IUnknown methods ***/
 #define ICreateTypeInfo2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ICreateTypeInfo2_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -4611,6 +4580,53 @@ struct ICreateTypeInfo2Vtbl {
 
 #endif
 
+#define ICreateTypeInfo2_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ICreateTypeInfo methods ***/ \
+    STDMETHOD_(HRESULT,SetGuid)(THIS_ REFGUID guid) PURE; \
+    STDMETHOD_(HRESULT,SetTypeFlags)(THIS_ UINT uTypeFlags) PURE; \
+    STDMETHOD_(HRESULT,SetDocString)(THIS_ LPOLESTR pStrDoc) PURE; \
+    STDMETHOD_(HRESULT,SetHelpContext)(THIS_ DWORD dwHelpContext) PURE; \
+    STDMETHOD_(HRESULT,SetVersion)(THIS_ WORD wMajorVerNum, WORD wMinorVerNum) PURE; \
+    STDMETHOD_(HRESULT,AddRefTypeInfo)(THIS_ ITypeInfo* pTInfo, HREFTYPE* phRefType) PURE; \
+    STDMETHOD_(HRESULT,AddFuncDesc)(THIS_ UINT index, FUNCDESC* pFuncDesc) PURE; \
+    STDMETHOD_(HRESULT,AddImplType)(THIS_ UINT index, HREFTYPE hRefType) PURE; \
+    STDMETHOD_(HRESULT,SetImplTypeFlags)(THIS_ UINT index, INT implTypeFlags) PURE; \
+    STDMETHOD_(HRESULT,SetAlignment)(THIS_ WORD cbAlignment) PURE; \
+    STDMETHOD_(HRESULT,SetSchema)(THIS_ LPOLESTR pStrSchema) PURE; \
+    STDMETHOD_(HRESULT,AddVarDesc)(THIS_ UINT index, VARDESC* pVarDesc) PURE; \
+    STDMETHOD_(HRESULT,SetFuncAndParamNames)(THIS_ UINT index, LPOLESTR* rgszNames, UINT cNames) PURE; \
+    STDMETHOD_(HRESULT,SetVarName)(THIS_ UINT index, LPOLESTR szName) PURE; \
+    STDMETHOD_(HRESULT,SetTypeDescAlias)(THIS_ TYPEDESC* pTDescAlias) PURE; \
+    STDMETHOD_(HRESULT,DefineFuncAsDllEntry)(THIS_ UINT index, LPOLESTR szDllName, LPOLESTR szProcName) PURE; \
+    STDMETHOD_(HRESULT,SetFuncDocString)(THIS_ UINT index, LPOLESTR szDocString) PURE; \
+    STDMETHOD_(HRESULT,SetVarDocString)(THIS_ UINT index, LPOLESTR szDocString) PURE; \
+    STDMETHOD_(HRESULT,SetFuncHelpContext)(THIS_ UINT index, DWORD dwHelpContext) PURE; \
+    STDMETHOD_(HRESULT,SetVarHelpContext)(THIS_ UINT index, DWORD dwHelpContext) PURE; \
+    STDMETHOD_(HRESULT,SetMops)(THIS_ UINT index, BSTR bstrMops) PURE; \
+    STDMETHOD_(HRESULT,SetTypeIdldesc)(THIS_ IDLDESC* pIdlDesc) PURE; \
+    STDMETHOD_(HRESULT,LayOut)(THIS) PURE; \
+    /*** ICreateTypeInfo2 methods ***/ \
+    STDMETHOD_(HRESULT,DeleteFuncDesc)(THIS_ UINT index) PURE; \
+    STDMETHOD_(HRESULT,DeleteFuncDescByMemId)(THIS_ MEMBERID memid, INVOKEKIND invKind) PURE; \
+    STDMETHOD_(HRESULT,DeleteVarDesc)(THIS_ UINT index) PURE; \
+    STDMETHOD_(HRESULT,DeleteVarDescByMemId)(THIS_ MEMBERID memid) PURE; \
+    STDMETHOD_(HRESULT,DeleteImplType)(THIS_ UINT index) PURE; \
+    STDMETHOD_(HRESULT,SetCustData)(THIS_ REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,SetFuncCustData)(THIS_ UINT index, REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,SetParamCustData)(THIS_ UINT indexFunc, UINT indexParam, REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,SetVarCustData)(THIS_ UINT index, REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,SetImplTypeCustData)(THIS_ UINT index, REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,SetHelpStringContext)(THIS_ ULONG dwHelpStringContext) PURE; \
+    STDMETHOD_(HRESULT,SetFuncHelpStringContext)(THIS_ UINT index, ULONG dwHelpStringContext) PURE; \
+    STDMETHOD_(HRESULT,SetVarHelpStringContext)(THIS_ UINT index, ULONG dwHelpStringContext) PURE; \
+    STDMETHOD_(HRESULT,Invalidate)(THIS) PURE; \
+    STDMETHOD_(HRESULT,SetName)(THIS_ LPOLESTR szName) PURE;
+
 HRESULT CALLBACK ICreateTypeInfo2_DeleteFuncDesc_Proxy(
     ICreateTypeInfo2* This,
     UINT index);
@@ -4853,23 +4869,6 @@ struct ICreateTypeLibVtbl {
 
 };
 
-#define ICreateTypeLib_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ICreateTypeLib methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *CreateTypeInfo)(INTERFACE *This, LPOLESTR szName, TYPEKIND tkind, ICreateTypeInfo** ppCTInfo); \
-    HRESULT (STDMETHODCALLTYPE *SetName)(INTERFACE *This, LPOLESTR szName); \
-    HRESULT (STDMETHODCALLTYPE *SetVersion)(INTERFACE *This, WORD wMajorVerNum, WORD wMinorVerNum); \
-    HRESULT (STDMETHODCALLTYPE *SetGuid)(INTERFACE *This, REFGUID guid); \
-    HRESULT (STDMETHODCALLTYPE *SetDocString)(INTERFACE *This, LPOLESTR szDoc); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpFileName)(INTERFACE *This, LPOLESTR szHelpFileName); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(INTERFACE *This, DWORD dwHelpContext); \
-    HRESULT (STDMETHODCALLTYPE *SetLcid)(INTERFACE *This, LCID lcid); \
-    HRESULT (STDMETHODCALLTYPE *SetLibFlags)(INTERFACE *This, UINT uLibFlags); \
-    HRESULT (STDMETHODCALLTYPE *SaveAllChanges)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define ICreateTypeLib_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ICreateTypeLib_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -4888,6 +4887,24 @@ struct ICreateTypeLibVtbl {
 
 #endif
 
+#define ICreateTypeLib_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ICreateTypeLib methods ***/ \
+    STDMETHOD_(HRESULT,CreateTypeInfo)(THIS_ LPOLESTR szName, TYPEKIND tkind, ICreateTypeInfo** ppCTInfo) PURE; \
+    STDMETHOD_(HRESULT,SetName)(THIS_ LPOLESTR szName) PURE; \
+    STDMETHOD_(HRESULT,SetVersion)(THIS_ WORD wMajorVerNum, WORD wMinorVerNum) PURE; \
+    STDMETHOD_(HRESULT,SetGuid)(THIS_ REFGUID guid) PURE; \
+    STDMETHOD_(HRESULT,SetDocString)(THIS_ LPOLESTR szDoc) PURE; \
+    STDMETHOD_(HRESULT,SetHelpFileName)(THIS_ LPOLESTR szHelpFileName) PURE; \
+    STDMETHOD_(HRESULT,SetHelpContext)(THIS_ DWORD dwHelpContext) PURE; \
+    STDMETHOD_(HRESULT,SetLcid)(THIS_ LCID lcid) PURE; \
+    STDMETHOD_(HRESULT,SetLibFlags)(THIS_ UINT uLibFlags) PURE; \
+    STDMETHOD_(HRESULT,SaveAllChanges)(THIS) PURE;
+
 HRESULT CALLBACK ICreateTypeLib_CreateTypeInfo_Proxy(
     ICreateTypeLib* This,
     LPOLESTR szName,
@@ -5078,28 +5095,6 @@ struct ICreateTypeLib2Vtbl {
 
 };
 
-#define ICreateTypeLib2_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ICreateTypeLib methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *CreateTypeInfo)(INTERFACE *This, LPOLESTR szName, TYPEKIND tkind, ICreateTypeInfo** ppCTInfo); \
-    HRESULT (STDMETHODCALLTYPE *SetName)(INTERFACE *This, LPOLESTR szName); \
-    HRESULT (STDMETHODCALLTYPE *SetVersion)(INTERFACE *This, WORD wMajorVerNum, WORD wMinorVerNum); \
-    HRESULT (STDMETHODCALLTYPE *SetGuid)(INTERFACE *This, REFGUID guid); \
-    HRESULT (STDMETHODCALLTYPE *SetDocString)(INTERFACE *This, LPOLESTR szDoc); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpFileName)(INTERFACE *This, LPOLESTR szHelpFileName); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(INTERFACE *This, DWORD dwHelpContext); \
-    HRESULT (STDMETHODCALLTYPE *SetLcid)(INTERFACE *This, LCID lcid); \
-    HRESULT (STDMETHODCALLTYPE *SetLibFlags)(INTERFACE *This, UINT uLibFlags); \
-    HRESULT (STDMETHODCALLTYPE *SaveAllChanges)(INTERFACE *This); \
-    /*** ICreateTypeLib2 methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *DeleteTypeInfo)(INTERFACE *This, LPOLESTR szName); \
-    HRESULT (STDMETHODCALLTYPE *SetCustData)(INTERFACE *This, REFGUID guid, VARIANT* pVarVal); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpStringContext)(INTERFACE *This, ULONG dwHelpStringContext); \
-    HRESULT (STDMETHODCALLTYPE *SetHelpStringDll)(INTERFACE *This, LPOLESTR szFileName);
-
 /*** IUnknown methods ***/
 #define ICreateTypeLib2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ICreateTypeLib2_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -5123,6 +5118,29 @@ struct ICreateTypeLib2Vtbl {
 
 #endif
 
+#define ICreateTypeLib2_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ICreateTypeLib methods ***/ \
+    STDMETHOD_(HRESULT,CreateTypeInfo)(THIS_ LPOLESTR szName, TYPEKIND tkind, ICreateTypeInfo** ppCTInfo) PURE; \
+    STDMETHOD_(HRESULT,SetName)(THIS_ LPOLESTR szName) PURE; \
+    STDMETHOD_(HRESULT,SetVersion)(THIS_ WORD wMajorVerNum, WORD wMinorVerNum) PURE; \
+    STDMETHOD_(HRESULT,SetGuid)(THIS_ REFGUID guid) PURE; \
+    STDMETHOD_(HRESULT,SetDocString)(THIS_ LPOLESTR szDoc) PURE; \
+    STDMETHOD_(HRESULT,SetHelpFileName)(THIS_ LPOLESTR szHelpFileName) PURE; \
+    STDMETHOD_(HRESULT,SetHelpContext)(THIS_ DWORD dwHelpContext) PURE; \
+    STDMETHOD_(HRESULT,SetLcid)(THIS_ LCID lcid) PURE; \
+    STDMETHOD_(HRESULT,SetLibFlags)(THIS_ UINT uLibFlags) PURE; \
+    STDMETHOD_(HRESULT,SaveAllChanges)(THIS) PURE; \
+    /*** ICreateTypeLib2 methods ***/ \
+    STDMETHOD_(HRESULT,DeleteTypeInfo)(THIS_ LPOLESTR szName) PURE; \
+    STDMETHOD_(HRESULT,SetCustData)(THIS_ REFGUID guid, VARIANT* pVarVal) PURE; \
+    STDMETHOD_(HRESULT,SetHelpStringContext)(THIS_ ULONG dwHelpStringContext) PURE; \
+    STDMETHOD_(HRESULT,SetHelpStringDll)(THIS_ LPOLESTR szFileName) PURE;
+
 HRESULT CALLBACK ICreateTypeLib2_DeleteTypeInfo_Proxy(
     ICreateTypeLib2* This,
     LPOLESTR szName);
diff --git a/include/objbase.h b/include/objbase.h
index 12ed88d06a..f0588b9405 100644
--- a/include/objbase.h
+++ b/include/objbase.h
@@ -75,15 +75,13 @@
  *
  *    #define INTERFACE IDirect3D
  *    #define IDirect3D_METHODS \
+ *        IUnknown_METHODS \
  *        STDMETHOD(Initialize)(THIS_ REFIID) PURE; \
  *        STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK, LPVOID) PURE; \
  *        STDMETHOD(CreateLight)(THIS_ LPDIRECT3DLIGHT*, IUnknown*) PURE; \
  *        STDMETHOD(CreateMaterial)(THIS_ LPDIRECT3DMATERIAL*, IUnknown*) PURE; \
  *        STDMETHOD(CreateViewport)(THIS_ LPDIRECT3DVIEWPORT*, IUnknown*) PURE; \
  *        STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT) PURE;
- *    #define IDirect3D_IMETHODS \
- *        IUnknown_IMETHODS \
- *        IDirect3D_METHODS
  *    ICOM_DEFINE(IDirect3D,IUnknown)
  *    #undef INTERFACE
  *
@@ -107,16 +105,12 @@
  *    name everywhere. Note however that because of the way macros work, a macro like STDMETHOD
  *    cannot use 'INTERFACE##_VTABLE' because this would give 'INTERFACE_VTABLE' and not
  *    'IDirect3D_VTABLE'.
- *  - ICOM_METHODS defines the methods specific to this interface. It is then aggregated with the
- *    inherited methods to form ICOM_IMETHODS.
- *  - ICOM_IMETHODS defines the list of methods that are inheritable from this interface. It must
+ *  - ICOM_METHODS defines the list of methods that are inheritable from this interface. It must
  *    be written manually (rather than using a macro to generate the equivalent code) to avoid
- *    macro recursion (which compilers don't like).
+ *    macro recursion (which compilers don't like). It must start with the METHODS definition
+ *    of the parent interface so that method inheritance works properly.
  *  - The ICOM_DEFINE finally declares all the structures necessary for the interface. We have to
  *    explicitly use the interface name for macro expansion reasons again.
- *    Inherited methods are inherited in C by using the IDirect3D_METHODS macro and the parent's
- *    Xxx_IMETHODS macro. In C++ we need only use the IDirect3D_METHODS since method inheritance
- *    is taken care of by the language.
  *  - The 'undef INTERFACE' is here to remind you that using INTERFACE in the following macros
  *    will not work.
  *  - Finally the set of 'IDirect3D_Xxx' macros is a standard set of macros defined to ease access
@@ -166,7 +160,7 @@
  *    the user needs to know to use the interface. Of course the structure we will define to
  *    implement this interface will have more fields but the first one will match this pointer.
  *  - The code generated by ICOM_DEFINE defines both the structure representing the interface and
- *    the structure for the jump table. ICOM_DEFINE uses the parent's Xxx_IMETHODS macro to
+ *    the structure for the jump table. ICOM_DEFINE uses the parent's Xxx_METHODS macro to
  *    automatically repeat the prototypes of all the inherited methods and then uses IDirect3D_METHODS
  *    to define the IDirect3D methods.
  *  - Each method is declared as a pointer to function field in the jump table. The implementation
@@ -258,13 +252,6 @@
 #define BEGIN_INTERFACE
 #define END_INTERFACE
 
-/* Wine-specific macros */
-
-#define ICOM_DEFINE(iface,ibase) \
-    DECLARE_INTERFACE_(iface,ibase) { \
-        iface##_METHODS \
-    } ICOM_COM_INTERFACE_ATTRIBUTE;
-
 #else  /* __cplusplus && !CINTERFACE */
 
 /* C interface */
@@ -302,14 +289,12 @@
 #define BEGIN_INTERFACE
 #define END_INTERFACE
 
+#endif  /* __cplusplus && !CINTERFACE */
+
 /* Wine-specific macros */
 
 #define ICOM_DEFINE(iface,ibase) \
-    DECLARE_INTERFACE_(iface,ibase) { \
-        ICOM_MSVTABLE_COMPAT_FIELDS \
-        ibase##_IMETHODS \
-        iface##_METHODS \
-    };
+    DECLARE_INTERFACE_(iface,ibase) { iface##_METHODS } ICOM_COM_INTERFACE_ATTRIBUTE;
 
 #define ICOM_VTABLE(iface)       iface##Vtbl
 #define ICOM_VFIELD(iface)       ICOM_VTABLE(iface)* lpVtbl
@@ -320,8 +305,6 @@
 #define ICOM_THIS_MULTI(impl,field,iface)  impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
 #define ICOM_CTHIS_MULTI(impl,field,iface) const impl* const This=(const impl*)((char*)(iface) - offsetof(impl,field))
 
-#endif  /* __cplusplus && !CINTERFACE */
-
 #include "objidl.h"
 
 #ifndef RC_INVOKED
diff --git a/include/objidl.h b/include/objidl.h
index fcadda6aa4..26964016c3 100644
--- a/include/objidl.h
+++ b/include/objidl.h
@@ -125,19 +125,6 @@ struct IMarshalVtbl {
 
 };
 
-#define IMarshal_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IMarshal methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetUnmarshalClass)(INTERFACE *This, REFIID riid, void* pv, DWORD dwDestContext, void* pvDestContext, DWORD mshlflags, CLSID* pCid); \
-    HRESULT (STDMETHODCALLTYPE *GetMarshalSizeMax)(INTERFACE *This, REFIID riid, void* pv, DWORD dwDestContext, void* pvDestContext, DWORD mshlflags, DWORD* pSize); \
-    HRESULT (STDMETHODCALLTYPE *MarshalInterface)(INTERFACE *This, IStream* pStm, REFIID riid, void* pv, DWORD dwDestContext, void* pvDestContext, DWORD mshlflags); \
-    HRESULT (STDMETHODCALLTYPE *UnmarshalInterface)(INTERFACE *This, IStream* pStm, REFIID riid, void** ppv); \
-    HRESULT (STDMETHODCALLTYPE *ReleaseMarshalData)(INTERFACE *This, IStream* pStm); \
-    HRESULT (STDMETHODCALLTYPE *DisconnectObject)(INTERFACE *This, DWORD dwReserved);
-
 /*** IUnknown methods ***/
 #define IMarshal_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IMarshal_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -152,6 +139,20 @@ struct IMarshalVtbl {
 
 #endif
 
+#define IMarshal_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IMarshal methods ***/ \
+    STDMETHOD_(HRESULT,GetUnmarshalClass)(THIS_ REFIID riid, void* pv, DWORD dwDestContext, void* pvDestContext, DWORD mshlflags, CLSID* pCid) PURE; \
+    STDMETHOD_(HRESULT,GetMarshalSizeMax)(THIS_ REFIID riid, void* pv, DWORD dwDestContext, void* pvDestContext, DWORD mshlflags, DWORD* pSize) PURE; \
+    STDMETHOD_(HRESULT,MarshalInterface)(THIS_ IStream* pStm, REFIID riid, void* pv, DWORD dwDestContext, void* pvDestContext, DWORD mshlflags) PURE; \
+    STDMETHOD_(HRESULT,UnmarshalInterface)(THIS_ IStream* pStm, REFIID riid, void** ppv) PURE; \
+    STDMETHOD_(HRESULT,ReleaseMarshalData)(THIS_ IStream* pStm) PURE; \
+    STDMETHOD_(HRESULT,DisconnectObject)(THIS_ DWORD dwReserved) PURE;
+
 HRESULT CALLBACK IMarshal_GetUnmarshalClass_Proxy(
     IMarshal* This,
     REFIID riid,
@@ -263,14 +264,6 @@ struct IStdMarshalInfoVtbl {
 
 };
 
-#define IStdMarshalInfo_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IStdMarshalInfo methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetClassForHandler)(INTERFACE *This, DWORD dwDestContext, void* pvDestContext, CLSID* pClsid);
-
 /*** IUnknown methods ***/
 #define IStdMarshalInfo_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IStdMarshalInfo_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -280,6 +273,15 @@ struct IStdMarshalInfoVtbl {
 
 #endif
 
+#define IStdMarshalInfo_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IStdMarshalInfo methods ***/ \
+    STDMETHOD_(HRESULT,GetClassForHandler)(THIS_ DWORD dwDestContext, void* pvDestContext, CLSID* pClsid) PURE;
+
 HRESULT CALLBACK IStdMarshalInfo_GetClassForHandler_Proxy(
     IStdMarshalInfo* This,
     DWORD dwDestContext,
@@ -351,15 +353,6 @@ struct IExternalConnectionVtbl {
 
 };
 
-#define IExternalConnection_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IExternalConnection methods ***/ \
-    DWORD (STDMETHODCALLTYPE *AddConnection)(INTERFACE *This, DWORD extconn, DWORD reserved); \
-    DWORD (STDMETHODCALLTYPE *ReleaseConnection)(INTERFACE *This, DWORD extconn, DWORD reserved, BOOL fLastReleaseCloses);
-
 /*** IUnknown methods ***/
 #define IExternalConnection_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IExternalConnection_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -370,6 +363,16 @@ struct IExternalConnectionVtbl {
 
 #endif
 
+#define IExternalConnection_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IExternalConnection methods ***/ \
+    STDMETHOD_(DWORD,AddConnection)(THIS_ DWORD extconn, DWORD reserved) PURE; \
+    STDMETHOD_(DWORD,ReleaseConnection)(THIS_ DWORD extconn, DWORD reserved, BOOL fLastReleaseCloses) PURE;
+
 DWORD CALLBACK IExternalConnection_AddConnection_Proxy(
     IExternalConnection* This,
     DWORD extconn,
@@ -439,14 +442,6 @@ struct IMultiQIVtbl {
 
 };
 
-#define IMultiQI_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IMultiQI methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryMultipleInterfaces)(INTERFACE *This, ULONG cMQIs, MULTI_QI* pMQIs);
-
 /*** IUnknown methods ***/
 #define IMultiQI_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IMultiQI_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -456,6 +451,15 @@ struct IMultiQIVtbl {
 
 #endif
 
+#define IMultiQI_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IMultiQI methods ***/ \
+    STDMETHOD_(HRESULT,QueryMultipleInterfaces)(THIS_ ULONG cMQIs, MULTI_QI* pMQIs) PURE;
+
 HRESULT CALLBACK IMultiQI_QueryMultipleInterfaces_Proxy(
     IMultiQI* This,
     ULONG cMQIs,
@@ -543,19 +547,6 @@ struct IMallocVtbl {
 
 };
 
-#define IMalloc_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IMalloc methods ***/ \
-    LPVOID (STDMETHODCALLTYPE *Alloc)(INTERFACE *This, ULONG cb); \
-    LPVOID (STDMETHODCALLTYPE *Realloc)(INTERFACE *This, LPVOID pv, ULONG cb); \
-    void (STDMETHODCALLTYPE *Free)(INTERFACE *This, LPVOID pv); \
-    ULONG (STDMETHODCALLTYPE *GetSize)(INTERFACE *This, LPVOID pv); \
-    int (STDMETHODCALLTYPE *DidAlloc)(INTERFACE *This, LPVOID pv); \
-    void (STDMETHODCALLTYPE *HeapMinimize)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define IMalloc_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IMalloc_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -570,6 +561,20 @@ struct IMallocVtbl {
 
 #endif
 
+#define IMalloc_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IMalloc methods ***/ \
+    STDMETHOD_(LPVOID,Alloc)(THIS_ ULONG cb) PURE; \
+    STDMETHOD_(LPVOID,Realloc)(THIS_ LPVOID pv, ULONG cb) PURE; \
+    STDMETHOD_(void,Free)(THIS_ LPVOID pv) PURE; \
+    STDMETHOD_(ULONG,GetSize)(THIS_ LPVOID pv) PURE; \
+    STDMETHOD_(int,DidAlloc)(THIS_ LPVOID pv) PURE; \
+    STDMETHOD_(void,HeapMinimize)(THIS) PURE;
+
 LPVOID CALLBACK IMalloc_Alloc_Proxy(
     IMalloc* This,
     ULONG cb);
@@ -755,25 +760,6 @@ struct IMallocSpyVtbl {
 
 };
 
-#define IMallocSpy_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IMallocSpy methods ***/ \
-    ULONG (STDMETHODCALLTYPE *PreAlloc)(INTERFACE *This, ULONG cbRequest); \
-    LPVOID (STDMETHODCALLTYPE *PostAlloc)(INTERFACE *This, LPVOID pActual); \
-    LPVOID (STDMETHODCALLTYPE *PreFree)(INTERFACE *This, LPVOID pRequest, BOOL fSpyed); \
-    void (STDMETHODCALLTYPE *PostFree)(INTERFACE *This, BOOL fSpyed); \
-    ULONG (STDMETHODCALLTYPE *PreRealloc)(INTERFACE *This, LPVOID pRequest, ULONG cbRequest, LPVOID* ppNewRequest, BOOL fSpyed); \
-    LPVOID (STDMETHODCALLTYPE *PostRealloc)(INTERFACE *This, LPVOID pActual, BOOL fSpyed); \
-    LPVOID (STDMETHODCALLTYPE *PreGetSize)(INTERFACE *This, LPVOID pRequest, BOOL fSpyed); \
-    ULONG (STDMETHODCALLTYPE *PostGetSize)(INTERFACE *This, ULONG cbActual, BOOL fSpyed); \
-    LPVOID (STDMETHODCALLTYPE *PreDidAlloc)(INTERFACE *This, LPVOID pRequest, BOOL fSpyed); \
-    int (STDMETHODCALLTYPE *PostDidAlloc)(INTERFACE *This, LPVOID pRequest, BOOL fSpyed, int fActual); \
-    void (STDMETHODCALLTYPE *PreHeapMinimize)(INTERFACE *This); \
-    void (STDMETHODCALLTYPE *PostHeapMinimize)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define IMallocSpy_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IMallocSpy_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -794,6 +780,26 @@ struct IMallocSpyVtbl {
 
 #endif
 
+#define IMallocSpy_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IMallocSpy methods ***/ \
+    STDMETHOD_(ULONG,PreAlloc)(THIS_ ULONG cbRequest) PURE; \
+    STDMETHOD_(LPVOID,PostAlloc)(THIS_ LPVOID pActual) PURE; \
+    STDMETHOD_(LPVOID,PreFree)(THIS_ LPVOID pRequest, BOOL fSpyed) PURE; \
+    STDMETHOD_(void,PostFree)(THIS_ BOOL fSpyed) PURE; \
+    STDMETHOD_(ULONG,PreRealloc)(THIS_ LPVOID pRequest, ULONG cbRequest, LPVOID* ppNewRequest, BOOL fSpyed) PURE; \
+    STDMETHOD_(LPVOID,PostRealloc)(THIS_ LPVOID pActual, BOOL fSpyed) PURE; \
+    STDMETHOD_(LPVOID,PreGetSize)(THIS_ LPVOID pRequest, BOOL fSpyed) PURE; \
+    STDMETHOD_(ULONG,PostGetSize)(THIS_ ULONG cbActual, BOOL fSpyed) PURE; \
+    STDMETHOD_(LPVOID,PreDidAlloc)(THIS_ LPVOID pRequest, BOOL fSpyed) PURE; \
+    STDMETHOD_(int,PostDidAlloc)(THIS_ LPVOID pRequest, BOOL fSpyed, int fActual) PURE; \
+    STDMETHOD_(void,PreHeapMinimize)(THIS) PURE; \
+    STDMETHOD_(void,PostHeapMinimize)(THIS) PURE;
+
 ULONG CALLBACK IMallocSpy_PreAlloc_Proxy(
     IMallocSpy* This,
     ULONG cbRequest);
@@ -964,17 +970,6 @@ struct IEnumUnknownVtbl {
 
 };
 
-#define IEnumUnknown_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IEnumUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Next)(INTERFACE *This, ULONG celt, IUnknown** rgelt, ULONG* pceltFetched); \
-    HRESULT (STDMETHODCALLTYPE *Skip)(INTERFACE *This, ULONG celt); \
-    HRESULT (STDMETHODCALLTYPE *Reset)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IEnumUnknown** ppenum);
-
 /*** IUnknown methods ***/
 #define IEnumUnknown_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IEnumUnknown_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -987,6 +982,18 @@ struct IEnumUnknownVtbl {
 
 #endif
 
+#define IEnumUnknown_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IEnumUnknown methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, IUnknown** rgelt, ULONG* pceltFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumUnknown** ppenum) PURE;
+
 HRESULT CALLBACK IEnumUnknown_RemoteNext_Proxy(
     IEnumUnknown* This,
     ULONG celt,
@@ -1078,15 +1085,6 @@ struct ISurrogateVtbl {
 
 };
 
-#define ISurrogate_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ISurrogate methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *LoadDllServer)(INTERFACE *This, REFCLSID Clsid); \
-    HRESULT (STDMETHODCALLTYPE *FreeSurrogate)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define ISurrogate_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ISurrogate_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -1097,6 +1095,16 @@ struct ISurrogateVtbl {
 
 #endif
 
+#define ISurrogate_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ISurrogate methods ***/ \
+    STDMETHOD_(HRESULT,LoadDllServer)(THIS_ REFCLSID Clsid) PURE; \
+    STDMETHOD_(HRESULT,FreeSurrogate)(THIS) PURE;
+
 HRESULT CALLBACK ISurrogate_LoadDllServer_Proxy(
     ISurrogate* This,
     REFCLSID Clsid);
@@ -1176,16 +1184,6 @@ struct IGlobalInterfaceTableVtbl {
 
 };
 
-#define IGlobalInterfaceTable_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IGlobalInterfaceTable methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *RegisterInterfaceInGlobal)(INTERFACE *This, IUnknown* pUnk, REFIID riid, DWORD* pdwCookie); \
-    HRESULT (STDMETHODCALLTYPE *RevokeInterfaceFromGlobal)(INTERFACE *This, DWORD dwCookie); \
-    HRESULT (STDMETHODCALLTYPE *GetInterfaceFromGlobal)(INTERFACE *This, DWORD dwCookie, REFIID riid, void** ppv);
-
 /*** IUnknown methods ***/
 #define IGlobalInterfaceTable_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IGlobalInterfaceTable_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -1197,6 +1195,17 @@ struct IGlobalInterfaceTableVtbl {
 
 #endif
 
+#define IGlobalInterfaceTable_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IGlobalInterfaceTable methods ***/ \
+    STDMETHOD_(HRESULT,RegisterInterfaceInGlobal)(THIS_ IUnknown* pUnk, REFIID riid, DWORD* pdwCookie) PURE; \
+    STDMETHOD_(HRESULT,RevokeInterfaceFromGlobal)(THIS_ DWORD dwCookie) PURE; \
+    STDMETHOD_(HRESULT,GetInterfaceFromGlobal)(THIS_ DWORD dwCookie, REFIID riid, void** ppv) PURE;
+
 HRESULT CALLBACK IGlobalInterfaceTable_RegisterInterfaceInGlobal_Proxy(
     IGlobalInterfaceTable* This,
     IUnknown* pUnk,
@@ -1358,23 +1367,6 @@ struct IBindCtxVtbl {
 
 };
 
-#define IBindCtx_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IBindCtx methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *RegisterObjectBound)(INTERFACE *This, IUnknown* punk); \
-    HRESULT (STDMETHODCALLTYPE *RevokeObjectBound)(INTERFACE *This, IUnknown* punk); \
-    HRESULT (STDMETHODCALLTYPE *ReleaseBoundObjects)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *SetBindOptions)(INTERFACE *This, BIND_OPTS* pbindopts); \
-    HRESULT (STDMETHODCALLTYPE *GetBindOptions)(INTERFACE *This, BIND_OPTS* pbindopts); \
-    HRESULT (STDMETHODCALLTYPE *GetRunningObjectTable)(INTERFACE *This, IRunningObjectTable** pprot); \
-    HRESULT (STDMETHODCALLTYPE *RegisterObjectParam)(INTERFACE *This, LPOLESTR pszKey, IUnknown* punk); \
-    HRESULT (STDMETHODCALLTYPE *GetObjectParam)(INTERFACE *This, LPOLESTR pszKey, IUnknown** ppunk); \
-    HRESULT (STDMETHODCALLTYPE *EnumObjectParam)(INTERFACE *This, IEnumString** ppenum); \
-    HRESULT (STDMETHODCALLTYPE *RevokeObjectParam)(INTERFACE *This, LPOLESTR pszKey);
-
 /*** IUnknown methods ***/
 #define IBindCtx_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IBindCtx_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -1393,6 +1385,24 @@ struct IBindCtxVtbl {
 
 #endif
 
+#define IBindCtx_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IBindCtx methods ***/ \
+    STDMETHOD_(HRESULT,RegisterObjectBound)(THIS_ IUnknown* punk) PURE; \
+    STDMETHOD_(HRESULT,RevokeObjectBound)(THIS_ IUnknown* punk) PURE; \
+    STDMETHOD_(HRESULT,ReleaseBoundObjects)(THIS) PURE; \
+    STDMETHOD_(HRESULT,SetBindOptions)(THIS_ BIND_OPTS* pbindopts) PURE; \
+    STDMETHOD_(HRESULT,GetBindOptions)(THIS_ BIND_OPTS* pbindopts) PURE; \
+    STDMETHOD_(HRESULT,GetRunningObjectTable)(THIS_ IRunningObjectTable** pprot) PURE; \
+    STDMETHOD_(HRESULT,RegisterObjectParam)(THIS_ LPOLESTR pszKey, IUnknown* punk) PURE; \
+    STDMETHOD_(HRESULT,GetObjectParam)(THIS_ LPOLESTR pszKey, IUnknown** ppunk) PURE; \
+    STDMETHOD_(HRESULT,EnumObjectParam)(THIS_ IEnumString** ppenum) PURE; \
+    STDMETHOD_(HRESULT,RevokeObjectParam)(THIS_ LPOLESTR pszKey) PURE;
+
 HRESULT CALLBACK IBindCtx_RegisterObjectBound_Proxy(
     IBindCtx* This,
     IUnknown* punk);
@@ -1552,17 +1562,6 @@ struct IEnumMonikerVtbl {
 
 };
 
-#define IEnumMoniker_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IEnumMoniker methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Next)(INTERFACE *This, ULONG celt, IMoniker** rgelt, ULONG* pceltFetched); \
-    HRESULT (STDMETHODCALLTYPE *Skip)(INTERFACE *This, ULONG celt); \
-    HRESULT (STDMETHODCALLTYPE *Reset)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IEnumMoniker** ppenum);
-
 /*** IUnknown methods ***/
 #define IEnumMoniker_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IEnumMoniker_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -1575,6 +1574,18 @@ struct IEnumMonikerVtbl {
 
 #endif
 
+#define IEnumMoniker_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IEnumMoniker methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, IMoniker** rgelt, ULONG* pceltFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumMoniker** ppenum) PURE;
+
 HRESULT CALLBACK IEnumMoniker_RemoteNext_Proxy(
     IEnumMoniker* This,
     ULONG celt,
@@ -1689,18 +1700,6 @@ struct IRunnableObjectVtbl {
 
 };
 
-#define IRunnableObject_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IRunnableObject methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetRunningClass)(INTERFACE *This, LPCLSID lpClsid); \
-    HRESULT (STDMETHODCALLTYPE *Run)(INTERFACE *This, LPBINDCTX pbc); \
-    BOOL (STDMETHODCALLTYPE *IsRunning)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *LockRunning)(INTERFACE *This, BOOL fLock, BOOL fLastUnlockCloses); \
-    HRESULT (STDMETHODCALLTYPE *SetContainedObject)(INTERFACE *This, BOOL fContained);
-
 /*** IUnknown methods ***/
 #define IRunnableObject_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IRunnableObject_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -1714,6 +1713,19 @@ struct IRunnableObjectVtbl {
 
 #endif
 
+#define IRunnableObject_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IRunnableObject methods ***/ \
+    STDMETHOD_(HRESULT,GetRunningClass)(THIS_ LPCLSID lpClsid) PURE; \
+    STDMETHOD_(HRESULT,Run)(THIS_ LPBINDCTX pbc) PURE; \
+    STDMETHOD_(BOOL,IsRunning)(THIS) PURE; \
+    STDMETHOD_(HRESULT,LockRunning)(THIS_ BOOL fLock, BOOL fLastUnlockCloses) PURE; \
+    STDMETHOD_(HRESULT,SetContainedObject)(THIS_ BOOL fContained) PURE;
+
 HRESULT CALLBACK IRunnableObject_GetRunningClass_Proxy(
     IRunnableObject* This,
     LPCLSID lpClsid);
@@ -1856,20 +1868,6 @@ struct IRunningObjectTableVtbl {
 
 };
 
-#define IRunningObjectTable_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IRunningObjectTable methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Register)(INTERFACE *This, DWORD grfFlags, IUnknown* punkObject, IMoniker* pmkObjectName, DWORD* pdwRegister); \
-    HRESULT (STDMETHODCALLTYPE *Revoke)(INTERFACE *This, DWORD dwRegister); \
-    HRESULT (STDMETHODCALLTYPE *IsRunning)(INTERFACE *This, IMoniker* pmkObjectName); \
-    HRESULT (STDMETHODCALLTYPE *GetObject)(INTERFACE *This, IMoniker* pmkObjectName, IUnknown** ppunkObject); \
-    HRESULT (STDMETHODCALLTYPE *NoteChangeTime)(INTERFACE *This, DWORD dwRegister, FILETIME* pfiletime); \
-    HRESULT (STDMETHODCALLTYPE *GetTimeOfLastChange)(INTERFACE *This, IMoniker* pmkObjectName, FILETIME* pfiletime); \
-    HRESULT (STDMETHODCALLTYPE *EnumRunning)(INTERFACE *This, IEnumMoniker** ppenumMoniker);
-
 /*** IUnknown methods ***/
 #define IRunningObjectTable_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IRunningObjectTable_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -1885,6 +1883,21 @@ struct IRunningObjectTableVtbl {
 
 #endif
 
+#define IRunningObjectTable_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IRunningObjectTable methods ***/ \
+    STDMETHOD_(HRESULT,Register)(THIS_ DWORD grfFlags, IUnknown* punkObject, IMoniker* pmkObjectName, DWORD* pdwRegister) PURE; \
+    STDMETHOD_(HRESULT,Revoke)(THIS_ DWORD dwRegister) PURE; \
+    STDMETHOD_(HRESULT,IsRunning)(THIS_ IMoniker* pmkObjectName) PURE; \
+    STDMETHOD_(HRESULT,GetObject)(THIS_ IMoniker* pmkObjectName, IUnknown** ppunkObject) PURE; \
+    STDMETHOD_(HRESULT,NoteChangeTime)(THIS_ DWORD dwRegister, FILETIME* pfiletime) PURE; \
+    STDMETHOD_(HRESULT,GetTimeOfLastChange)(THIS_ IMoniker* pmkObjectName, FILETIME* pfiletime) PURE; \
+    STDMETHOD_(HRESULT,EnumRunning)(THIS_ IEnumMoniker** ppenumMoniker) PURE;
+
 HRESULT CALLBACK IRunningObjectTable_Register_Proxy(
     IRunningObjectTable* This,
     DWORD grfFlags,
@@ -1989,14 +2002,6 @@ struct IPersistVtbl {
 
 };
 
-#define IPersist_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IPersist methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetClassID)(INTERFACE *This, CLSID* pClassID);
-
 /*** IUnknown methods ***/
 #define IPersist_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IPersist_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2006,6 +2011,15 @@ struct IPersistVtbl {
 
 #endif
 
+#define IPersist_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IPersist methods ***/ \
+    STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE;
+
 HRESULT CALLBACK IPersist_GetClassID_Proxy(
     IPersist* This,
     CLSID* pClassID);
@@ -2083,19 +2097,6 @@ struct IPersistStreamVtbl {
 
 };
 
-#define IPersistStream_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IPersist methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetClassID)(INTERFACE *This, CLSID* pClassID); \
-    /*** IPersistStream methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *IsDirty)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Load)(INTERFACE *This, IStream* pStm); \
-    HRESULT (STDMETHODCALLTYPE *Save)(INTERFACE *This, IStream* pStm, BOOL fClearDirty); \
-    HRESULT (STDMETHODCALLTYPE *GetSizeMax)(INTERFACE *This, ULARGE_INTEGER* pcbSize);
-
 /*** IUnknown methods ***/
 #define IPersistStream_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IPersistStream_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2110,6 +2111,20 @@ struct IPersistStreamVtbl {
 
 #endif
 
+#define IPersistStream_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IPersist methods ***/ \
+    STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \
+    /*** IPersistStream methods ***/ \
+    STDMETHOD_(HRESULT,IsDirty)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Load)(THIS_ IStream* pStm) PURE; \
+    STDMETHOD_(HRESULT,Save)(THIS_ IStream* pStm, BOOL fClearDirty) PURE; \
+    STDMETHOD_(HRESULT,GetSizeMax)(THIS_ ULARGE_INTEGER* pcbSize) PURE;
+
 HRESULT CALLBACK IPersistStream_IsDirty_Proxy(
     IPersistStream* This);
 void __RPC_STUB IPersistStream_IsDirty_Stub(
@@ -2368,35 +2383,6 @@ struct IMonikerVtbl {
 
 };
 
-#define IMoniker_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IPersist methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetClassID)(INTERFACE *This, CLSID* pClassID); \
-    /*** IPersistStream methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *IsDirty)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Load)(INTERFACE *This, IStream* pStm); \
-    HRESULT (STDMETHODCALLTYPE *Save)(INTERFACE *This, IStream* pStm, BOOL fClearDirty); \
-    HRESULT (STDMETHODCALLTYPE *GetSizeMax)(INTERFACE *This, ULARGE_INTEGER* pcbSize); \
-    /*** IMoniker methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *BindToObject)(INTERFACE *This, IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riidResult, void** ppvResult); \
-    HRESULT (STDMETHODCALLTYPE *BindToStorage)(INTERFACE *This, IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, void** ppvObj); \
-    HRESULT (STDMETHODCALLTYPE *Reduce)(INTERFACE *This, IBindCtx* pbc, DWORD dwReduceHowFar, IMoniker** ppmkToLeft, IMoniker** ppmkReduced); \
-    HRESULT (STDMETHODCALLTYPE *ComposeWith)(INTERFACE *This, IMoniker* pmkRight, BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite); \
-    HRESULT (STDMETHODCALLTYPE *Enum)(INTERFACE *This, BOOL fForward, IEnumMoniker** ppenumMoniker); \
-    HRESULT (STDMETHODCALLTYPE *IsEqual)(INTERFACE *This, IMoniker* pmkOtherMoniker); \
-    HRESULT (STDMETHODCALLTYPE *Hash)(INTERFACE *This, DWORD* pdwHash); \
-    HRESULT (STDMETHODCALLTYPE *IsRunning)(INTERFACE *This, IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning); \
-    HRESULT (STDMETHODCALLTYPE *GetTimeOfLastChange)(INTERFACE *This, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pFileTime); \
-    HRESULT (STDMETHODCALLTYPE *Inverse)(INTERFACE *This, IMoniker** ppmk); \
-    HRESULT (STDMETHODCALLTYPE *CommonPrefixWith)(INTERFACE *This, IMoniker* pmkOther, IMoniker** ppmkPrefix); \
-    HRESULT (STDMETHODCALLTYPE *RelativePathTo)(INTERFACE *This, IMoniker* pmkOther, IMoniker** ppmkRelPath); \
-    HRESULT (STDMETHODCALLTYPE *GetDisplayName)(INTERFACE *This, IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR* ppszDisplayName); \
-    HRESULT (STDMETHODCALLTYPE *ParseDisplayName)(INTERFACE *This, IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut); \
-    HRESULT (STDMETHODCALLTYPE *IsSystemMoniker)(INTERFACE *This, DWORD* pdwMksys);
-
 /*** IUnknown methods ***/
 #define IMoniker_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IMoniker_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2427,6 +2413,36 @@ struct IMonikerVtbl {
 
 #endif
 
+#define IMoniker_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IPersist methods ***/ \
+    STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \
+    /*** IPersistStream methods ***/ \
+    STDMETHOD_(HRESULT,IsDirty)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Load)(THIS_ IStream* pStm) PURE; \
+    STDMETHOD_(HRESULT,Save)(THIS_ IStream* pStm, BOOL fClearDirty) PURE; \
+    STDMETHOD_(HRESULT,GetSizeMax)(THIS_ ULARGE_INTEGER* pcbSize) PURE; \
+    /*** IMoniker methods ***/ \
+    STDMETHOD_(HRESULT,BindToObject)(THIS_ IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riidResult, void** ppvResult) PURE; \
+    STDMETHOD_(HRESULT,BindToStorage)(THIS_ IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, void** ppvObj) PURE; \
+    STDMETHOD_(HRESULT,Reduce)(THIS_ IBindCtx* pbc, DWORD dwReduceHowFar, IMoniker** ppmkToLeft, IMoniker** ppmkReduced) PURE; \
+    STDMETHOD_(HRESULT,ComposeWith)(THIS_ IMoniker* pmkRight, BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite) PURE; \
+    STDMETHOD_(HRESULT,Enum)(THIS_ BOOL fForward, IEnumMoniker** ppenumMoniker) PURE; \
+    STDMETHOD_(HRESULT,IsEqual)(THIS_ IMoniker* pmkOtherMoniker) PURE; \
+    STDMETHOD_(HRESULT,Hash)(THIS_ DWORD* pdwHash) PURE; \
+    STDMETHOD_(HRESULT,IsRunning)(THIS_ IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning) PURE; \
+    STDMETHOD_(HRESULT,GetTimeOfLastChange)(THIS_ IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pFileTime) PURE; \
+    STDMETHOD_(HRESULT,Inverse)(THIS_ IMoniker** ppmk) PURE; \
+    STDMETHOD_(HRESULT,CommonPrefixWith)(THIS_ IMoniker* pmkOther, IMoniker** ppmkPrefix) PURE; \
+    STDMETHOD_(HRESULT,RelativePathTo)(THIS_ IMoniker* pmkOther, IMoniker** ppmkRelPath) PURE; \
+    STDMETHOD_(HRESULT,GetDisplayName)(THIS_ IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR* ppszDisplayName) PURE; \
+    STDMETHOD_(HRESULT,ParseDisplayName)(THIS_ IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut) PURE; \
+    STDMETHOD_(HRESULT,IsSystemMoniker)(THIS_ DWORD* pdwMksys) PURE;
+
 HRESULT CALLBACK IMoniker_RemoteBindToObject_Proxy(
     IMoniker* This,
     IBindCtx* pbc,
@@ -2639,14 +2655,6 @@ struct IROTDataVtbl {
 
 };
 
-#define IROTData_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IROTData methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetComparisonData)(INTERFACE *This, byte* pbData, ULONG cbMax, ULONG* pcbData);
-
 /*** IUnknown methods ***/
 #define IROTData_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IROTData_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2656,6 +2664,15 @@ struct IROTDataVtbl {
 
 #endif
 
+#define IROTData_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IROTData methods ***/ \
+    STDMETHOD_(HRESULT,GetComparisonData)(THIS_ byte* pbData, ULONG cbMax, ULONG* pcbData) PURE;
+
 HRESULT CALLBACK IROTData_GetComparisonData_Proxy(
     IROTData* This,
     byte* pbData,
@@ -2731,17 +2748,6 @@ struct IEnumStringVtbl {
 
 };
 
-#define IEnumString_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IEnumString methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Next)(INTERFACE *This, ULONG celt, LPOLESTR* rgelt, ULONG* pceltFetched); \
-    HRESULT (STDMETHODCALLTYPE *Skip)(INTERFACE *This, ULONG celt); \
-    HRESULT (STDMETHODCALLTYPE *Reset)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IEnumString** ppenum);
-
 /*** IUnknown methods ***/
 #define IEnumString_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IEnumString_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2754,6 +2760,18 @@ struct IEnumStringVtbl {
 
 #endif
 
+#define IEnumString_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IEnumString methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, LPOLESTR* rgelt, ULONG* pceltFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumString** ppenum) PURE;
+
 HRESULT CALLBACK IEnumString_RemoteNext_Proxy(
     IEnumString* This,
     ULONG celt,
@@ -2845,14 +2863,6 @@ struct IClassActivatorVtbl {
 
 };
 
-#define IClassActivator_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IClassActivator methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetClassObject)(INTERFACE *This, REFCLSID rclsid, DWORD dwClassContext, LCID locale, REFIID riid, void** ppv);
-
 /*** IUnknown methods ***/
 #define IClassActivator_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IClassActivator_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2862,6 +2872,15 @@ struct IClassActivatorVtbl {
 
 #endif
 
+#define IClassActivator_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IClassActivator methods ***/ \
+    STDMETHOD_(HRESULT,GetClassObject)(THIS_ REFCLSID rclsid, DWORD dwClassContext, LCID locale, REFIID riid, void** ppv) PURE;
+
 HRESULT CALLBACK IClassActivator_GetClassObject_Proxy(
     IClassActivator* This,
     REFCLSID rclsid,
@@ -2929,15 +2948,6 @@ struct ISequentialStreamVtbl {
 
 };
 
-#define ISequentialStream_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ISequentialStream methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Read)(INTERFACE *This, void* pv, ULONG cb, ULONG* pcbRead); \
-    HRESULT (STDMETHODCALLTYPE *Write)(INTERFACE *This, const void* pv, ULONG cb, ULONG* pcbWritten);
-
 /*** IUnknown methods ***/
 #define ISequentialStream_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ISequentialStream_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -2948,6 +2958,16 @@ struct ISequentialStreamVtbl {
 
 #endif
 
+#define ISequentialStream_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ISequentialStream methods ***/ \
+    STDMETHOD_(HRESULT,Read)(THIS_ void* pv, ULONG cb, ULONG* pcbRead) PURE; \
+    STDMETHOD_(HRESULT,Write)(THIS_ const void* pv, ULONG cb, ULONG* pcbWritten) PURE;
+
 HRESULT CALLBACK ISequentialStream_RemoteRead_Proxy(
     ISequentialStream* This,
     byte* pv,
@@ -3154,25 +3174,6 @@ struct IStreamVtbl {
 
 };
 
-#define IStream_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ISequentialStream methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Read)(INTERFACE *This, void* pv, ULONG cb, ULONG* pcbRead); \
-    HRESULT (STDMETHODCALLTYPE *Write)(INTERFACE *This, const void* pv, ULONG cb, ULONG* pcbWritten); \
-    /*** IStream methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Seek)(INTERFACE *This, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition); \
-    HRESULT (STDMETHODCALLTYPE *SetSize)(INTERFACE *This, ULARGE_INTEGER libNewSize); \
-    HRESULT (STDMETHODCALLTYPE *CopyTo)(INTERFACE *This, IStream* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten); \
-    HRESULT (STDMETHODCALLTYPE *Commit)(INTERFACE *This, DWORD grfCommitFlags); \
-    HRESULT (STDMETHODCALLTYPE *Revert)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *LockRegion)(INTERFACE *This, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); \
-    HRESULT (STDMETHODCALLTYPE *UnlockRegion)(INTERFACE *This, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); \
-    HRESULT (STDMETHODCALLTYPE *Stat)(INTERFACE *This, STATSTG* pstatstg, DWORD grfStatFlag); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IStream** ppstm);
-
 /*** IUnknown methods ***/
 #define IStream_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IStream_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -3193,6 +3194,26 @@ struct IStreamVtbl {
 
 #endif
 
+#define IStream_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ISequentialStream methods ***/ \
+    STDMETHOD_(HRESULT,Read)(THIS_ void* pv, ULONG cb, ULONG* pcbRead) PURE; \
+    STDMETHOD_(HRESULT,Write)(THIS_ const void* pv, ULONG cb, ULONG* pcbWritten) PURE; \
+    /*** IStream methods ***/ \
+    STDMETHOD_(HRESULT,Seek)(THIS_ LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition) PURE; \
+    STDMETHOD_(HRESULT,SetSize)(THIS_ ULARGE_INTEGER libNewSize) PURE; \
+    STDMETHOD_(HRESULT,CopyTo)(THIS_ IStream* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten) PURE; \
+    STDMETHOD_(HRESULT,Commit)(THIS_ DWORD grfCommitFlags) PURE; \
+    STDMETHOD_(HRESULT,Revert)(THIS) PURE; \
+    STDMETHOD_(HRESULT,LockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
+    STDMETHOD_(HRESULT,UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
+    STDMETHOD_(HRESULT,Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IStream** ppstm) PURE;
+
 HRESULT CALLBACK IStream_RemoteSeek_Proxy(
     IStream* This,
     LARGE_INTEGER dlibMove,
@@ -3438,25 +3459,6 @@ struct IStream16Vtbl {
 
 };
 
-#define IStream16_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ISequentialStream methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Read)(INTERFACE *This, void* pv, ULONG cb, ULONG* pcbRead); \
-    HRESULT (STDMETHODCALLTYPE *Write)(INTERFACE *This, const void* pv, ULONG cb, ULONG* pcbWritten); \
-    /*** IStream16 methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Seek)(INTERFACE *This, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition); \
-    HRESULT (STDMETHODCALLTYPE *SetSize)(INTERFACE *This, ULARGE_INTEGER libNewSize); \
-    HRESULT (STDMETHODCALLTYPE *CopyTo)(INTERFACE *This, IStream16* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten); \
-    HRESULT (STDMETHODCALLTYPE *Commit)(INTERFACE *This, DWORD grfCommitFlags); \
-    HRESULT (STDMETHODCALLTYPE *Revert)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *LockRegion)(INTERFACE *This, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); \
-    HRESULT (STDMETHODCALLTYPE *UnlockRegion)(INTERFACE *This, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); \
-    HRESULT (STDMETHODCALLTYPE *Stat)(INTERFACE *This, STATSTG* pstatstg, DWORD grfStatFlag); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IStream16** ppstm);
-
 /*** IUnknown methods ***/
 #define IStream16_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IStream16_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -3477,6 +3479,26 @@ struct IStream16Vtbl {
 
 #endif
 
+#define IStream16_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ISequentialStream methods ***/ \
+    STDMETHOD_(HRESULT,Read)(THIS_ void* pv, ULONG cb, ULONG* pcbRead) PURE; \
+    STDMETHOD_(HRESULT,Write)(THIS_ const void* pv, ULONG cb, ULONG* pcbWritten) PURE; \
+    /*** IStream16 methods ***/ \
+    STDMETHOD_(HRESULT,Seek)(THIS_ LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition) PURE; \
+    STDMETHOD_(HRESULT,SetSize)(THIS_ ULARGE_INTEGER libNewSize) PURE; \
+    STDMETHOD_(HRESULT,CopyTo)(THIS_ IStream16* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten) PURE; \
+    STDMETHOD_(HRESULT,Commit)(THIS_ DWORD grfCommitFlags) PURE; \
+    STDMETHOD_(HRESULT,Revert)(THIS) PURE; \
+    STDMETHOD_(HRESULT,LockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
+    STDMETHOD_(HRESULT,UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
+    STDMETHOD_(HRESULT,Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IStream16** ppstm) PURE;
+
 HRESULT CALLBACK IStream16_RemoteSeek_Proxy(
     IStream16* This,
     LARGE_INTEGER dlibMove,
@@ -3646,17 +3668,6 @@ struct IEnumSTATSTGVtbl {
 
 };
 
-#define IEnumSTATSTG_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IEnumSTATSTG methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Next)(INTERFACE *This, ULONG celt, STATSTG* rgelt, ULONG* pceltFetched); \
-    HRESULT (STDMETHODCALLTYPE *Skip)(INTERFACE *This, ULONG celt); \
-    HRESULT (STDMETHODCALLTYPE *Reset)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IEnumSTATSTG** ppenum);
-
 /*** IUnknown methods ***/
 #define IEnumSTATSTG_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IEnumSTATSTG_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -3669,6 +3680,18 @@ struct IEnumSTATSTGVtbl {
 
 #endif
 
+#define IEnumSTATSTG_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IEnumSTATSTG methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, STATSTG* rgelt, ULONG* pceltFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumSTATSTG** ppenum) PURE;
+
 HRESULT CALLBACK IEnumSTATSTG_RemoteNext_Proxy(
     IEnumSTATSTG* This,
     ULONG celt,
@@ -3929,28 +3952,6 @@ struct IStorageVtbl {
 
 };
 
-#define IStorage_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IStorage methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *CreateStream)(INTERFACE *This, LPCOLESTR pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream** ppstm); \
-    HRESULT (STDMETHODCALLTYPE *OpenStream)(INTERFACE *This, LPCOLESTR pwcsName, void* reserved1, DWORD grfMode, DWORD reserved2, IStream** ppstm); \
-    HRESULT (STDMETHODCALLTYPE *CreateStorage)(INTERFACE *This, LPCOLESTR pwcsName, DWORD grfMode, DWORD dwStgFmt, DWORD reserved2, IStorage** ppstg); \
-    HRESULT (STDMETHODCALLTYPE *OpenStorage)(INTERFACE *This, LPCOLESTR pwcsName, IStorage* pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage** ppstg); \
-    HRESULT (STDMETHODCALLTYPE *CopyTo)(INTERFACE *This, DWORD ciidExclude, const IID* rgiidExclude, SNB snbExclude, IStorage* pstgDest); \
-    HRESULT (STDMETHODCALLTYPE *MoveElementTo)(INTERFACE *This, LPCOLESTR pwcsName, IStorage* pstgDest, LPCOLESTR pwcsNewName, DWORD grfFlags); \
-    HRESULT (STDMETHODCALLTYPE *Commit)(INTERFACE *This, DWORD grfCommitFlags); \
-    HRESULT (STDMETHODCALLTYPE *Revert)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *EnumElements)(INTERFACE *This, DWORD reserved1, void* reserved2, DWORD reserved3, IEnumSTATSTG** ppenum); \
-    HRESULT (STDMETHODCALLTYPE *DestroyElement)(INTERFACE *This, LPCOLESTR pwcsName); \
-    HRESULT (STDMETHODCALLTYPE *RenameElement)(INTERFACE *This, LPCOLESTR pwcsOldName, LPCOLESTR pwcsNewName); \
-    HRESULT (STDMETHODCALLTYPE *SetElementTimes)(INTERFACE *This, LPCOLESTR pwcsName, const FILETIME* pctime, const FILETIME* patime, const FILETIME* pmtime); \
-    HRESULT (STDMETHODCALLTYPE *SetClass)(INTERFACE *This, REFCLSID clsid); \
-    HRESULT (STDMETHODCALLTYPE *SetStateBits)(INTERFACE *This, DWORD grfStateBits, DWORD grfMask); \
-    HRESULT (STDMETHODCALLTYPE *Stat)(INTERFACE *This, STATSTG* pstatstg, DWORD grfStatFlag);
-
 /*** IUnknown methods ***/
 #define IStorage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IStorage_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -3974,6 +3975,29 @@ struct IStorageVtbl {
 
 #endif
 
+#define IStorage_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IStorage methods ***/ \
+    STDMETHOD_(HRESULT,CreateStream)(THIS_ LPCOLESTR pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream** ppstm) PURE; \
+    STDMETHOD_(HRESULT,OpenStream)(THIS_ LPCOLESTR pwcsName, void* reserved1, DWORD grfMode, DWORD reserved2, IStream** ppstm) PURE; \
+    STDMETHOD_(HRESULT,CreateStorage)(THIS_ LPCOLESTR pwcsName, DWORD grfMode, DWORD dwStgFmt, DWORD reserved2, IStorage** ppstg) PURE; \
+    STDMETHOD_(HRESULT,OpenStorage)(THIS_ LPCOLESTR pwcsName, IStorage* pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage** ppstg) PURE; \
+    STDMETHOD_(HRESULT,CopyTo)(THIS_ DWORD ciidExclude, const IID* rgiidExclude, SNB snbExclude, IStorage* pstgDest) PURE; \
+    STDMETHOD_(HRESULT,MoveElementTo)(THIS_ LPCOLESTR pwcsName, IStorage* pstgDest, LPCOLESTR pwcsNewName, DWORD grfFlags) PURE; \
+    STDMETHOD_(HRESULT,Commit)(THIS_ DWORD grfCommitFlags) PURE; \
+    STDMETHOD_(HRESULT,Revert)(THIS) PURE; \
+    STDMETHOD_(HRESULT,EnumElements)(THIS_ DWORD reserved1, void* reserved2, DWORD reserved3, IEnumSTATSTG** ppenum) PURE; \
+    STDMETHOD_(HRESULT,DestroyElement)(THIS_ LPCOLESTR pwcsName) PURE; \
+    STDMETHOD_(HRESULT,RenameElement)(THIS_ LPCOLESTR pwcsOldName, LPCOLESTR pwcsNewName) PURE; \
+    STDMETHOD_(HRESULT,SetElementTimes)(THIS_ LPCOLESTR pwcsName, const FILETIME* pctime, const FILETIME* patime, const FILETIME* pmtime) PURE; \
+    STDMETHOD_(HRESULT,SetClass)(THIS_ REFCLSID clsid) PURE; \
+    STDMETHOD_(HRESULT,SetStateBits)(THIS_ DWORD grfStateBits, DWORD grfMask) PURE; \
+    STDMETHOD_(HRESULT,Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE;
+
 HRESULT CALLBACK IStorage_CreateStream_Proxy(
     IStorage* This,
     LPCOLESTR pwcsName,
@@ -4371,28 +4395,6 @@ struct IStorage16Vtbl {
 
 };
 
-#define IStorage16_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IStorage16 methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *CreateStream)(INTERFACE *This, LPCOLESTR16 pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream16** ppstm); \
-    HRESULT (STDMETHODCALLTYPE *OpenStream)(INTERFACE *This, LPCOLESTR16 pwcsName, void* reserved1, DWORD grfMode, DWORD reserved2, IStream16** ppstm); \
-    HRESULT (STDMETHODCALLTYPE *CreateStorage)(INTERFACE *This, LPCOLESTR16 pwcsName, DWORD grfMode, DWORD dwStgFmt, DWORD reserved2, IStorage16** ppstg); \
-    HRESULT (STDMETHODCALLTYPE *OpenStorage)(INTERFACE *This, LPCOLESTR16 pwcsName, IStorage16* pstgPriority, DWORD grfMode, SNB16 snbExclude, DWORD reserved, IStorage16** ppstg); \
-    HRESULT (STDMETHODCALLTYPE *CopyTo)(INTERFACE *This, DWORD ciidExclude, const IID* rgiidExclude, SNB16 snbExclude, IStorage16* pstgDest); \
-    HRESULT (STDMETHODCALLTYPE *MoveElementTo)(INTERFACE *This, LPCOLESTR16 pwcsName, IStorage16* pstgDest, LPCOLESTR16 pwcsNewName, DWORD grfFlags); \
-    HRESULT (STDMETHODCALLTYPE *Commit)(INTERFACE *This, DWORD grfCommitFlags); \
-    HRESULT (STDMETHODCALLTYPE *Revert)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *EnumElements)(INTERFACE *This, DWORD reserved1, void* reserved2, DWORD reserved3, IEnumSTATSTG** ppenum); \
-    HRESULT (STDMETHODCALLTYPE *DestroyElement)(INTERFACE *This, LPCOLESTR16 pwcsName); \
-    HRESULT (STDMETHODCALLTYPE *RenameElement)(INTERFACE *This, LPCOLESTR16 pwcsOldName, LPCOLESTR16 pwcsNewName); \
-    HRESULT (STDMETHODCALLTYPE *SetElementTimes)(INTERFACE *This, LPCOLESTR16 pwcsName, const FILETIME* pctime, const FILETIME* patime, const FILETIME* pmtime); \
-    HRESULT (STDMETHODCALLTYPE *SetClass)(INTERFACE *This, REFCLSID clsid); \
-    HRESULT (STDMETHODCALLTYPE *SetStateBits)(INTERFACE *This, DWORD grfStateBits, DWORD grfMask); \
-    HRESULT (STDMETHODCALLTYPE *Stat)(INTERFACE *This, STATSTG* pstatstg, DWORD grfStatFlag);
-
 /*** IUnknown methods ***/
 #define IStorage16_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IStorage16_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -4416,6 +4418,29 @@ struct IStorage16Vtbl {
 
 #endif
 
+#define IStorage16_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IStorage16 methods ***/ \
+    STDMETHOD_(HRESULT,CreateStream)(THIS_ LPCOLESTR16 pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream16** ppstm) PURE; \
+    STDMETHOD_(HRESULT,OpenStream)(THIS_ LPCOLESTR16 pwcsName, void* reserved1, DWORD grfMode, DWORD reserved2, IStream16** ppstm) PURE; \
+    STDMETHOD_(HRESULT,CreateStorage)(THIS_ LPCOLESTR16 pwcsName, DWORD grfMode, DWORD dwStgFmt, DWORD reserved2, IStorage16** ppstg) PURE; \
+    STDMETHOD_(HRESULT,OpenStorage)(THIS_ LPCOLESTR16 pwcsName, IStorage16* pstgPriority, DWORD grfMode, SNB16 snbExclude, DWORD reserved, IStorage16** ppstg) PURE; \
+    STDMETHOD_(HRESULT,CopyTo)(THIS_ DWORD ciidExclude, const IID* rgiidExclude, SNB16 snbExclude, IStorage16* pstgDest) PURE; \
+    STDMETHOD_(HRESULT,MoveElementTo)(THIS_ LPCOLESTR16 pwcsName, IStorage16* pstgDest, LPCOLESTR16 pwcsNewName, DWORD grfFlags) PURE; \
+    STDMETHOD_(HRESULT,Commit)(THIS_ DWORD grfCommitFlags) PURE; \
+    STDMETHOD_(HRESULT,Revert)(THIS) PURE; \
+    STDMETHOD_(HRESULT,EnumElements)(THIS_ DWORD reserved1, void* reserved2, DWORD reserved3, IEnumSTATSTG** ppenum) PURE; \
+    STDMETHOD_(HRESULT,DestroyElement)(THIS_ LPCOLESTR16 pwcsName) PURE; \
+    STDMETHOD_(HRESULT,RenameElement)(THIS_ LPCOLESTR16 pwcsOldName, LPCOLESTR16 pwcsNewName) PURE; \
+    STDMETHOD_(HRESULT,SetElementTimes)(THIS_ LPCOLESTR16 pwcsName, const FILETIME* pctime, const FILETIME* patime, const FILETIME* pmtime) PURE; \
+    STDMETHOD_(HRESULT,SetClass)(THIS_ REFCLSID clsid) PURE; \
+    STDMETHOD_(HRESULT,SetStateBits)(THIS_ DWORD grfStateBits, DWORD grfMask) PURE; \
+    STDMETHOD_(HRESULT,Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE;
+
 HRESULT CALLBACK IStorage16_CreateStream_Proxy(
     IStorage16* This,
     LPCOLESTR16 pwcsName,
@@ -4675,20 +4700,6 @@ struct IPersistFileVtbl {
 
 };
 
-#define IPersistFile_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IPersist methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetClassID)(INTERFACE *This, CLSID* pClassID); \
-    /*** IPersistFile methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *IsDirty)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Load)(INTERFACE *This, LPCOLESTR pszFileName, DWORD dwMode); \
-    HRESULT (STDMETHODCALLTYPE *Save)(INTERFACE *This, LPCOLESTR pszFileName, BOOL fRemember); \
-    HRESULT (STDMETHODCALLTYPE *SaveCompleted)(INTERFACE *This, LPCOLESTR pszFileName); \
-    HRESULT (STDMETHODCALLTYPE *GetCurFile)(INTERFACE *This, LPOLESTR* ppszFileName);
-
 /*** IUnknown methods ***/
 #define IPersistFile_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IPersistFile_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -4704,6 +4715,21 @@ struct IPersistFileVtbl {
 
 #endif
 
+#define IPersistFile_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IPersist methods ***/ \
+    STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \
+    /*** IPersistFile methods ***/ \
+    STDMETHOD_(HRESULT,IsDirty)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Load)(THIS_ LPCOLESTR pszFileName, DWORD dwMode) PURE; \
+    STDMETHOD_(HRESULT,Save)(THIS_ LPCOLESTR pszFileName, BOOL fRemember) PURE; \
+    STDMETHOD_(HRESULT,SaveCompleted)(THIS_ LPCOLESTR pszFileName) PURE; \
+    STDMETHOD_(HRESULT,GetCurFile)(THIS_ LPOLESTR* ppszFileName) PURE;
+
 HRESULT CALLBACK IPersistFile_IsDirty_Proxy(
     IPersistFile* This);
 void __RPC_STUB IPersistFile_IsDirty_Stub(
@@ -4827,21 +4853,6 @@ struct IPersistStorageVtbl {
 
 };
 
-#define IPersistStorage_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IPersist methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetClassID)(INTERFACE *This, CLSID* pClassID); \
-    /*** IPersistStorage methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *IsDirty)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *InitNew)(INTERFACE *This, IStorage* pStg); \
-    HRESULT (STDMETHODCALLTYPE *Load)(INTERFACE *This, IStorage* pStg); \
-    HRESULT (STDMETHODCALLTYPE *Save)(INTERFACE *This, IStorage* pStgSave, BOOL fSameAsLoad); \
-    HRESULT (STDMETHODCALLTYPE *SaveCompleted)(INTERFACE *This, IStorage* pStgNew); \
-    HRESULT (STDMETHODCALLTYPE *HandsOffStorage)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define IPersistStorage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IPersistStorage_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -4858,6 +4869,22 @@ struct IPersistStorageVtbl {
 
 #endif
 
+#define IPersistStorage_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IPersist methods ***/ \
+    STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \
+    /*** IPersistStorage methods ***/ \
+    STDMETHOD_(HRESULT,IsDirty)(THIS) PURE; \
+    STDMETHOD_(HRESULT,InitNew)(THIS_ IStorage* pStg) PURE; \
+    STDMETHOD_(HRESULT,Load)(THIS_ IStorage* pStg) PURE; \
+    STDMETHOD_(HRESULT,Save)(THIS_ IStorage* pStgSave, BOOL fSameAsLoad) PURE; \
+    STDMETHOD_(HRESULT,SaveCompleted)(THIS_ IStorage* pStgNew) PURE; \
+    STDMETHOD_(HRESULT,HandsOffStorage)(THIS) PURE;
+
 HRESULT CALLBACK IPersistStorage_IsDirty_Proxy(
     IPersistStorage* This);
 void __RPC_STUB IPersistStorage_IsDirty_Stub(
@@ -4947,14 +4974,6 @@ struct IRootStorageVtbl {
 
 };
 
-#define IRootStorage_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IRootStorage methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *SwitchToFile)(INTERFACE *This, LPOLESTR pszFile);
-
 /*** IUnknown methods ***/
 #define IRootStorage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IRootStorage_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -4964,6 +4983,15 @@ struct IRootStorageVtbl {
 
 #endif
 
+#define IRootStorage_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IRootStorage methods ***/ \
+    STDMETHOD_(HRESULT,SwitchToFile)(THIS_ LPOLESTR pszFile) PURE;
+
 HRESULT CALLBACK IRootStorage_SwitchToFile_Proxy(
     IRootStorage* This,
     LPOLESTR pszFile);
@@ -5077,20 +5105,6 @@ struct ILockBytesVtbl {
 
 };
 
-#define ILockBytes_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ILockBytes methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *ReadAt)(INTERFACE *This, ULARGE_INTEGER ulOffset, void* pv, ULONG cb, ULONG* pcbRead); \
-    HRESULT (STDMETHODCALLTYPE *WriteAt)(INTERFACE *This, ULARGE_INTEGER ulOffset, const void* pv, ULONG cb, ULONG* pcbWritten); \
-    HRESULT (STDMETHODCALLTYPE *Flush)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *SetSize)(INTERFACE *This, ULARGE_INTEGER cb); \
-    HRESULT (STDMETHODCALLTYPE *LockRegion)(INTERFACE *This, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); \
-    HRESULT (STDMETHODCALLTYPE *UnlockRegion)(INTERFACE *This, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); \
-    HRESULT (STDMETHODCALLTYPE *Stat)(INTERFACE *This, STATSTG* pstatstg, DWORD grfStatFlag);
-
 /*** IUnknown methods ***/
 #define ILockBytes_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ILockBytes_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -5106,6 +5120,21 @@ struct ILockBytesVtbl {
 
 #endif
 
+#define ILockBytes_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ILockBytes methods ***/ \
+    STDMETHOD_(HRESULT,ReadAt)(THIS_ ULARGE_INTEGER ulOffset, void* pv, ULONG cb, ULONG* pcbRead) PURE; \
+    STDMETHOD_(HRESULT,WriteAt)(THIS_ ULARGE_INTEGER ulOffset, const void* pv, ULONG cb, ULONG* pcbWritten) PURE; \
+    STDMETHOD_(HRESULT,Flush)(THIS) PURE; \
+    STDMETHOD_(HRESULT,SetSize)(THIS_ ULARGE_INTEGER cb) PURE; \
+    STDMETHOD_(HRESULT,LockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
+    STDMETHOD_(HRESULT,UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
+    STDMETHOD_(HRESULT,Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE;
+
 HRESULT CALLBACK ILockBytes_RemoteReadAt_Proxy(
     ILockBytes* This,
     ULARGE_INTEGER ulOffset,
@@ -5267,17 +5296,6 @@ struct IFillLockBytesVtbl {
 
 };
 
-#define IFillLockBytes_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IFillLockBytes methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *FillAppend)(INTERFACE *This, const void* pv, ULONG cb, ULONG* pcbWritten); \
-    HRESULT (STDMETHODCALLTYPE *FillAt)(INTERFACE *This, ULARGE_INTEGER ulOffset, const void* pv, ULONG cb, ULONG* pcbWritten); \
-    HRESULT (STDMETHODCALLTYPE *SetFillSize)(INTERFACE *This, ULARGE_INTEGER ulSize); \
-    HRESULT (STDMETHODCALLTYPE *Terminate)(INTERFACE *This, BOOL bCanceled);
-
 /*** IUnknown methods ***/
 #define IFillLockBytes_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IFillLockBytes_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -5290,6 +5308,18 @@ struct IFillLockBytesVtbl {
 
 #endif
 
+#define IFillLockBytes_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IFillLockBytes methods ***/ \
+    STDMETHOD_(HRESULT,FillAppend)(THIS_ const void* pv, ULONG cb, ULONG* pcbWritten) PURE; \
+    STDMETHOD_(HRESULT,FillAt)(THIS_ ULARGE_INTEGER ulOffset, const void* pv, ULONG cb, ULONG* pcbWritten) PURE; \
+    STDMETHOD_(HRESULT,SetFillSize)(THIS_ ULARGE_INTEGER ulSize) PURE; \
+    STDMETHOD_(HRESULT,Terminate)(THIS_ BOOL bCanceled) PURE;
+
 HRESULT CALLBACK IFillLockBytes_RemoteFillAppend_Proxy(
     IFillLockBytes* This,
     const byte* pv,
@@ -5395,14 +5425,6 @@ struct IProgressNotifyVtbl {
 
 };
 
-#define IProgressNotify_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IProgressNotify methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *OnProgress)(INTERFACE *This, DWORD dwProgressCurrent, DWORD dwProgressMaximum, BOOL fAccurate, BOOL fOwner);
-
 /*** IUnknown methods ***/
 #define IProgressNotify_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IProgressNotify_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -5412,6 +5434,15 @@ struct IProgressNotifyVtbl {
 
 #endif
 
+#define IProgressNotify_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IProgressNotify methods ***/ \
+    STDMETHOD_(HRESULT,OnProgress)(THIS_ DWORD dwProgressCurrent, DWORD dwProgressMaximum, BOOL fAccurate, BOOL fOwner) PURE;
+
 HRESULT CALLBACK IProgressNotify_OnProgress_Proxy(
     IProgressNotify* This,
     DWORD dwProgressCurrent,
@@ -5500,18 +5531,6 @@ struct ILayoutStorageVtbl {
 
 };
 
-#define ILayoutStorage_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** ILayoutStorage methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *LayoutScript)(INTERFACE *This, StorageLayout* pStorageLayout, DWORD nEntries, DWORD glfInterleavedFlag); \
-    HRESULT (STDMETHODCALLTYPE *BeginMonitor)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *EndMonitor)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *ReLayoutDocfile)(INTERFACE *This, OLECHAR* pwcsNewDfName); \
-    HRESULT (STDMETHODCALLTYPE *ReLayoutDocfileOnILockBytes)(INTERFACE *This, ILockBytes* pILockBytes);
-
 /*** IUnknown methods ***/
 #define ILayoutStorage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define ILayoutStorage_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -5525,6 +5544,19 @@ struct ILayoutStorageVtbl {
 
 #endif
 
+#define ILayoutStorage_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** ILayoutStorage methods ***/ \
+    STDMETHOD_(HRESULT,LayoutScript)(THIS_ StorageLayout* pStorageLayout, DWORD nEntries, DWORD glfInterleavedFlag) PURE; \
+    STDMETHOD_(HRESULT,BeginMonitor)(THIS) PURE; \
+    STDMETHOD_(HRESULT,EndMonitor)(THIS) PURE; \
+    STDMETHOD_(HRESULT,ReLayoutDocfile)(THIS_ OLECHAR* pwcsNewDfName) PURE; \
+    STDMETHOD_(HRESULT,ReLayoutDocfileOnILockBytes)(THIS_ ILockBytes* pILockBytes) PURE;
+
 HRESULT CALLBACK ILayoutStorage_LayoutScript_Proxy(
     ILayoutStorage* This,
     StorageLayout* pStorageLayout,
@@ -5650,17 +5682,6 @@ struct IEnumFORMATETCVtbl {
 
 };
 
-#define IEnumFORMATETC_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IEnumFORMATETC methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Next)(INTERFACE *This, ULONG celt, FORMATETC* rgelt, ULONG* pceltFetched); \
-    HRESULT (STDMETHODCALLTYPE *Skip)(INTERFACE *This, ULONG celt); \
-    HRESULT (STDMETHODCALLTYPE *Reset)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IEnumFORMATETC** ppenum);
-
 /*** IUnknown methods ***/
 #define IEnumFORMATETC_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IEnumFORMATETC_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -5673,6 +5694,18 @@ struct IEnumFORMATETCVtbl {
 
 #endif
 
+#define IEnumFORMATETC_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IEnumFORMATETC methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, FORMATETC* rgelt, ULONG* pceltFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumFORMATETC** ppenum) PURE;
+
 HRESULT CALLBACK IEnumFORMATETC_RemoteNext_Proxy(
     IEnumFORMATETC* This,
     ULONG celt,
@@ -5799,17 +5832,6 @@ struct IEnumSTATDATAVtbl {
 
 };
 
-#define IEnumSTATDATA_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IEnumSTATDATA methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Next)(INTERFACE *This, ULONG celt, STATDATA* rgelt, ULONG* pceltFetched); \
-    HRESULT (STDMETHODCALLTYPE *Skip)(INTERFACE *This, ULONG celt); \
-    HRESULT (STDMETHODCALLTYPE *Reset)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IEnumSTATDATA** ppenum);
-
 /*** IUnknown methods ***/
 #define IEnumSTATDATA_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IEnumSTATDATA_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -5822,6 +5844,18 @@ struct IEnumSTATDATAVtbl {
 
 #endif
 
+#define IEnumSTATDATA_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IEnumSTATDATA methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, STATDATA* rgelt, ULONG* pceltFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumSTATDATA** ppenum) PURE;
+
 HRESULT CALLBACK IEnumSTATDATA_RemoteNext_Proxy(
     IEnumSTATDATA* This,
     ULONG celt,
@@ -6031,18 +6065,6 @@ struct IAdviseSinkVtbl {
 
 };
 
-#define IAdviseSink_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IAdviseSink methods ***/ \
-    void (STDMETHODCALLTYPE *OnDataChange)(INTERFACE *This, FORMATETC* pFormatetc, STGMEDIUM* pStgmed); \
-    void (STDMETHODCALLTYPE *OnViewChange)(INTERFACE *This, DWORD dwAspect, LONG lindex); \
-    void (STDMETHODCALLTYPE *OnRename)(INTERFACE *This, IMoniker* pmk); \
-    void (STDMETHODCALLTYPE *OnSave)(INTERFACE *This); \
-    void (STDMETHODCALLTYPE *OnClose)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define IAdviseSink_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IAdviseSink_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -6056,6 +6078,19 @@ struct IAdviseSinkVtbl {
 
 #endif
 
+#define IAdviseSink_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IAdviseSink methods ***/ \
+    STDMETHOD_(void,OnDataChange)(THIS_ FORMATETC* pFormatetc, STGMEDIUM* pStgmed) PURE; \
+    STDMETHOD_(void,OnViewChange)(THIS_ DWORD dwAspect, LONG lindex) PURE; \
+    STDMETHOD_(void,OnRename)(THIS_ IMoniker* pmk) PURE; \
+    STDMETHOD_(void,OnSave)(THIS) PURE; \
+    STDMETHOD_(void,OnClose)(THIS) PURE;
+
 HRESULT CALLBACK IAdviseSink_RemoteOnDataChange_Proxy(
     IAdviseSink* This,
     IAsyncManager** ppIAM,
@@ -6197,20 +6232,6 @@ struct IAdviseSink2Vtbl {
 
 };
 
-#define IAdviseSink2_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IAdviseSink methods ***/ \
-    void (STDMETHODCALLTYPE *OnDataChange)(INTERFACE *This, FORMATETC* pFormatetc, STGMEDIUM* pStgmed); \
-    void (STDMETHODCALLTYPE *OnViewChange)(INTERFACE *This, DWORD dwAspect, LONG lindex); \
-    void (STDMETHODCALLTYPE *OnRename)(INTERFACE *This, IMoniker* pmk); \
-    void (STDMETHODCALLTYPE *OnSave)(INTERFACE *This); \
-    void (STDMETHODCALLTYPE *OnClose)(INTERFACE *This); \
-    /*** IAdviseSink2 methods ***/ \
-    void (STDMETHODCALLTYPE *OnLinkSrcChange)(INTERFACE *This, IMoniker* pmk);
-
 /*** IUnknown methods ***/
 #define IAdviseSink2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IAdviseSink2_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -6226,6 +6247,21 @@ struct IAdviseSink2Vtbl {
 
 #endif
 
+#define IAdviseSink2_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IAdviseSink methods ***/ \
+    STDMETHOD_(void,OnDataChange)(THIS_ FORMATETC* pFormatetc, STGMEDIUM* pStgmed) PURE; \
+    STDMETHOD_(void,OnViewChange)(THIS_ DWORD dwAspect, LONG lindex) PURE; \
+    STDMETHOD_(void,OnRename)(THIS_ IMoniker* pmk) PURE; \
+    STDMETHOD_(void,OnSave)(THIS) PURE; \
+    STDMETHOD_(void,OnClose)(THIS) PURE; \
+    /*** IAdviseSink2 methods ***/ \
+    STDMETHOD_(void,OnLinkSrcChange)(THIS_ IMoniker* pmk) PURE;
+
 HRESULT CALLBACK IAdviseSink2_RemoteOnLinkSrcChange_Proxy(
     IAdviseSink2* This,
     IAsyncManager** ppIAM,
@@ -6363,22 +6399,6 @@ struct IDataObjectVtbl {
 
 };
 
-#define IDataObject_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IDataObject methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetData)(INTERFACE *This, FORMATETC* pformatetcIn, STGMEDIUM* pmedium); \
-    HRESULT (STDMETHODCALLTYPE *GetDataHere)(INTERFACE *This, FORMATETC* pformatetc, STGMEDIUM* pmedium); \
-    HRESULT (STDMETHODCALLTYPE *QueryGetData)(INTERFACE *This, FORMATETC* pformatetc); \
-    HRESULT (STDMETHODCALLTYPE *GetCanonicalFormatEtc)(INTERFACE *This, FORMATETC* pformatectIn, FORMATETC* pformatetcOut); \
-    HRESULT (STDMETHODCALLTYPE *SetData)(INTERFACE *This, FORMATETC* pformatetc, STGMEDIUM* pmedium, BOOL fRelease); \
-    HRESULT (STDMETHODCALLTYPE *EnumFormatEtc)(INTERFACE *This, DWORD dwDirection, IEnumFORMATETC** ppenumFormatEtc); \
-    HRESULT (STDMETHODCALLTYPE *DAdvise)(INTERFACE *This, FORMATETC* pformatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD* pdwConnection); \
-    HRESULT (STDMETHODCALLTYPE *DUnadvise)(INTERFACE *This, DWORD dwConnection); \
-    HRESULT (STDMETHODCALLTYPE *EnumDAdvise)(INTERFACE *This, IEnumSTATDATA** ppenumAdvise);
-
 /*** IUnknown methods ***/
 #define IDataObject_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IDataObject_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -6396,6 +6416,23 @@ struct IDataObjectVtbl {
 
 #endif
 
+#define IDataObject_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IDataObject methods ***/ \
+    STDMETHOD_(HRESULT,GetData)(THIS_ FORMATETC* pformatetcIn, STGMEDIUM* pmedium) PURE; \
+    STDMETHOD_(HRESULT,GetDataHere)(THIS_ FORMATETC* pformatetc, STGMEDIUM* pmedium) PURE; \
+    STDMETHOD_(HRESULT,QueryGetData)(THIS_ FORMATETC* pformatetc) PURE; \
+    STDMETHOD_(HRESULT,GetCanonicalFormatEtc)(THIS_ FORMATETC* pformatectIn, FORMATETC* pformatetcOut) PURE; \
+    STDMETHOD_(HRESULT,SetData)(THIS_ FORMATETC* pformatetc, STGMEDIUM* pmedium, BOOL fRelease) PURE; \
+    STDMETHOD_(HRESULT,EnumFormatEtc)(THIS_ DWORD dwDirection, IEnumFORMATETC** ppenumFormatEtc) PURE; \
+    STDMETHOD_(HRESULT,DAdvise)(THIS_ FORMATETC* pformatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD* pdwConnection) PURE; \
+    STDMETHOD_(HRESULT,DUnadvise)(THIS_ DWORD dwConnection) PURE; \
+    STDMETHOD_(HRESULT,EnumDAdvise)(THIS_ IEnumSTATDATA** ppenumAdvise) PURE;
+
 HRESULT CALLBACK IDataObject_RemoteGetData_Proxy(
     IDataObject* This,
     FORMATETC* pformatetcIn,
@@ -6578,17 +6615,6 @@ struct IDataAdviseHolderVtbl {
 
 };
 
-#define IDataAdviseHolder_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IDataAdviseHolder methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Advise)(INTERFACE *This, IDataObject* pDataObject, FORMATETC* pFetc, DWORD advf, IAdviseSink* pAdvise, DWORD* pdwConnection); \
-    HRESULT (STDMETHODCALLTYPE *Unadvise)(INTERFACE *This, DWORD dwConnection); \
-    HRESULT (STDMETHODCALLTYPE *EnumAdvise)(INTERFACE *This, IEnumSTATDATA** ppenumAdvise); \
-    HRESULT (STDMETHODCALLTYPE *SendOnDataChange)(INTERFACE *This, IDataObject* pDataObject, DWORD dwReserved, DWORD advf);
-
 /*** IUnknown methods ***/
 #define IDataAdviseHolder_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IDataAdviseHolder_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -6601,6 +6627,18 @@ struct IDataAdviseHolderVtbl {
 
 #endif
 
+#define IDataAdviseHolder_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IDataAdviseHolder methods ***/ \
+    STDMETHOD_(HRESULT,Advise)(THIS_ IDataObject* pDataObject, FORMATETC* pFetc, DWORD advf, IAdviseSink* pAdvise, DWORD* pdwConnection) PURE; \
+    STDMETHOD_(HRESULT,Unadvise)(THIS_ DWORD dwConnection) PURE; \
+    STDMETHOD_(HRESULT,EnumAdvise)(THIS_ IEnumSTATDATA** ppenumAdvise) PURE; \
+    STDMETHOD_(HRESULT,SendOnDataChange)(THIS_ IDataObject* pDataObject, DWORD dwReserved, DWORD advf) PURE;
+
 HRESULT CALLBACK IDataAdviseHolder_Advise_Proxy(
     IDataAdviseHolder* This,
     IDataObject* pDataObject,
@@ -6740,16 +6778,6 @@ struct IMessageFilterVtbl {
 
 };
 
-#define IMessageFilter_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IMessageFilter methods ***/ \
-    DWORD (STDMETHODCALLTYPE *HandleInComingCall)(INTERFACE *This, DWORD dwCallType, HTASK htaskCaller, DWORD dwTickCount, LPINTERFACEINFO lpInterfaceInfo); \
-    DWORD (STDMETHODCALLTYPE *RetryRejectedCall)(INTERFACE *This, HTASK htaskCallee, DWORD dwTickCount, DWORD dwRejectType); \
-    DWORD (STDMETHODCALLTYPE *MessagePending)(INTERFACE *This, HTASK htaskCallee, DWORD dwTickCount, DWORD dwPendingType);
-
 /*** IUnknown methods ***/
 #define IMessageFilter_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IMessageFilter_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -6761,6 +6789,17 @@ struct IMessageFilterVtbl {
 
 #endif
 
+#define IMessageFilter_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IMessageFilter methods ***/ \
+    STDMETHOD_(DWORD,HandleInComingCall)(THIS_ DWORD dwCallType, HTASK htaskCaller, DWORD dwTickCount, LPINTERFACEINFO lpInterfaceInfo) PURE; \
+    STDMETHOD_(DWORD,RetryRejectedCall)(THIS_ HTASK htaskCallee, DWORD dwTickCount, DWORD dwRejectType) PURE; \
+    STDMETHOD_(DWORD,MessagePending)(THIS_ HTASK htaskCallee, DWORD dwTickCount, DWORD dwPendingType) PURE;
+
 DWORD CALLBACK IMessageFilter_HandleInComingCall_Proxy(
     IMessageFilter* This,
     DWORD dwCallType,
@@ -6881,18 +6920,6 @@ struct IRpcChannelBufferVtbl {
 
 };
 
-#define IRpcChannelBuffer_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IRpcChannelBuffer methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetBuffer)(INTERFACE *This, RPCOLEMESSAGE* pMessage, REFIID riid); \
-    HRESULT (STDMETHODCALLTYPE *SendReceive)(INTERFACE *This, RPCOLEMESSAGE* pMessage, ULONG* pStatus); \
-    HRESULT (STDMETHODCALLTYPE *FreeBuffer)(INTERFACE *This, RPCOLEMESSAGE* pMessage); \
-    HRESULT (STDMETHODCALLTYPE *GetDestCtx)(INTERFACE *This, DWORD* pdwDestContext, void** ppvDestContext); \
-    HRESULT (STDMETHODCALLTYPE *IsConnected)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define IRpcChannelBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IRpcChannelBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -6906,6 +6933,19 @@ struct IRpcChannelBufferVtbl {
 
 #endif
 
+#define IRpcChannelBuffer_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IRpcChannelBuffer methods ***/ \
+    STDMETHOD_(HRESULT,GetBuffer)(THIS_ RPCOLEMESSAGE* pMessage, REFIID riid) PURE; \
+    STDMETHOD_(HRESULT,SendReceive)(THIS_ RPCOLEMESSAGE* pMessage, ULONG* pStatus) PURE; \
+    STDMETHOD_(HRESULT,FreeBuffer)(THIS_ RPCOLEMESSAGE* pMessage) PURE; \
+    STDMETHOD_(HRESULT,GetDestCtx)(THIS_ DWORD* pdwDestContext, void** ppvDestContext) PURE; \
+    STDMETHOD_(HRESULT,IsConnected)(THIS) PURE;
+
 HRESULT CALLBACK IRpcChannelBuffer_GetBuffer_Proxy(
     IRpcChannelBuffer* This,
     RPCOLEMESSAGE* pMessage,
@@ -7013,20 +7053,6 @@ struct IRpcChannelBuffer2Vtbl {
 
 };
 
-#define IRpcChannelBuffer2_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IRpcChannelBuffer methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetBuffer)(INTERFACE *This, RPCOLEMESSAGE* pMessage, REFIID riid); \
-    HRESULT (STDMETHODCALLTYPE *SendReceive)(INTERFACE *This, RPCOLEMESSAGE* pMessage, ULONG* pStatus); \
-    HRESULT (STDMETHODCALLTYPE *FreeBuffer)(INTERFACE *This, RPCOLEMESSAGE* pMessage); \
-    HRESULT (STDMETHODCALLTYPE *GetDestCtx)(INTERFACE *This, DWORD* pdwDestContext, void** ppvDestContext); \
-    HRESULT (STDMETHODCALLTYPE *IsConnected)(INTERFACE *This); \
-    /*** IRpcChannelBuffer2 methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetProtocolVersion)(INTERFACE *This, DWORD* pdwVersion);
-
 /*** IUnknown methods ***/
 #define IRpcChannelBuffer2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IRpcChannelBuffer2_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -7042,6 +7068,21 @@ struct IRpcChannelBuffer2Vtbl {
 
 #endif
 
+#define IRpcChannelBuffer2_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IRpcChannelBuffer methods ***/ \
+    STDMETHOD_(HRESULT,GetBuffer)(THIS_ RPCOLEMESSAGE* pMessage, REFIID riid) PURE; \
+    STDMETHOD_(HRESULT,SendReceive)(THIS_ RPCOLEMESSAGE* pMessage, ULONG* pStatus) PURE; \
+    STDMETHOD_(HRESULT,FreeBuffer)(THIS_ RPCOLEMESSAGE* pMessage) PURE; \
+    STDMETHOD_(HRESULT,GetDestCtx)(THIS_ DWORD* pdwDestContext, void** ppvDestContext) PURE; \
+    STDMETHOD_(HRESULT,IsConnected)(THIS) PURE; \
+    /*** IRpcChannelBuffer2 methods ***/ \
+    STDMETHOD_(HRESULT,GetProtocolVersion)(THIS_ DWORD* pdwVersion) PURE;
+
 HRESULT CALLBACK IRpcChannelBuffer2_GetProtocolVersion_Proxy(
     IRpcChannelBuffer2* This,
     DWORD* pdwVersion);
@@ -7180,28 +7221,6 @@ struct IRpcChannelBuffer3Vtbl {
 
 };
 
-#define IRpcChannelBuffer3_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IRpcChannelBuffer methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetBuffer)(INTERFACE *This, RPCOLEMESSAGE* pMessage, REFIID riid); \
-    HRESULT (STDMETHODCALLTYPE *SendReceive)(INTERFACE *This, RPCOLEMESSAGE* pMessage, ULONG* pStatus); \
-    HRESULT (STDMETHODCALLTYPE *FreeBuffer)(INTERFACE *This, RPCOLEMESSAGE* pMessage); \
-    HRESULT (STDMETHODCALLTYPE *GetDestCtx)(INTERFACE *This, DWORD* pdwDestContext, void** ppvDestContext); \
-    HRESULT (STDMETHODCALLTYPE *IsConnected)(INTERFACE *This); \
-    /*** IRpcChannelBuffer2 methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetProtocolVersion)(INTERFACE *This, DWORD* pdwVersion); \
-    /*** IRpcChannelBuffer3 methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Send)(INTERFACE *This, RPCOLEMESSAGE* pMsg, ULONG* pulStatus); \
-    HRESULT (STDMETHODCALLTYPE *Receive)(INTERFACE *This, RPCOLEMESSAGE* pMsg, ULONG ulSize, ULONG* pulStatus); \
-    HRESULT (STDMETHODCALLTYPE *Cancel)(INTERFACE *This, RPCOLEMESSAGE* pMsg); \
-    HRESULT (STDMETHODCALLTYPE *GetCallContext)(INTERFACE *This, RPCOLEMESSAGE* pMsg, REFIID riid, void** pInterface); \
-    HRESULT (STDMETHODCALLTYPE *GetDestCtxEx)(INTERFACE *This, RPCOLEMESSAGE* pMsg, DWORD* pdwDestContext, void** ppvDestContext); \
-    HRESULT (STDMETHODCALLTYPE *GetState)(INTERFACE *This, RPCOLEMESSAGE* pMsg, DWORD* pState); \
-    HRESULT (STDMETHODCALLTYPE *RegisterAsync)(INTERFACE *This, RPCOLEMESSAGE* pMsg, IAsyncManager* pAsyncMgr);
-
 /*** IUnknown methods ***/
 #define IRpcChannelBuffer3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IRpcChannelBuffer3_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -7225,6 +7244,29 @@ struct IRpcChannelBuffer3Vtbl {
 
 #endif
 
+#define IRpcChannelBuffer3_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IRpcChannelBuffer methods ***/ \
+    STDMETHOD_(HRESULT,GetBuffer)(THIS_ RPCOLEMESSAGE* pMessage, REFIID riid) PURE; \
+    STDMETHOD_(HRESULT,SendReceive)(THIS_ RPCOLEMESSAGE* pMessage, ULONG* pStatus) PURE; \
+    STDMETHOD_(HRESULT,FreeBuffer)(THIS_ RPCOLEMESSAGE* pMessage) PURE; \
+    STDMETHOD_(HRESULT,GetDestCtx)(THIS_ DWORD* pdwDestContext, void** ppvDestContext) PURE; \
+    STDMETHOD_(HRESULT,IsConnected)(THIS) PURE; \
+    /*** IRpcChannelBuffer2 methods ***/ \
+    STDMETHOD_(HRESULT,GetProtocolVersion)(THIS_ DWORD* pdwVersion) PURE; \
+    /*** IRpcChannelBuffer3 methods ***/ \
+    STDMETHOD_(HRESULT,Send)(THIS_ RPCOLEMESSAGE* pMsg, ULONG* pulStatus) PURE; \
+    STDMETHOD_(HRESULT,Receive)(THIS_ RPCOLEMESSAGE* pMsg, ULONG ulSize, ULONG* pulStatus) PURE; \
+    STDMETHOD_(HRESULT,Cancel)(THIS_ RPCOLEMESSAGE* pMsg) PURE; \
+    STDMETHOD_(HRESULT,GetCallContext)(THIS_ RPCOLEMESSAGE* pMsg, REFIID riid, void** pInterface) PURE; \
+    STDMETHOD_(HRESULT,GetDestCtxEx)(THIS_ RPCOLEMESSAGE* pMsg, DWORD* pdwDestContext, void** ppvDestContext) PURE; \
+    STDMETHOD_(HRESULT,GetState)(THIS_ RPCOLEMESSAGE* pMsg, DWORD* pState) PURE; \
+    STDMETHOD_(HRESULT,RegisterAsync)(THIS_ RPCOLEMESSAGE* pMsg, IAsyncManager* pAsyncMgr) PURE;
+
 HRESULT CALLBACK IRpcChannelBuffer3_Send_Proxy(
     IRpcChannelBuffer3* This,
     RPCOLEMESSAGE* pMsg,
@@ -7338,15 +7380,6 @@ struct IRpcProxyBufferVtbl {
 
 };
 
-#define IRpcProxyBuffer_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IRpcProxyBuffer methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Connect)(INTERFACE *This, IRpcChannelBuffer* pRpcChannelBuffer); \
-    void (STDMETHODCALLTYPE *Disconnect)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define IRpcProxyBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IRpcProxyBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -7357,6 +7390,16 @@ struct IRpcProxyBufferVtbl {
 
 #endif
 
+#define IRpcProxyBuffer_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IRpcProxyBuffer methods ***/ \
+    STDMETHOD_(HRESULT,Connect)(THIS_ IRpcChannelBuffer* pRpcChannelBuffer) PURE; \
+    STDMETHOD_(void,Disconnect)(THIS) PURE;
+
 HRESULT CALLBACK IRpcProxyBuffer_Connect_Proxy(
     IRpcProxyBuffer* This,
     IRpcChannelBuffer* pRpcChannelBuffer);
@@ -7456,20 +7499,6 @@ struct IRpcStubBufferVtbl {
 
 };
 
-#define IRpcStubBuffer_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IRpcStubBuffer methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Connect)(INTERFACE *This, IUnknown* pUnkServer); \
-    void (STDMETHODCALLTYPE *Disconnect)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Invoke)(INTERFACE *This, RPCOLEMESSAGE* _prpcmsg, IRpcChannelBuffer* _pRpcChannelBuffer); \
-    IRpcStubBuffer* (STDMETHODCALLTYPE *IsIIDSupported)(INTERFACE *This, REFIID riid); \
-    ULONG (STDMETHODCALLTYPE *CountRefs)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *DebugServerQueryInterface)(INTERFACE *This, void** ppv); \
-    void (STDMETHODCALLTYPE *DebugServerRelease)(INTERFACE *This, void* pv);
-
 /*** IUnknown methods ***/
 #define IRpcStubBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IRpcStubBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -7485,6 +7514,21 @@ struct IRpcStubBufferVtbl {
 
 #endif
 
+#define IRpcStubBuffer_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IRpcStubBuffer methods ***/ \
+    STDMETHOD_(HRESULT,Connect)(THIS_ IUnknown* pUnkServer) PURE; \
+    STDMETHOD_(void,Disconnect)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Invoke)(THIS_ RPCOLEMESSAGE* _prpcmsg, IRpcChannelBuffer* _pRpcChannelBuffer) PURE; \
+    STDMETHOD_(IRpcStubBuffer*,IsIIDSupported)(THIS_ REFIID riid) PURE; \
+    STDMETHOD_(ULONG,CountRefs)(THIS) PURE; \
+    STDMETHOD_(HRESULT,DebugServerQueryInterface)(THIS_ void** ppv) PURE; \
+    STDMETHOD_(void,DebugServerRelease)(THIS_ void* pv) PURE;
+
 HRESULT CALLBACK IRpcStubBuffer_Connect_Proxy(
     IRpcStubBuffer* This,
     IUnknown* pUnkServer);
@@ -7599,15 +7643,6 @@ struct IPSFactoryBufferVtbl {
 
 };
 
-#define IPSFactoryBuffer_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IPSFactoryBuffer methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *CreateProxy)(INTERFACE *This, IUnknown* pUnkOuter, REFIID riid, IRpcProxyBuffer** ppProxy, void** ppv); \
-    HRESULT (STDMETHODCALLTYPE *CreateStub)(INTERFACE *This, REFIID riid, IUnknown* pUnkServer, IRpcStubBuffer** ppStub);
-
 /*** IUnknown methods ***/
 #define IPSFactoryBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IPSFactoryBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -7618,6 +7653,16 @@ struct IPSFactoryBufferVtbl {
 
 #endif
 
+#define IPSFactoryBuffer_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IPSFactoryBuffer methods ***/ \
+    STDMETHOD_(HRESULT,CreateProxy)(THIS_ IUnknown* pUnkOuter, REFIID riid, IRpcProxyBuffer** ppProxy, void** ppv) PURE; \
+    STDMETHOD_(HRESULT,CreateStub)(THIS_ REFIID riid, IUnknown* pUnkServer, IRpcStubBuffer** ppStub) PURE;
+
 HRESULT CALLBACK IPSFactoryBuffer_CreateProxy_Proxy(
     IPSFactoryBuffer* This,
     IUnknown* pUnkOuter,
@@ -7767,19 +7812,6 @@ struct IChannelHookVtbl {
 
 };
 
-#define IChannelHook_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IChannelHook methods ***/ \
-    void (STDMETHODCALLTYPE *ClientGetSize)(INTERFACE *This, REFGUID uExtent, REFIID riid, ULONG* pDataSize); \
-    void (STDMETHODCALLTYPE *ClientFillBuffer)(INTERFACE *This, REFGUID uExtent, REFIID riid, ULONG* pDataSize, void* pDataBuffer); \
-    void (STDMETHODCALLTYPE *ClientNotify)(INTERFACE *This, REFGUID uExtent, REFIID riid, ULONG cbDataSize, void* pDataBuffer, DWORD lDataRep, HRESULT hrFault); \
-    void (STDMETHODCALLTYPE *ServerNotify)(INTERFACE *This, REFGUID uExtent, REFIID riid, ULONG cbDataSize, void* pDataBuffer, DWORD lDataRep); \
-    void (STDMETHODCALLTYPE *ServerGetSize)(INTERFACE *This, REFGUID uExtent, REFIID riid, HRESULT hrFault, ULONG* pDataSize); \
-    void (STDMETHODCALLTYPE *ServerFillBuffer)(INTERFACE *This, REFGUID uExtent, REFIID riid, ULONG* pDataSize, void* pDataBuffer, HRESULT hrFault);
-
 /*** IUnknown methods ***/
 #define IChannelHook_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IChannelHook_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -7794,6 +7826,20 @@ struct IChannelHookVtbl {
 
 #endif
 
+#define IChannelHook_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IChannelHook methods ***/ \
+    STDMETHOD_(void,ClientGetSize)(THIS_ REFGUID uExtent, REFIID riid, ULONG* pDataSize) PURE; \
+    STDMETHOD_(void,ClientFillBuffer)(THIS_ REFGUID uExtent, REFIID riid, ULONG* pDataSize, void* pDataBuffer) PURE; \
+    STDMETHOD_(void,ClientNotify)(THIS_ REFGUID uExtent, REFIID riid, ULONG cbDataSize, void* pDataBuffer, DWORD lDataRep, HRESULT hrFault) PURE; \
+    STDMETHOD_(void,ServerNotify)(THIS_ REFGUID uExtent, REFIID riid, ULONG cbDataSize, void* pDataBuffer, DWORD lDataRep) PURE; \
+    STDMETHOD_(void,ServerGetSize)(THIS_ REFGUID uExtent, REFIID riid, HRESULT hrFault, ULONG* pDataSize) PURE; \
+    STDMETHOD_(void,ServerFillBuffer)(THIS_ REFGUID uExtent, REFIID riid, ULONG* pDataSize, void* pDataBuffer, HRESULT hrFault) PURE;
+
 void CALLBACK IChannelHook_ClientGetSize_Proxy(
     IChannelHook* This,
     REFGUID uExtent,
@@ -8215,25 +8261,6 @@ struct IPropertyStorageVtbl {
 
 };
 
-#define IPropertyStorage_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IPropertyStorage methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *ReadMultiple)(INTERFACE *This, ULONG cpspec, const PROPSPEC rgpspec[], PROPVARIANT rgpropvar[]); \
-    HRESULT (STDMETHODCALLTYPE *WriteMultiple)(INTERFACE *This, ULONG cpspec, const PROPSPEC rgpspec[], const PROPVARIANT rgpropvar[], PROPID propidNameFirst); \
-    HRESULT (STDMETHODCALLTYPE *DeleteMultiple)(INTERFACE *This, ULONG cpspec, const PROPSPEC rgpspec[]); \
-    HRESULT (STDMETHODCALLTYPE *ReadPropertyNames)(INTERFACE *This, ULONG cpropid, const PROPID rgpropid[], LPOLESTR rglpwstrName[]); \
-    HRESULT (STDMETHODCALLTYPE *WritePropertyNames)(INTERFACE *This, ULONG cpropid, const PROPID rgpropid[], const LPOLESTR rglpwstrName[]); \
-    HRESULT (STDMETHODCALLTYPE *DeletePropertyNames)(INTERFACE *This, ULONG cpropid, const PROPID rgpropid[]); \
-    HRESULT (STDMETHODCALLTYPE *Commit)(INTERFACE *This, DWORD grfCommitFlags); \
-    HRESULT (STDMETHODCALLTYPE *Revert)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Enum)(INTERFACE *This, IEnumSTATPROPSTG** ppenum); \
-    HRESULT (STDMETHODCALLTYPE *SetTimes)(INTERFACE *This, const FILETIME* pctime, const FILETIME* patime, const FILETIME* pmtime); \
-    HRESULT (STDMETHODCALLTYPE *SetClass)(INTERFACE *This, REFCLSID clsid); \
-    HRESULT (STDMETHODCALLTYPE *Stat)(INTERFACE *This, STATPROPSETSTG* statpsstg);
-
 /*** IUnknown methods ***/
 #define IPropertyStorage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IPropertyStorage_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -8254,6 +8281,26 @@ struct IPropertyStorageVtbl {
 
 #endif
 
+#define IPropertyStorage_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IPropertyStorage methods ***/ \
+    STDMETHOD_(HRESULT,ReadMultiple)(THIS_ ULONG cpspec, const PROPSPEC rgpspec[], PROPVARIANT rgpropvar[]) PURE; \
+    STDMETHOD_(HRESULT,WriteMultiple)(THIS_ ULONG cpspec, const PROPSPEC rgpspec[], const PROPVARIANT rgpropvar[], PROPID propidNameFirst) PURE; \
+    STDMETHOD_(HRESULT,DeleteMultiple)(THIS_ ULONG cpspec, const PROPSPEC rgpspec[]) PURE; \
+    STDMETHOD_(HRESULT,ReadPropertyNames)(THIS_ ULONG cpropid, const PROPID rgpropid[], LPOLESTR rglpwstrName[]) PURE; \
+    STDMETHOD_(HRESULT,WritePropertyNames)(THIS_ ULONG cpropid, const PROPID rgpropid[], const LPOLESTR rglpwstrName[]) PURE; \
+    STDMETHOD_(HRESULT,DeletePropertyNames)(THIS_ ULONG cpropid, const PROPID rgpropid[]) PURE; \
+    STDMETHOD_(HRESULT,Commit)(THIS_ DWORD grfCommitFlags) PURE; \
+    STDMETHOD_(HRESULT,Revert)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Enum)(THIS_ IEnumSTATPROPSTG** ppenum) PURE; \
+    STDMETHOD_(HRESULT,SetTimes)(THIS_ const FILETIME* pctime, const FILETIME* patime, const FILETIME* pmtime) PURE; \
+    STDMETHOD_(HRESULT,SetClass)(THIS_ REFCLSID clsid) PURE; \
+    STDMETHOD_(HRESULT,Stat)(THIS_ STATPROPSETSTG* statpsstg) PURE;
+
 HRESULT CALLBACK IPropertyStorage_ReadMultiple_Proxy(
     IPropertyStorage* This,
     ULONG cpspec,
@@ -8437,17 +8484,6 @@ struct IPropertySetStorageVtbl {
 
 };
 
-#define IPropertySetStorage_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IPropertySetStorage methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Create)(INTERFACE *This, REFFMTID rfmtid, const CLSID* pclsid, DWORD grfFlags, DWORD grfMode, IPropertyStorage** ppprstg); \
-    HRESULT (STDMETHODCALLTYPE *Open)(INTERFACE *This, REFFMTID rfmtid, DWORD grfMode, IPropertyStorage** ppprstg); \
-    HRESULT (STDMETHODCALLTYPE *Delete)(INTERFACE *This, REFFMTID rfmtid); \
-    HRESULT (STDMETHODCALLTYPE *Enum)(INTERFACE *This, IEnumSTATPROPSETSTG** ppenum);
-
 /*** IUnknown methods ***/
 #define IPropertySetStorage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IPropertySetStorage_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -8460,6 +8496,18 @@ struct IPropertySetStorageVtbl {
 
 #endif
 
+#define IPropertySetStorage_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IPropertySetStorage methods ***/ \
+    STDMETHOD_(HRESULT,Create)(THIS_ REFFMTID rfmtid, const CLSID* pclsid, DWORD grfFlags, DWORD grfMode, IPropertyStorage** ppprstg) PURE; \
+    STDMETHOD_(HRESULT,Open)(THIS_ REFFMTID rfmtid, DWORD grfMode, IPropertyStorage** ppprstg) PURE; \
+    STDMETHOD_(HRESULT,Delete)(THIS_ REFFMTID rfmtid) PURE; \
+    STDMETHOD_(HRESULT,Enum)(THIS_ IEnumSTATPROPSETSTG** ppenum) PURE;
+
 HRESULT CALLBACK IPropertySetStorage_Create_Proxy(
     IPropertySetStorage* This,
     REFFMTID rfmtid,
@@ -8563,17 +8611,6 @@ struct IEnumSTATPROPSTGVtbl {
 
 };
 
-#define IEnumSTATPROPSTG_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IEnumSTATPROPSTG methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Next)(INTERFACE *This, ULONG celt, STATPROPSTG* rgelt, ULONG* pceltFetched); \
-    HRESULT (STDMETHODCALLTYPE *Skip)(INTERFACE *This, ULONG celt); \
-    HRESULT (STDMETHODCALLTYPE *Reset)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IEnumSTATPROPSTG** ppenum);
-
 /*** IUnknown methods ***/
 #define IEnumSTATPROPSTG_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IEnumSTATPROPSTG_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -8586,6 +8623,18 @@ struct IEnumSTATPROPSTGVtbl {
 
 #endif
 
+#define IEnumSTATPROPSTG_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IEnumSTATPROPSTG methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, STATPROPSTG* rgelt, ULONG* pceltFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumSTATPROPSTG** ppenum) PURE;
+
 HRESULT CALLBACK IEnumSTATPROPSTG_RemoteNext_Proxy(
     IEnumSTATPROPSTG* This,
     ULONG celt,
@@ -8694,17 +8743,6 @@ struct IEnumSTATPROPSETSTGVtbl {
 
 };
 
-#define IEnumSTATPROPSETSTG_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IEnumSTATPROPSETSTG methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *Next)(INTERFACE *This, ULONG celt, STATPROPSETSTG* rgelt, ULONG* pceltFetched); \
-    HRESULT (STDMETHODCALLTYPE *Skip)(INTERFACE *This, ULONG celt); \
-    HRESULT (STDMETHODCALLTYPE *Reset)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *Clone)(INTERFACE *This, IEnumSTATPROPSETSTG** ppenum);
-
 /*** IUnknown methods ***/
 #define IEnumSTATPROPSETSTG_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IEnumSTATPROPSETSTG_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -8717,6 +8755,18 @@ struct IEnumSTATPROPSETSTGVtbl {
 
 #endif
 
+#define IEnumSTATPROPSETSTG_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IEnumSTATPROPSETSTG methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, STATPROPSETSTG* rgelt, ULONG* pceltFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumSTATPROPSETSTG** ppenum) PURE;
+
 HRESULT CALLBACK IEnumSTATPROPSETSTG_RemoteNext_Proxy(
     IEnumSTATPROPSETSTG* This,
     ULONG celt,
@@ -8862,16 +8912,6 @@ struct IClientSecurityVtbl {
 
 };
 
-#define IClientSecurity_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IClientSecurity methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryBlanket)(INTERFACE *This, IUnknown* pProxy, DWORD* pAuthnSvc, DWORD* pAuthzSvc, OLECHAR** pServerPrincName, DWORD* pAuthnLevel, DWORD* pImpLevel, void** pAuthInfo, DWORD* pCapabilites); \
-    HRESULT (STDMETHODCALLTYPE *SetBlanket)(INTERFACE *This, IUnknown* pProxy, DWORD AuthnSvc, DWORD AuthzSvc, OLECHAR* pServerPrincName, DWORD AuthnLevel, DWORD ImpLevel, void* pAuthInfo, DWORD Capabilities); \
-    HRESULT (STDMETHODCALLTYPE *CopyProxy)(INTERFACE *This, IUnknown* pProxy, IUnknown** ppCopy);
-
 /*** IUnknown methods ***/
 #define IClientSecurity_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IClientSecurity_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -8883,6 +8923,17 @@ struct IClientSecurityVtbl {
 
 #endif
 
+#define IClientSecurity_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IClientSecurity methods ***/ \
+    STDMETHOD_(HRESULT,QueryBlanket)(THIS_ IUnknown* pProxy, DWORD* pAuthnSvc, DWORD* pAuthzSvc, OLECHAR** pServerPrincName, DWORD* pAuthnLevel, DWORD* pImpLevel, void** pAuthInfo, DWORD* pCapabilites) PURE; \
+    STDMETHOD_(HRESULT,SetBlanket)(THIS_ IUnknown* pProxy, DWORD AuthnSvc, DWORD AuthzSvc, OLECHAR* pServerPrincName, DWORD AuthnLevel, DWORD ImpLevel, void* pAuthInfo, DWORD Capabilities) PURE; \
+    STDMETHOD_(HRESULT,CopyProxy)(THIS_ IUnknown* pProxy, IUnknown** ppCopy) PURE;
+
 HRESULT CALLBACK IClientSecurity_QueryBlanket_Proxy(
     IClientSecurity* This,
     IUnknown* pProxy,
@@ -8992,17 +9043,6 @@ struct IServerSecurityVtbl {
 
 };
 
-#define IServerSecurity_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IServerSecurity methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryBlanket)(INTERFACE *This, DWORD* pAuthnSvc, DWORD* pAuthzSvc, OLECHAR** pServerPrincName, DWORD* pAuthnLevel, DWORD* pImpLevel, void** pPrivs, DWORD* pCapabilities); \
-    HRESULT (STDMETHODCALLTYPE *ImpersonateClient)(INTERFACE *This); \
-    HRESULT (STDMETHODCALLTYPE *RevertToSelf)(INTERFACE *This); \
-    BOOL (STDMETHODCALLTYPE *IsImpersonating)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define IServerSecurity_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IServerSecurity_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -9015,6 +9055,18 @@ struct IServerSecurityVtbl {
 
 #endif
 
+#define IServerSecurity_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IServerSecurity methods ***/ \
+    STDMETHOD_(HRESULT,QueryBlanket)(THIS_ DWORD* pAuthnSvc, DWORD* pAuthzSvc, OLECHAR** pServerPrincName, DWORD* pAuthnLevel, DWORD* pImpLevel, void** pPrivs, DWORD* pCapabilities) PURE; \
+    STDMETHOD_(HRESULT,ImpersonateClient)(THIS) PURE; \
+    STDMETHOD_(HRESULT,RevertToSelf)(THIS) PURE; \
+    STDMETHOD_(BOOL,IsImpersonating)(THIS) PURE;
+
 HRESULT CALLBACK IServerSecurity_QueryBlanket_Proxy(
     IServerSecurity* This,
     DWORD* pAuthnSvc,
@@ -9098,14 +9150,6 @@ struct IAsyncSetupVtbl {
 
 };
 
-#define IAsyncSetup_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IAsyncSetup methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *GetAsyncManager)(INTERFACE *This, REFIID riid, IUnknown* pOuter, DWORD dwFlags, IUnknown** ppInner, IAsyncManager** ppAsyncMgr);
-
 /*** IUnknown methods ***/
 #define IAsyncSetup_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IAsyncSetup_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -9115,6 +9159,15 @@ struct IAsyncSetupVtbl {
 
 #endif
 
+#define IAsyncSetup_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IAsyncSetup methods ***/ \
+    STDMETHOD_(HRESULT,GetAsyncManager)(THIS_ REFIID riid, IUnknown* pOuter, DWORD dwFlags, IUnknown** ppInner, IAsyncManager** ppAsyncMgr) PURE;
+
 HRESULT CALLBACK IAsyncSetup_GetAsyncManager_Proxy(
     IAsyncSetup* This,
     REFIID riid,
@@ -9188,16 +9241,6 @@ struct IAsyncManagerVtbl {
 
 };
 
-#define IAsyncManager_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IAsyncManager methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *CompleteCall)(INTERFACE *This, HRESULT Result); \
-    HRESULT (STDMETHODCALLTYPE *GetCallContext)(INTERFACE *This, REFIID riid, void** pInterface); \
-    HRESULT (STDMETHODCALLTYPE *GetState)(INTERFACE *This, ULONG* pulStateFlags);
-
 /*** IUnknown methods ***/
 #define IAsyncManager_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IAsyncManager_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -9209,6 +9252,17 @@ struct IAsyncManagerVtbl {
 
 #endif
 
+#define IAsyncManager_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IAsyncManager methods ***/ \
+    STDMETHOD_(HRESULT,CompleteCall)(THIS_ HRESULT Result) PURE; \
+    STDMETHOD_(HRESULT,GetCallContext)(THIS_ REFIID riid, void** pInterface) PURE; \
+    STDMETHOD_(HRESULT,GetState)(THIS_ ULONG* pulStateFlags) PURE;
+
 HRESULT CALLBACK IAsyncManager_CompleteCall_Proxy(
     IAsyncManager* This,
     HRESULT Result);
diff --git a/include/oledlg.h b/include/oledlg.h
index 6dbcaf3063..5ee3af5472 100644
--- a/include/oledlg.h
+++ b/include/oledlg.h
@@ -642,6 +642,7 @@ DECL_WINELIB_TYPE_AW(LPOLEUICHANGESOURCE)
  */
 #define INTERFACE   IOleUILinkContainerA
 #define IOleUILinkContainerA_METHODS \
+    IUnknown_METHODS \
     STDMETHOD_(DWORD,GetNextLink)(THIS_ DWORD dwLink) PURE; \
     STDMETHOD(SetLinkUpdateOptions)(THIS_ DWORD dwLink, DWORD dwUpdateOpt) PURE; \
     STDMETHOD(GetLinkUpdateOptions)(THIS_ DWORD dwLink, DWORD *lpdwUpdateOpt) PURE; \
@@ -653,14 +654,12 @@ DECL_WINELIB_TYPE_AW(LPOLEUICHANGESOURCE)
     STDMETHOD(OpenLinkSource)(THIS_ DWORD dwLink) PURE; \
     STDMETHOD(UpdateLink)(THIS_ DWORD dwLink, BOOL fErrorMessage, BOOL fReserved) PURE; \
     STDMETHOD(CancelLink)(THIS_ DWORD dwLink) PURE;
-#define IOleUILinkContainerA_IMETHODS \
-    IUnknown_IMETHODS \
-    IOleUILinkContainerA_METHODS
 ICOM_DEFINE(IOleUILinkContainerA, IUnknown)
 #undef INTERFACE
 
 #define INTERFACE   IOleUILinkContainerW
 #define IOleUILinkContainerW_METHODS \
+    IUnknown_METHODS \
     STDMETHOD_(DWORD,GetNextLink)(THIS_ DWORD dwLink) PURE; \
     STDMETHOD(SetLinkUpdateOptions)(THIS_ DWORD dwLink,  DWORD dwUpdateOpt) PURE; \
     STDMETHOD(GetLinkUpdateOptions)(THIS_ DWORD dwLink,  DWORD *lpdwUpdateOpt) PURE; \
@@ -672,9 +671,6 @@ ICOM_DEFINE(IOleUILinkContainerA, IUnknown)
     STDMETHOD(OpenLinkSource)(THIS_ DWORD dwLink) PURE; \
     STDMETHOD(UpdateLink)(THIS_ DWORD dwLink, BOOL fErrorMessage, BOOL fReserved) PURE; \
     STDMETHOD(CancelLink)(THIS_ DWORD dwLink) PURE;
-#define IOleUILinkContainerW_IMETHODS \
-    IUnknown_IMETHODS \
-    IOleUILinkContainerW_METHODS
 ICOM_DEFINE(IOleUILinkContainerW, IUnknown)
 #undef INTERFACE
 
@@ -704,19 +700,15 @@ DECL_WINELIB_TYPE_AW(LPOLEUILINKCONTAINER)
  */
 #define INTERFACE   IOleUILinkInfoA
 #define IOleUILinkInfoA_METHODS \
+    IOleUILinkContainerA_METHODS \
     STDMETHOD(GetLastUpdate)(THIS_ DWORD dwLink,  FILETIME *lpLastUpdate) PURE;
-#define IOleUILinkInfoA_IMETHODS \
-    IOleUILinkContainerA_IMETHODS \
-    IOleUILinkInfoA_METHODS
 ICOM_DEFINE(IOleUILinkInfoA, IOleUILinkContainerA)
 #undef INTERFACE
 
 #define INTERFACE   IOleUILinkInfoW
 #define IOleUILinkInfoW_METHODS \
+    IOleUILinkContainerW_METHODS \
     STDMETHOD(GetLastUpdate)(THIS_ DWORD dwLink,  FILETIME *lpLastUpdate) PURE;
-#define IOleUILinkInfoW_IMETHODS \
-    IOleUILinkContainerW_IMETHODS \
-    IOleUILinkInfoW_METHODS
 ICOM_DEFINE(IOleUILinkInfoW, IOleUILinkContainerW)
 #undef  INTERFACE
 
@@ -748,6 +740,7 @@ DECL_WINELIB_TYPE_AW(LPOLEUILINKINFO)
  */
 #define INTERFACE   IOleUIObjInfoA
 #define IOleUIObjInfoA_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetObjectInfo)(THIS_ DWORD dwObject, DWORD *lpdwObjSize, LPSTR *lplpszLabel, \
                 LPSTR *lplpszType, LPSTR *lplpszShortType, LPSTR *lplpszLocation) PURE; \
     STDMETHOD(GetConvertInfo)(THIS_ DWORD dwObject, CLSID *lpClassID, WORD *lpwFormat, \
@@ -756,14 +749,12 @@ DECL_WINELIB_TYPE_AW(LPOLEUILINKINFO)
     STDMETHOD(GetViewInfo)(THIS_ DWORD dwObject, HGLOBAL *phMetaPict, DWORD *pdvAspect, INT *pnCurrentScale) PURE; \
     STDMETHOD(SetViewInfo)(THIS_ DWORD dwObject, HGLOBAL hMetaPict, DWORD dvAspect, \
                 INT nCurrentScale, BOOL bRelativeToOrig) PURE;
-#define IOleUIObjInfoA_IMETHODS \
-    IUnknown_IMETHODS \
-    IOleUIObjInfoA_METHODS
 ICOM_DEFINE(IOleUIObjInfoA, IUnknown)
 #undef INTERFACE
 
 #define INTERFACE   IOleUIObjInfoW
 #define IOleUIObjInfoW_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetObjectInfo)(THIS_ DWORD dwObject, DWORD *lpdwObjSize, LPWSTR *lplpszLabel, \
                 LPWSTR *lplpszType,  LPWSTR *lplpszShortType,  LPWSTR *lplpszLocation) PURE; \
     STDMETHOD(GetConvertInfo)(THIS_ DWORD dwObject, CLSID *lpClassID, WORD *lpwFormat, \
@@ -772,9 +763,6 @@ ICOM_DEFINE(IOleUIObjInfoA, IUnknown)
     STDMETHOD(GetViewInfo)(THIS_ DWORD dwObject, HGLOBAL *phMetaPict, DWORD *pdvAspect, INT *pnCurrentScale) PURE; \
     STDMETHOD(SetViewInfo)(THIS_ DWORD dwObject, HGLOBAL hMetaPict, DWORD dvAspect, \
                 INT nCurrentScale, BOOL bRelativeToOrig) PURE;
-#define IOleUIObjInfoW_IMETHODS \
-    IUnknown_IMETHODS \
-    IOleUIObjInfoW_METHODS
 ICOM_DEFINE(IOleUIObjInfoW, IUnknown)
 #undef INTERFACE
 
diff --git a/include/servprov.h b/include/servprov.h
index 1785e9a192..daeb6e04bf 100644
--- a/include/servprov.h
+++ b/include/servprov.h
@@ -42,10 +42,8 @@ typedef struct IServiceProvider IServiceProvider,*LPSERVICEPROVIDER;
  */
 #define INTERFACE IServiceProvider
 #define IServiceProvider_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(QueryService)(THIS_ REFGUID guidService, REFIID riid, void **ppvObject) PURE;
-#define IServiceProvider_IMETHODS \
-    IUnknown_IMETHODS \
-    IServiceProvider_METHODS
 ICOM_DEFINE(IServiceProvider,IUnknown)
 #undef INTERFACE
 
diff --git a/include/shlobj.h b/include/shlobj.h
index 04e392865a..7be60e74ff 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -124,10 +124,8 @@ typedef GUID SHELLVIEWID;
 
 #define INTERFACE IShellIcon
 #define IShellIcon_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST pidl, UINT flags, LPINT lpIconIndex) PURE;
-#define IShellIcon_IMETHODS \
-    IUnknown_IMETHODS \
-    IShellIcon_METHODS
 ICOM_DEFINE(IShellIcon, IUnknown)
 #undef INTERFACE
 
diff --git a/include/shlwapi.h b/include/shlwapi.h
index 918238fa67..fb0f3f0c0f 100644
--- a/include/shlwapi.h
+++ b/include/shlwapi.h
@@ -245,14 +245,12 @@ typedef struct IQueryAssociations IQueryAssociations,*LPQUERYASSOCIATIONS;
 
 #define INTERFACE IQueryAssociations
 #define IQueryAssociations_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Init)(THIS_ ASSOCF  flags, LPCWSTR  pszAssoc, HKEY  hkProgid, HWND  hwnd) PURE; \
     STDMETHOD(GetString)(THIS_ ASSOCF  flags, ASSOCSTR  str, LPCWSTR  pszExtra, LPWSTR  pszOut, DWORD * pcchOut) PURE; \
     STDMETHOD(GetKey)(THIS_ ASSOCF  flags, ASSOCKEY  key, LPCWSTR  pszExtra, HKEY * phkeyOut) PURE; \
     STDMETHOD(GetData)(THIS_ ASSOCF  flags, ASSOCDATA  data, LPCWSTR  pszExtra, LPVOID  pvOut, DWORD * pcbOut) PURE; \
     STDMETHOD(GetEnum)(THIS_ ASSOCF  flags, ASSOCENUM  assocenum, LPCWSTR  pszExtra, REFIID  riid, LPVOID * ppvOut) PURE;
-#define IQueryAssociations_IMETHODS \
-        IUnknown_IMETHODS \
-        IQueryAssociations_METHODS
 ICOM_DEFINE(IQueryAssociations,IUnknown)
 #undef INTERFACE
 
@@ -843,7 +841,7 @@ VOID WINAPI ColorRGBToHLS(COLORREF,LPWORD,LPWORD,LPWORD);
 
 
 /* Stream functions */
-#if !defined(NO_SHLWAPI_STREAM) && defined(IStream_IMETHODS)
+#if !defined(NO_SHLWAPI_STREAM) && defined(IStream_METHODS)
 
 IStream * WINAPI SHOpenRegStreamA(HKEY,LPCSTR,LPCSTR,DWORD);
 IStream * WINAPI SHOpenRegStreamW(HKEY,LPCWSTR,LPCWSTR,DWORD);
@@ -880,7 +878,7 @@ HRESULT WINAPI SHCreateStreamWrapper(LPBYTE,DWORD,DWORD,IStream**);
 HRESULT WINAPI SHAutoComplete(HWND,DWORD);
 
 /* Threads */
-#if defined(IUnknown_IMETHODS)
+#if defined(IUnknown_METHODS)
 HRESULT WINAPI SHGetThreadRef(IUnknown**);
 HRESULT WINAPI SHSetThreadRef(IUnknown*);
 #endif
@@ -897,7 +895,7 @@ HRESULT WINAPI SHReleaseThreadRef();
 
 BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE,void*,DWORD,LPTHREAD_START_ROUTINE);
 
-#if defined(IBindCtx_IMETHODS)
+#if defined(IBindCtx_METHODS)
 BOOL WINAPI SHSkipJunction(IBindCtx*,const CLSID*);
 #endif
 
diff --git a/include/unknwn.h b/include/unknwn.h
index ff835df7b7..f0b19d49eb 100644
--- a/include/unknwn.h
+++ b/include/unknwn.h
@@ -8,22 +8,17 @@
 extern "C" {
 #endif
 #include "wtypes.h"
-#if defined(__cplusplus) && !defined(CINTERFACE)
- #ifdef ICOM_USE_COM_INTERFACE_ATTRIBUTE
-  #define ICOM_COM_INTERFACE_ATTRIBUTE __attribute__((com_interface))
- #else
-  #define ICOM_COM_INTERFACE_ATTRIBUTE
- #endif
+#if defined(ICOM_USE_COM_INTERFACE_ATTRIBUTE) && defined(__cplusplus) && !defined(CINTERFACE)
+# define ICOM_COM_INTERFACE_ATTRIBUTE __attribute__((com_interface))
 #else
- #ifdef ICOM_MSVTABLE_COMPAT
-  #define ICOM_MSVTABLE_COMPAT_FIELDS \
-    long dummyRTTI1; \
-    long dummyRTTI2;
-  #define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 0,0,
- #else
-  #define ICOM_MSVTABLE_COMPAT_FIELDS
-  #define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
- #endif
+# define ICOM_COM_INTERFACE_ATTRIBUTE
+#endif
+#if defined(ICOM_MSVTABLE_COMPAT) && (!defined(__cplusplus) || defined(CINTERFACE))
+# define ICOM_MSVTABLE_COMPAT_FIELDS long dummyRTTI1,dummyRTTI2;
+# define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 0,0,
+#else
+# define ICOM_MSVTABLE_COMPAT_FIELDS
+# define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
 #endif
 typedef struct IUnknown IUnknown;
 typedef IUnknown *LPUNKNOWN;
@@ -68,12 +63,6 @@ struct IUnknownVtbl {
 
 };
 
-#define IUnknown_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This);
-
 /*** IUnknown methods ***/
 #define IUnknown_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IUnknown_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -81,6 +70,13 @@ struct IUnknownVtbl {
 
 #endif
 
+#define IUnknown_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE;
+
 HRESULT CALLBACK IUnknown_QueryInterface_Proxy(
     IUnknown* This,
     REFIID riid,
@@ -157,15 +153,6 @@ struct IClassFactoryVtbl {
 
 };
 
-#define IClassFactory_IMETHODS \
-    /*** IUnknown methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(INTERFACE *This, REFIID riid, void** ppvObject); \
-    ULONG (STDMETHODCALLTYPE *AddRef)(INTERFACE *This); \
-    ULONG (STDMETHODCALLTYPE *Release)(INTERFACE *This); \
-    /*** IClassFactory methods ***/ \
-    HRESULT (STDMETHODCALLTYPE *CreateInstance)(INTERFACE *This, IUnknown* pUnkOuter, REFIID riid, void** ppvObject); \
-    HRESULT (STDMETHODCALLTYPE *LockServer)(INTERFACE *This, BOOL fLock);
-
 /*** IUnknown methods ***/
 #define IClassFactory_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
 #define IClassFactory_AddRef(p) (p)->lpVtbl->AddRef(p)
@@ -176,6 +163,16 @@ struct IClassFactoryVtbl {
 
 #endif
 
+#define IClassFactory_METHODS \
+    ICOM_MSVTABLE_COMPAT_FIELDS \
+    /*** IUnknown methods ***/ \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
+    STDMETHOD_(ULONG,Release)(THIS) PURE; \
+    /*** IClassFactory methods ***/ \
+    STDMETHOD_(HRESULT,CreateInstance)(THIS_ IUnknown* pUnkOuter, REFIID riid, void** ppvObject) PURE; \
+    STDMETHOD_(HRESULT,LockServer)(THIS_ BOOL fLock) PURE;
+
 HRESULT CALLBACK IClassFactory_RemoteCreateInstance_Proxy(
     IClassFactory* This,
     REFIID riid,
diff --git a/include/unknwn.idl b/include/unknwn.idl
index 92ee79a57f..805532013b 100644
--- a/include/unknwn.idl
+++ b/include/unknwn.idl
@@ -21,22 +21,17 @@ import "wtypes.idl";
 /* COM vtable compatibility macros for g++ */
 /* Included here because the generated header needs them */
 
-cpp_quote("#if defined(__cplusplus) && !defined(CINTERFACE)")
-cpp_quote(" #ifdef ICOM_USE_COM_INTERFACE_ATTRIBUTE")
-cpp_quote("  #define ICOM_COM_INTERFACE_ATTRIBUTE __attribute__((com_interface))")
-cpp_quote(" #else")
-cpp_quote("  #define ICOM_COM_INTERFACE_ATTRIBUTE")
-cpp_quote(" #endif")
+cpp_quote("#if defined(ICOM_USE_COM_INTERFACE_ATTRIBUTE) && defined(__cplusplus) && !defined(CINTERFACE)")
+cpp_quote("# define ICOM_COM_INTERFACE_ATTRIBUTE __attribute__((com_interface))")
 cpp_quote("#else")
-cpp_quote(" #ifdef ICOM_MSVTABLE_COMPAT")
-cpp_quote("  #define ICOM_MSVTABLE_COMPAT_FIELDS \\")
-cpp_quote("    long dummyRTTI1; \\")
-cpp_quote("    long dummyRTTI2;")
-cpp_quote("  #define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 0,0,")
-cpp_quote(" #else")
-cpp_quote("  #define ICOM_MSVTABLE_COMPAT_FIELDS")
-cpp_quote("  #define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE")
-cpp_quote(" #endif")
+cpp_quote("# define ICOM_COM_INTERFACE_ATTRIBUTE")
+cpp_quote("#endif")
+cpp_quote("#if defined(ICOM_MSVTABLE_COMPAT) && (!defined(__cplusplus) || defined(CINTERFACE))")
+cpp_quote("# define ICOM_MSVTABLE_COMPAT_FIELDS long dummyRTTI1,dummyRTTI2;")
+cpp_quote("# define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 0,0,")
+cpp_quote("#else")
+cpp_quote("# define ICOM_MSVTABLE_COMPAT_FIELDS")
+cpp_quote("# define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE")
 cpp_quote("#endif")
 
 /* Interfaces */
diff --git a/include/urlmon.h b/include/urlmon.h
index b5ea48f464..6be63c7a75 100644
--- a/include/urlmon.h
+++ b/include/urlmon.h
@@ -172,15 +172,13 @@ typedef enum BINDSTATUS {
  */
 #define INTERFACE IBinding
 #define IBinding_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Abort)(THIS) PURE; \
     STDMETHOD(Suspend)(THIS) PURE; \
     STDMETHOD(Resume)(THIS) PURE; \
     STDMETHOD(SetPriority)(THIS_ LONG nPriority) PURE; \
     STDMETHOD(GetPriority)(THIS_ LONG *pnPriority) PURE; \
     STDMETHOD(GetBindResult)(THIS_ CLSID *pclsidProtocol, DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved) PURE;
-#define IBinding_IMETHODS \
-    IUnknown_IMETHODS \
-    IBinding_METHODS
 ICOM_DEFINE(IBinding,IUnknown)
 #undef INTERFACE
 
@@ -203,6 +201,7 @@ ICOM_DEFINE(IBinding,IUnknown)
  */
 #define INTERFACE IBindStatusCallback
 #define IBindStatusCallback_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(OnStartBinding)(THIS_ DWORD dwReserved, IBinding *pib) PURE; \
     STDMETHOD(GetPriority)(THIS_ LONG *pnPriority) PURE; \
     STDMETHOD(OnLowResource)(THIS) PURE; \
@@ -211,9 +210,6 @@ ICOM_DEFINE(IBinding,IUnknown)
     STDMETHOD(GetBindInfo)(THIS_ DWORD *grfBINDF, BINDINFO *pbindinfo) PURE; \
     STDMETHOD(OnDataAvailable)(THIS_ DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed) PURE; \
     STDMETHOD(OnObjectAvailable)(THIS_ REFIID iid, IUnknown *punk) PURE;
-#define IBindStatusCallback_IMETHODS \
-    IUnknown_IMETHODS \
-    IBindStatusCallback_METHODS
 ICOM_DEFINE(IBindStatusCallback,IUnknown)
 #undef INTERFACE
 
@@ -238,12 +234,10 @@ ICOM_DEFINE(IBindStatusCallback,IUnknown)
  */
 #define INTERFACE IBindHost
 #define IBindHost_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(CreateMoniker)(THIS_ LPOLESTR szName, IBindCtx *pBC, IMoniker **ppmk, DWORD dwReserved) PURE; \
     STDMETHOD(MonikerBindToStorage)(THIS_ IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC, REFIID riid, LPVOID *ppvObj) PURE; \
     STDMETHOD(MonikerBindToObject)(THIS_ IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC, REFIID riid, LPVOID *ppvObj) PURE;
-#define IBindHost_IMETHODS \
-    IUnknown_IMETHODS \
-    IBindHost_METHODS
 ICOM_DEFINE(IBindHost,IUnknown)
 #undef INTERFACE
 
@@ -281,10 +275,8 @@ typedef enum _tagQUERYOPTION {
  */
 #define INTERFACE IWinInetInfo
 #define IWinInetInfo_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(QueryOption)(THIS_ DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf) PURE;
-#define IWinInetInfo_IMETHODS \
-    IUnknown_IMETHODS \
-    IWinInetInfo_METHODS
 ICOM_DEFINE(IWinInetInfo,IUnknown)
 #undef INTERFACE
 
@@ -302,10 +294,8 @@ ICOM_DEFINE(IWinInetInfo,IUnknown)
  */
 #define INTERFACE IWinInetHttpInfo
 #define IWinInetHttpInfo_METHODS \
+    IWinInetInfo_METHODS \
     STDMETHOD(QueryInfo)(THIS_ DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf, DWORD *pdwFlags, DWORD *pdwReserved) PURE;
-#define IWinInetHttpInfo_IMETHODS \
-    IWinInetInfo_IMETHODS \
-    IWinInetHttpInfo_METHODS
 ICOM_DEFINE(IWinInetHttpInfo,IWinInetInfo)
 #undef INTERFACE
 
diff --git a/include/vfw.h b/include/vfw.h
index 14b1ef8a65..f0f9cf2648 100644
--- a/include/vfw.h
+++ b/include/vfw.h
@@ -988,7 +988,8 @@ DEFINE_AVIGUID(CLSID_AVIFile,           0x00020000, 0, 0);
  * IAVIStream interface
  */
 #define INTERFACE IAVIStream
-#define IAVIStream_METHODS						\
+#define IAVIStream_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Create)(THIS_ LPARAM lParam1, LPARAM lParam2) PURE; \
     STDMETHOD(Info)(THIS_ AVISTREAMINFOW *psi, LONG lSize) PURE; \
     STDMETHOD_(LONG,FindSample)(THIS_ LONG lPos, LONG lFlags) PURE; \
@@ -1000,9 +1001,6 @@ DEFINE_AVIGUID(CLSID_AVIFile,           0x00020000, 0, 0);
     STDMETHOD(ReadData)(THIS_ DWORD fcc, LPVOID lpBuffer, LONG *lpcbBuffer) PURE; \
     STDMETHOD(WriteData)(THIS_ DWORD fcc, LPVOID lpBuffer, LONG cbBuffer) PURE; \
     STDMETHOD(SetInfo)(THIS_ AVISTREAMINFOW *plInfo, LONG cbInfo) PURE;
-#define IAVIStream_IMETHODS	\
-	IUnknown_IMETHODS	\
-	IAVIStream_METHODS
 ICOM_DEFINE(IAVIStream, IUnknown)
 #undef INTERFACE
 
@@ -1090,7 +1088,8 @@ LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pstream, LONG lTime);
  */
 /* In Win32 this interface uses UNICODE only */
 #define INTERFACE IAVIFile
-#define IAVIFile_METHODS 						\
+#define IAVIFile_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Info)(THIS_ AVIFILEINFOW *pfi, LONG lSize) PURE; \
     STDMETHOD(GetStream)(THIS_ PAVISTREAM *ppStream, DWORD fccType, LONG lParam) PURE; \
     STDMETHOD(CreateStream)(THIS_ PAVISTREAM *ppStream, AVISTREAMINFOW *psi) PURE; \
@@ -1098,9 +1097,6 @@ LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pstream, LONG lTime);
     STDMETHOD(ReadData)(THIS_ DWORD fcc, LPVOID lpBuffer, LONG *lpcbBuffer) PURE; \
     STDMETHOD(EndRecord)(THIS) PURE; \
     STDMETHOD(DeleteStream)(THIS_ DWORD fccType, LONG lParam) PURE;
-#define IAVIFile_IMETHODS 	\
-	IUnknown_IMETHODS	\
-	IAVIFile_METHODS
 ICOM_DEFINE(IAVIFile,IUnknown)
 #undef INTERFACE
 
@@ -1143,14 +1139,12 @@ HRESULT WINAPI AVIFileEndRecord(PAVIFILE pfile);
  * IGetFrame interface
  */
 #define INTERFACE IGetFrame
-#define IGetFrame_METHODS					\
+#define IGetFrame_METHODS \
+    IUnknown_METHODS \
     STDMETHOD_(LPVOID,GetFrame)(THIS_ LONG lPos) PURE; \
     STDMETHOD(Begin)(THIS_ LONG lStart, LONG lEnd, LONG lRate) PURE; \
     STDMETHOD(End)(THIS) PURE; \
     STDMETHOD(SetFormat)(THIS_ LPBITMAPINFOHEADER lpbi, LPVOID lpBits, INT x, INT y, INT dx, INT dy) PURE;
-#define IGetFrame_IMETHODS	\
-	IUnknown_IMETHODS	\
-	IGetFrame_METHODS
 ICOM_DEFINE(IGetFrame,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_cache.h b/include/wine/obj_cache.h
index faf396d7fb..d71f866d62 100644
--- a/include/wine/obj_cache.h
+++ b/include/wine/obj_cache.h
@@ -50,14 +50,12 @@ typedef struct IOleCacheControl IOleCacheControl, *LPOLECACHECONTROL;
  */
 #define INTERFACE IOleCache
 #define IOleCache_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Cache)(THIS_ FORMATETC *pformatetc, DWORD advf, DWORD * pdwConnection) PURE; \
 	STDMETHOD(Uncache)(THIS_ DWORD dwConnection) PURE; \
 	STDMETHOD(EnumCache)(THIS_ IEnumSTATDATA **ppenumSTATDATA) PURE; \
 	STDMETHOD(InitCache)(THIS_ IDataObject *pDataObject) PURE; \
 	STDMETHOD(SetData)(THIS_ FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease) PURE;
-#define IOleCache_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleCache_METHODS
 ICOM_DEFINE(IOleCache,IUnknown)
 #undef INTERFACE
 
@@ -80,11 +78,9 @@ ICOM_DEFINE(IOleCache,IUnknown)
  */
 #define INTERFACE IOleCache2
 #define IOleCache2_METHODS \
+	IOleCache_METHODS \
 	STDMETHOD(UpdateCache)(THIS_ LPDATAOBJECT pDataObject, DWORD grfUpdf, LPVOID pReserved) PURE; \
 	STDMETHOD(DiscardCache)(THIS_ DWORD dwDiscardOptions) PURE;
-#define IOleCache2_IMETHODS \
-	IOleCache_IMETHODS \
-	IOleCache2_METHODS
 ICOM_DEFINE(IOleCache2,IOleCache)
 #undef INTERFACE
 
@@ -110,11 +106,9 @@ ICOM_DEFINE(IOleCache2,IOleCache)
  */
 #define INTERFACE IOleCacheControl
 #define IOleCacheControl_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(OnRun)(THIS_ LPDATAOBJECT pDataObject) PURE; \
 	STDMETHOD(OnStop)(THIS) PURE;
-#define IOleCacheControl_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleCacheControl_METHODS
 ICOM_DEFINE(IOleCacheControl,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_comcat.h b/include/wine/obj_comcat.h
index 7bac25c085..9b6c99ca67 100644
--- a/include/wine/obj_comcat.h
+++ b/include/wine/obj_comcat.h
@@ -93,15 +93,13 @@ DEFINE_OLEGUID(CLSID_StdComponentCategoriesMgr, 0x0002E005L, 0, 0);
  */
 #define INTERFACE ICatInformation
 #define ICatInformation_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(EnumCategories)(THIS_ LCID  lcid, IEnumCATEGORYINFO ** ppenumCatInfo) PURE; \
     STDMETHOD(GetCategoryDesc)(THIS_ REFCATID  rcatid, LCID  lcid, PWCHAR * ppszDesc) PURE; \
     STDMETHOD(EnumClassesOfCategories)(THIS_ ULONG  cImplemented, CATID * rgcatidImpl, ULONG  cRequired, CATID * rgcatidReq, IEnumCLSID ** ppenumCLSID) PURE; \
     STDMETHOD(IsClassOfCategories)(THIS_ REFCLSID  rclsid, ULONG  cImplemented, CATID * rgcatidImpl, ULONG  cRequired, CATID * rgcatidReq) PURE; \
     STDMETHOD(EnumImplCategoriesOfClass)(THIS_ REFCLSID  rclsid, IEnumCATID ** ppenumCATID) PURE; \
     STDMETHOD(EnumReqCategoriesOfClass)(THIS_ REFCLSID  rclsid, IEnumCATID ** ppenumCATID) PURE;
-#define ICatInformation_IMETHODS \
-    IUnknown_IMETHODS \
-    ICatInformation_METHODS
 ICOM_DEFINE(ICatInformation,IUnknown)
 #undef INTERFACE
 
@@ -124,15 +122,13 @@ ICOM_DEFINE(ICatInformation,IUnknown)
  */
 #define INTERFACE ICatRegister
 #define ICatRegister_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(RegisterCategories)(THIS_ ULONG  cCategories, CATEGORYINFO * rgCategoryInfo) PURE; \
     STDMETHOD(UnRegisterCategories)(THIS_ ULONG  cCategories, CATID * rgcatid) PURE; \
     STDMETHOD(RegisterClassImplCategories)(THIS_ REFCLSID  rclsid, ULONG  cCategories, CATID * rgcatid) PURE; \
     STDMETHOD(UnRegisterClassImplCategories)(THIS_ REFCLSID  rclsid, ULONG  cCategories, CATID * rgcatid) PURE; \
     STDMETHOD(RegisterClassReqCategories)(THIS_ REFCLSID  rclsid, ULONG  cCategories, CATID * rgcatid) PURE; \
     STDMETHOD(UnRegisterClassReqCategories)(THIS_ REFCLSID  rclsid, ULONG  cCategories, CATID * rgcatid) PURE;
-#define ICatRegister_IMETHODS \
-    IUnknown_IMETHODS \
-    ICatRegister_METHODS
 ICOM_DEFINE(ICatRegister,IUnknown)
 #undef INTERFACE
 
@@ -155,13 +151,11 @@ ICOM_DEFINE(ICatRegister,IUnknown)
  */
 #define INTERFACE IEnumCATEGORYINFO
 #define IEnumCATEGORYINFO_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Next)(THIS_ ULONG  celt, CATEGORYINFO * rgelt, ULONG * pceltFetched) PURE; \
     STDMETHOD(Skip)(THIS_ ULONG  celt) PURE; \
     STDMETHOD(Reset)(THIS) PURE; \
     STDMETHOD(Clone)(THIS_ IEnumCATEGORYINFO ** ppenum) PURE;
-#define IEnumCATEGORYINFO_IMETHODS \
-    IUnknown_IMETHODS \
-    IEnumCATEGORYINFO_METHODS
 ICOM_DEFINE(IEnumCATEGORYINFO,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_commdlgbrowser.h b/include/wine/obj_commdlgbrowser.h
index b981ba92a5..55d9f9be91 100644
--- a/include/wine/obj_commdlgbrowser.h
+++ b/include/wine/obj_commdlgbrowser.h
@@ -36,12 +36,10 @@ typedef struct 	ICommDlgBrowser ICommDlgBrowser, *LPCOMMDLGBROWSER;
 
 #define INTERFACE ICommDlgBrowser
 #define ICommDlgBrowser_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(OnDefaultCommand)(THIS_ IShellView * IShellView) PURE; \
 	STDMETHOD(OnStateChange)(THIS_ IShellView * IShellView, ULONG  uChange) PURE; \
 	STDMETHOD(IncludeObject)(THIS_ IShellView * IShellView, LPCITEMIDLIST  pidl) PURE;
-#define ICommDlgBrowser_IMETHODS \
-	IUnknown_IMETHODS \
-	ICommDlgBrowser_METHODS
 ICOM_DEFINE(ICommDlgBrowser,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_connection.h b/include/wine/obj_connection.h
index 55a9f4c91f..815604f898 100644
--- a/include/wine/obj_connection.h
+++ b/include/wine/obj_connection.h
@@ -57,14 +57,12 @@ typedef struct IEnumConnectionPoints IEnumConnectionPoints, *LPENUMCONNECTIONPOI
  */
 #define INTERFACE IConnectionPoint
 #define IConnectionPoint_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetConnectionInterface)(THIS_ IID *pIID) PURE; \
 	STDMETHOD(GetConnectionPointContainer)(THIS_ IConnectionPointContainer **ppCPC) PURE; \
 	STDMETHOD(Advise)(THIS_ IUnknown *pUnkSink, DWORD *pdwCookie) PURE; \
 	STDMETHOD(Unadvise)(THIS_ DWORD dwCookie) PURE; \
 	STDMETHOD(EnumConnections)(THIS_ IEnumConnections **ppEnum) PURE;
-#define IConnectionPoint_IMETHODS \
-	IUnknown_IMETHODS \
-	IConnectionPoint_METHODS
 ICOM_DEFINE(IConnectionPoint,IUnknown)
 #undef INTERFACE
 
@@ -87,11 +85,9 @@ ICOM_DEFINE(IConnectionPoint,IUnknown)
  */
 #define INTERFACE IConnectionPointContainer
 #define IConnectionPointContainer_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(EnumConnectionPoints)(THIS_ IEnumConnectionPoints **ppEnum) PURE; \
 	STDMETHOD(FindConnectionPoint)(THIS_ REFIID riid, IConnectionPoint **ppCP) PURE;
-#define IConnectionPointContainer_IMETHODS \
-	IUnknown_IMETHODS \
-	IConnectionPointContainer_METHODS
 ICOM_DEFINE(IConnectionPointContainer,IUnknown)
 #undef INTERFACE
 
@@ -111,13 +107,11 @@ ICOM_DEFINE(IConnectionPointContainer,IUnknown)
  */
 #define INTERFACE IEnumConnections
 #define IEnumConnections_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Next)(THIS_ ULONG cConnections, LPCONNECTDATA rgcd, ULONG *pcFectched) PURE; \
 	STDMETHOD(Skip)(THIS_ ULONG cConnections) PURE; \
 	STDMETHOD(Reset)(THIS) PURE; \
 	STDMETHOD(Clone)(THIS_ IEnumConnections **ppEnum) PURE;
-#define IEnumConnections_IMETHODS \
-	IUnknown_IMETHODS \
-	IEnumConnections_METHODS
 ICOM_DEFINE(IEnumConnections,IUnknown)
 #undef INTERFACE
 
@@ -138,13 +132,11 @@ ICOM_DEFINE(IEnumConnections,IUnknown)
  */
 #define INTERFACE IEnumConnectionPoints
 #define IEnumConnectionPoints_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Next)(THIS_ ULONG cConnections, LPCONNECTIONPOINT *ppCP, ULONG *pcFectched) PURE; \
 	STDMETHOD(Skip)(THIS_ ULONG cConnections) PURE; \
 	STDMETHOD(Reset)(THIS) PURE; \
 	STDMETHOD(Clone)(THIS_ IEnumConnections **ppEnum) PURE;
-#define IEnumConnectionPoints_IMETHODS \
-	IUnknown_IMETHODS \
-	IEnumConnectionPoints_METHODS
 ICOM_DEFINE(IEnumConnectionPoints,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_contextmenu.h b/include/wine/obj_contextmenu.h
index 31e70a2fc9..37c2ece121 100644
--- a/include/wine/obj_contextmenu.h
+++ b/include/wine/obj_contextmenu.h
@@ -125,14 +125,12 @@ typedef struct tagCMInvokeCommandInfoEx
 
 #define INTERFACE IContextMenu
 #define IContextMenu_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(QueryContextMenu)(THIS_ HMENU  hmenu, UINT  indexMenu, UINT  idCmdFirst, UINT  idCmdLast, UINT  uFlags) PURE; \
 	STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO  lpici) PURE; \
 	STDMETHOD(GetCommandString)(THIS_ UINT  idCmd, UINT  uType, UINT * pwReserved, LPSTR  pszName, UINT  cchMax) PURE; \
 	STDMETHOD(HandleMenuMsg)(THIS_ UINT  uMsg, WPARAM  wParam, LPARAM  lParam) PURE; \
 	void * guard;   /*possibly another nasty entry from ContextMenu3 ?*/
-#define IContextMenu_IMETHODS \
-	IUnknown_IMETHODS \
-	IContextMenu_METHODS
 ICOM_DEFINE(IContextMenu,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_control.h b/include/wine/obj_control.h
index 2c8602c37e..3f2d203605 100644
--- a/include/wine/obj_control.h
+++ b/include/wine/obj_control.h
@@ -180,13 +180,11 @@ typedef struct IProvideClassInfo2 IProvideClassInfo2, *LPPROVIDECLASSINFO2;
  */
 #define INTERFACE IOleControl
 #define IOleControl_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetControlInfo)(THIS_ CONTROLINFO *pCI) PURE; \
 	STDMETHOD(OnMnemonic)(THIS_ struct tagMSG *pMsg) PURE; \
 	STDMETHOD(OnAmbientPropertyChange)(THIS_ DISPID dispID) PURE; \
 	STDMETHOD(FreezeEvents)(THIS_ BOOL bFreeze) PURE;
-#define IOleControl_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleControl_METHODS
 ICOM_DEFINE(IOleControl,IUnknown)
 #undef INTERFACE
 
@@ -208,6 +206,7 @@ ICOM_DEFINE(IOleControl,IUnknown)
  */
 #define INTERFACE IOleControlSite
 #define IOleControlSite_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(OnControlInfoChanged)(THIS) PURE; \
 	STDMETHOD(LockInPlaceActive)(THIS_ BOOL fLock) PURE; \
 	STDMETHOD(GetExtendedControl)(THIS_ IDispatch **ppDisp) PURE; \
@@ -215,9 +214,6 @@ ICOM_DEFINE(IOleControl,IUnknown)
 	STDMETHOD(TranslateAccelerator)(THIS_ struct tagMSG *pMsg, DWORD grfModifiers) PURE; \
 	STDMETHOD(OnFocus)(THIS_ BOOL fGotFocus) PURE; \
 	STDMETHOD(ShowPropertyFrame)(THIS) PURE;
-#define IOleControlSite_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleControlSite_METHODS
 ICOM_DEFINE(IOleControlSite,IUnknown)
 #undef INTERFACE
 
@@ -242,12 +238,10 @@ ICOM_DEFINE(IOleControlSite,IUnknown)
  */
 #define INTERFACE IOleInPlaceSiteEx
 #define IOleInPlaceSiteEx_METHODS \
+	IOleInPlaceSite_METHODS \
 	STDMETHOD(OnInPlaceActivateEx)(THIS_ BOOL *pfNoRedraw, DWORD dwFlags) PURE; \
 	STDMETHOD(OnInPlaceDeactivateEx)(THIS_ BOOL fNoRedraw) PURE; \
 	STDMETHOD(RequestUIActivate)(THIS) PURE;
-#define IOleInPlaceSiteEx_IMETHODS \
-	IOleInPlaceSite_IMETHODS \
-	IOleInPlaceSiteEx_METHODS
 ICOM_DEFINE(IOleInPlaceSiteEx,IOleInPlaceSite)
 #undef INTERFACE
 
@@ -282,6 +276,7 @@ ICOM_DEFINE(IOleInPlaceSiteEx,IOleInPlaceSite)
  */
 #define INTERFACE IOleInPlaceSiteWindowless
 #define IOleInPlaceSiteWindowless_METHODS \
+	IOleInPlaceSite_METHODS \
 	STDMETHOD(CanWindowlessActivate)(THIS) PURE; \
 	STDMETHOD(GetCapture)(THIS) PURE; \
 	STDMETHOD(SetCapture)(THIS_ BOOL fCapture) PURE; \
@@ -294,9 +289,6 @@ ICOM_DEFINE(IOleInPlaceSiteEx,IOleInPlaceSite)
 	STDMETHOD(ScrollRect)(THIS_ INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip) PURE; \
 	STDMETHOD(AdjustRect)(THIS_ LPRECT prc) PURE; \
 	STDMETHOD(OnDefWindowMessage)(THIS_ UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) PURE;
-#define IOleInPlaceSiteWindowless_IMETHODS \
-	IOleInPlaceSite_IMETHODS \
-	IOleInPlaceSiteWindowless_METHODS
 ICOM_DEFINE(IOleInPlaceSiteWindowless,IOleInPlaceSite)
 #undef INTERFACE
 
@@ -340,11 +332,9 @@ ICOM_DEFINE(IOleInPlaceSiteWindowless,IOleInPlaceSite)
  */
 #define INTERFACE IOleInPlaceObjectWindowless
 #define IOleInPlaceObjectWindowless_METHODS \
+	IOleInPlaceObject_METHODS \
 	STDMETHOD(OnWindowMessage)(THIS_ UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) PURE; \
 	STDMETHOD(GetDropTarget)(THIS_ IDropTarget **ppDropTarget) PURE;
-#define IOleInPlaceObjectWindowless_IMETHODS \
-	IOleInPlaceObject_IMETHODS \
-	IOleInPlaceObjectWindowless_METHODS
 ICOM_DEFINE(IOleInPlaceObjectWindowless,IOleInPlaceObject)
 #undef INTERFACE
 
@@ -372,12 +362,10 @@ ICOM_DEFINE(IOleInPlaceObjectWindowless,IOleInPlaceObject)
  */
 #define INTERFACE IClassFactory2
 #define IClassFactory2_METHODS \
+	IClassFactory_METHODS \
 	STDMETHOD(GetLicInfo)(THIS_ LICINFO *pLicInfo) PURE; \
 	STDMETHOD(RequestLicKey)(THIS_ DWORD dwReserved, BSTR *pBstrKey) PURE; \
 	STDMETHOD(CreateInstanceLic)(THIS_ IUnknown *pUnkOuter, IUnknown *pUnkReserved, REFIID riid, BSTR bstrKey, PVOID *ppvObj) PURE;
-#define IClassFactory2_IMETHODS \
-	IClassFactory_IMETHODS \
-	IClassFactory2_METHODS
 ICOM_DEFINE(IClassFactory2,IClassFactory)
 #undef INTERFACE
 
@@ -401,14 +389,12 @@ ICOM_DEFINE(IClassFactory2,IClassFactory)
  */
 #define INTERFACE IViewObjectEx
 #define IViewObjectEx_METHODS \
+	IViewObject2_METHODS \
 	STDMETHOD(GetRect)(THIS_ DWORD dwAspect, LPRECTL pRect) PURE; \
 	STDMETHOD(GetViewStatus)(THIS_ DWORD *pdwStatus) PURE; \
 	STDMETHOD(QueryHitPoint)(THIS_ DWORD dwAspect, LPCRECT pRectBounds, POINT ptlLoc, LONG lCloseHint, DWORD *pHitResult) PURE; \
 	STDMETHOD(QueryHitRect)(THIS_ DWORD dwAspect, LPCRECT pRectBounds, LPCRECT pRectLoc, LONG lCloseHint, DWORD *pHitResult) PURE; \
 	STDMETHOD(GetNaturalExtent)(THIS_ DWORD dwAspect, LONG lindex, DVTARGETDEVICE *ptd, HDC hicTargetDev, DVEXTENTINFO *pExtentInfo, LPSIZEL pSizel) PURE;
-#define IViewObjectEx_IMETHODS \
-	IViewObject2_IMETHODS \
-	IViewObjectEx_METHODS
 ICOM_DEFINE(IViewObjectEx,IViewObject2)
 #undef INTERFACE
 
@@ -444,10 +430,8 @@ ICOM_DEFINE(IViewObjectEx,IViewObject2)
 
 #define INTERFACE IProvideClassInfo
 #define IProvideClassInfo_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetClassInfo)(THIS_ ITypeInfo **ppTI) PURE;
-#define IProvideClassInfo_IMETHODS \
-	IUnknown_IMETHODS \
-	IProvideClassInfo_METHODS
 ICOM_DEFINE(IProvideClassInfo,IUnknown)
 #undef INTERFACE
 
@@ -467,10 +451,8 @@ ICOM_DEFINE(IProvideClassInfo,IUnknown)
  */
 #define INTERFACE IProvideClassInfo2
 #define IProvideClassInfo2_METHODS \
+	IProvideClassInfo_METHODS \
 	STDMETHOD(GetGUID)(THIS_ DWORD dwGuidKind, GUID *pGUID) PURE;
-#define IProvideClassInfo2_IMETHODS \
-	IProvideClassInfo_IMETHODS \
-	IProvideClassInfo2_METHODS
 ICOM_DEFINE(IProvideClassInfo2,IProvideClassInfo)
 #undef INTERFACE
 
diff --git a/include/wine/obj_dockingwindowframe.h b/include/wine/obj_dockingwindowframe.h
index 6dbb2f3214..873dd791b4 100644
--- a/include/wine/obj_dockingwindowframe.h
+++ b/include/wine/obj_dockingwindowframe.h
@@ -34,12 +34,10 @@ DEFINE_GUID (IID_IDockingWindowFrame,	0x47D2657AL, 0x7B27, 0x11D0, 0x8C, 0xA9, 0
 
 #define INTERFACE IDockingWindowFrame
 #define IDockingWindowFrame_METHODS \
+	IOleWindow_METHODS \
 	STDMETHOD(AddToolbar)(THIS_ IUnknown * punkSrc, LPCWSTR  pwszItem, DWORD  dwAddFlags) PURE; \
 	STDMETHOD(RemoveToolbar)(THIS_ IUnknown * punkSrc, DWORD  dwRemoveFlags) PURE; \
 	STDMETHOD(FindToolbar)(THIS_ LPCWSTR  pwszItem, REFIID  riid, LPVOID * ppvObj) PURE;
-#define IDockingWindowFrame_IMETHODS \
-	IOleWindow_IMETHODS \
-	IDockingWindowFrame_METHODS
 ICOM_DEFINE(IDockingWindowFrame,IOleWindow)
 #undef INTERFACE
 
diff --git a/include/wine/obj_dragdrop.h b/include/wine/obj_dragdrop.h
index bf216ed273..095694bbb3 100644
--- a/include/wine/obj_dragdrop.h
+++ b/include/wine/obj_dragdrop.h
@@ -54,11 +54,9 @@ typedef struct IDropTarget IDropTarget,*LPDROPTARGET;
  */
 #define INTERFACE IDropSource
 #define IDropSource_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(QueryContinueDrag)(THIS_ BOOL  fEscapePressed, DWORD  grfKeyState) PURE; \
     STDMETHOD(GiveFeedback)(THIS_ DWORD  dwEffect) PURE;
-#define IDropSource_IMETHODS \
-	IUnknown_IMETHODS \
-	IDropSource_METHODS
 ICOM_DEFINE(IDropSource,IUnknown)
 #undef INTERFACE
 
@@ -77,13 +75,11 @@ ICOM_DEFINE(IDropSource,IUnknown)
  */
 #define INTERFACE IDropTarget
 #define IDropTarget_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(DragEnter)(THIS_ IDataObject * pDataObject, DWORD  grfKeyState, POINTL  pt, DWORD * pdwEffect) PURE; \
     STDMETHOD(DragOver)(THIS_ DWORD  grfKeyState, POINTL  pt, DWORD * pdwEffect) PURE; \
     STDMETHOD(DragLeave)(THIS) PURE; \
     STDMETHOD(Drop)(THIS_ IDataObject * pDataObject, DWORD  grfKeyState, POINTL  pt, DWORD * pdwEffect) PURE;
-#define IDropTarget_IMETHODS \
-	IUnknown_IMETHODS \
-	IDropTarget_METHODS
 ICOM_DEFINE(IDropTarget,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_dragdrophelper.h b/include/wine/obj_dragdrophelper.h
index 5f74bcbf72..bcd7e14daf 100644
--- a/include/wine/obj_dragdrophelper.h
+++ b/include/wine/obj_dragdrophelper.h
@@ -48,11 +48,9 @@ typedef struct {
 
 #define INTERFACE IDragSourceHelper
 #define IDragSourceHelper_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(InitializeFromBitmap)(THIS_ LPSHDRAGIMAGE  pshdi, IDataObject * pDataObject) PURE; \
     STDMETHOD(InitializeFromWindow)(THIS_ HWND  hwnd, POINT * ppt, IDataObject * pDataObject) PURE;
-#define IDragSourceHelper_IMETHODS \
-	IUnknown_IMETHODS \
-	IDragSourceHelper_METHODS
 ICOM_DEFINE(IDragSourceHelper,IUnknown)
 #undef INTERFACE
 
@@ -72,14 +70,12 @@ ICOM_DEFINE(IDragSourceHelper,IUnknown)
  */
 #define INTERFACE IDropTargetHelper
 #define IDropTargetHelper_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(DragEnter)(THIS_ HWND  hwndTarget, IDataObject * pDataObject, POINT * ppt, DWORD  dwEffect) PURE; \
     STDMETHOD(DragLeave)(THIS) PURE; \
     STDMETHOD(DragOver)(THIS_ POINT * ppt, DWORD  dwEffect) PURE; \
     STDMETHOD(Drop)(THIS_ IDataObject * pDataObject, POINT * ppt,DWORD  dwEffect) PURE; \
     STDMETHOD(Show)(THIS_ BOOL  fShow) PURE;
-#define IDropTargetHelper_IMETHODS \
-	IUnknown_IMETHODS \
-	IDropTargetHelper_METHODS
 ICOM_DEFINE(IDropTargetHelper,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_enumguid.h b/include/wine/obj_enumguid.h
index 62e660519c..779a668d38 100644
--- a/include/wine/obj_enumguid.h
+++ b/include/wine/obj_enumguid.h
@@ -38,13 +38,11 @@ typedef struct IEnumGUID IEnumGUID, *LPENUMGUID;
  */
 #define INTERFACE IEnumGUID
 #define IEnumGUID_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Next)(THIS_ ULONG  celt, GUID * rgelt, ULONG * pceltFetched) PURE; \
     STDMETHOD(Skip)(THIS_ ULONG  celt) PURE; \
     STDMETHOD(Reset)(THIS) PURE; \
     STDMETHOD(Clone)(THIS_ IEnumGUID ** ppenum) PURE;
-#define IEnumGUID_IMETHODS \
-    IUnknown_IMETHODS \
-    IEnumGUID_METHODS
 ICOM_DEFINE(IEnumGUID,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_enumidlist.h b/include/wine/obj_enumidlist.h
index c362669258..578e6509ea 100644
--- a/include/wine/obj_enumidlist.h
+++ b/include/wine/obj_enumidlist.h
@@ -34,13 +34,11 @@ typedef struct IEnumIDList IEnumIDList, *LPENUMIDLIST;
 
 #define INTERFACE IEnumIDList
 #define IEnumIDList_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Next)(THIS_ ULONG  celt, LPITEMIDLIST * rgelt, ULONG * pceltFetched) PURE; \
     STDMETHOD(Skip)(THIS_ ULONG  celt) PURE; \
     STDMETHOD(Reset)(THIS) PURE; \
     STDMETHOD(Clone)(THIS_ IEnumIDList ** ppenum) PURE;
-#define IEnumIDList_IMETHODS \
-    IUnknown_IMETHODS \
-    IEnumIDList_METHODS
 ICOM_DEFINE(IEnumIDList,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_extracticon.h b/include/wine/obj_extracticon.h
index d28de9c119..8b2f6bfc3f 100644
--- a/include/wine/obj_extracticon.h
+++ b/include/wine/obj_extracticon.h
@@ -46,11 +46,9 @@ typedef struct IExtractIconW IExtractIconW,*LPEXTRACTICONW;
 
 #define INTERFACE IExtractIconA
 #define IExtractIconA_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetIconLocation)(THIS_ UINT  uFlags, LPSTR  szIconFile, UINT  cchMax, INT * piIndex, UINT  * pwFlags) PURE; \
 	STDMETHOD(Extract)(THIS_ LPCSTR  pszFile, UINT  nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT  nIconSize) PURE;
-#define IExtractIconA_IMETHODS \
-	IUnknown_IMETHODS \
-	IExtractIconA_METHODS
 ICOM_DEFINE(IExtractIconA,IUnknown)
 #undef INTERFACE
 
@@ -65,11 +63,9 @@ ICOM_DEFINE(IExtractIconA,IUnknown)
 
 #define INTERFACE IExtractIconW
 #define IExtractIconW_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetIconLocation)(THIS_ UINT  uFlags, LPWSTR  szIconFile, UINT  cchMax, INT * piIndex, UINT  * pwFlags) PURE; \
 	STDMETHOD(Extract)(THIS_ LPCWSTR  pszFile, UINT  nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT  nIconSize) PURE;
-#define IExtractIconW_IMETHODS \
-	IUnknown_IMETHODS \
-	IExtractIconW_METHODS
 ICOM_DEFINE(IExtractIconW,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_inplace.h b/include/wine/obj_inplace.h
index cd1420eabe..9a9853d116 100644
--- a/include/wine/obj_inplace.h
+++ b/include/wine/obj_inplace.h
@@ -165,11 +165,9 @@ typedef struct IOleLink IOleLink, *LPOLELINK;
  */
 #define INTERFACE IOleWindow
 #define IOleWindow_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetWindow)(THIS_ HWND *phwnd) PURE; \
 	STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE;
-#define IOleWindow_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleWindow_METHODS
 ICOM_DEFINE(IOleWindow,IUnknown)
 #undef INTERFACE
 
@@ -189,13 +187,11 @@ ICOM_DEFINE(IOleWindow,IUnknown)
  */
 #define INTERFACE IOleInPlaceObject
 #define IOleInPlaceObject_METHODS \
+	IOleWindow_METHODS \
 	STDMETHOD(InPlaceDeactivate)(THIS) PURE; \
 	STDMETHOD(UIDeactivate)(THIS) PURE; \
 	STDMETHOD(SetObjectRects)(THIS_ LPCRECT lprcPosRect, LPCRECT lprcClipRect) PURE; \
 	STDMETHOD(ReactivateAndUndo)(THIS) PURE;
-#define IOleInPlaceObject_IMETHODS \
-	IOleWindow_IMETHODS \
-	IOleInPlaceObject_METHODS
 ICOM_DEFINE(IOleInPlaceObject,IOleWindow)
 #undef INTERFACE
 
@@ -219,14 +215,12 @@ ICOM_DEFINE(IOleInPlaceObject,IOleWindow)
  */
 #define INTERFACE IOleInPlaceActiveObject
 #define IOleInPlaceActiveObject_METHODS \
+	IOleWindow_METHODS \
 	STDMETHOD(TranslateAccelerator)(THIS_ struct tagMSG *lpmsg) PURE; \
 	STDMETHOD(OnFrameWindowActivate)(THIS_ BOOL fActivate) PURE; \
 	STDMETHOD(OnDocWindowActivate)(THIS_ BOOL fActivate) PURE; \
 	STDMETHOD(ResizeBorder)(THIS_ LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fWindowFrame) PURE; \
 	STDMETHOD(EnableModeless)(THIS_ BOOL fEnable) PURE;
-#define IOleInPlaceActiveObject_IMETHODS \
-	IOleWindow_IMETHODS \
-	IOleInPlaceActiveObject_METHODS
 ICOM_DEFINE(IOleInPlaceActiveObject,IOleWindow)
 #undef INTERFACE
 
@@ -251,13 +245,11 @@ ICOM_DEFINE(IOleInPlaceActiveObject,IOleWindow)
  */
 #define INTERFACE IOleInPlaceUIWindow
 #define IOleInPlaceUIWindow_METHODS \
+	IOleWindow_METHODS \
 	STDMETHOD(GetBorder)(THIS_ LPRECT lprectBorder) PURE; \
 	STDMETHOD(RequestBorderSpace)(THIS_ LPCBORDERWIDTHS pborderwidths) PURE; \
 	STDMETHOD(SetBorderSpace)(THIS_ LPCBORDERWIDTHS pborderwidths) PURE; \
 	STDMETHOD(SetActiveObject)(THIS_ IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName) PURE;
-#define IOleInPlaceUIWindow_IMETHODS \
-	IOleWindow_IMETHODS \
-	IOleInPlaceUIWindow_METHODS
 ICOM_DEFINE(IOleInPlaceUIWindow,IOleWindow)
 #undef INTERFACE
 
@@ -282,15 +274,13 @@ ICOM_DEFINE(IOleInPlaceUIWindow,IOleWindow)
  */
 #define INTERFACE IOleInPlaceFrame
 #define IOleInPlaceFrame_METHODS \
+	IOleInPlaceUIWindow_METHODS \
 	STDMETHOD(InsertMenus)(THIS_ HMENU hemnuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) PURE; \
 	STDMETHOD(SetMenu)(THIS_ HMENU hemnuShared, HOLEMENU holemenu, HWND hwndActiveObject) PURE; \
 	STDMETHOD(RemoveMenus)(THIS_ HMENU hemnuShared) PURE; \
 	STDMETHOD(SetStatusText)(THIS_ LPCOLESTR pszStatusText) PURE; \
 	STDMETHOD(EnableModeless)(THIS_ BOOL fEnable) PURE; \
 	STDMETHOD(TranslateAccelerator)(THIS_ struct tagMSG *lpmsg, WORD wID) PURE;
-#define IOleInPlaceFrame_IMETHODS \
-	IOleInPlaceUIWindow_IMETHODS \
-	IOleInPlaceFrame_METHODS
 ICOM_DEFINE(IOleInPlaceFrame,IOleInPlaceUIWindow)
 #undef INTERFACE
 
@@ -322,6 +312,7 @@ ICOM_DEFINE(IOleInPlaceFrame,IOleInPlaceUIWindow)
  */
 #define INTERFACE IOleInPlaceSite
 #define IOleInPlaceSite_METHODS \
+	IOleWindow_METHODS \
 	STDMETHOD(CanInPlaceActivate)(THIS) PURE; \
 	STDMETHOD(OnInPlaceActivate)(THIS) PURE; \
 	STDMETHOD(OnUIActivate)(THIS) PURE; \
@@ -332,9 +323,6 @@ ICOM_DEFINE(IOleInPlaceFrame,IOleInPlaceUIWindow)
 	STDMETHOD(DiscardUndoState)(THIS) PURE; \
 	STDMETHOD(DeactivateAndUndo)(THIS) PURE; \
 	STDMETHOD(OnPosRectChange)(THIS_ LPCRECT lprcPosRect) PURE;
-#define IOleInPlaceSite_IMETHODS \
-	IOleWindow_IMETHODS \
-	IOleInPlaceSite_METHODS
 ICOM_DEFINE(IOleInPlaceSite,IOleWindow)
 #undef INTERFACE
 
@@ -365,15 +353,13 @@ ICOM_DEFINE(IOleInPlaceSite,IOleWindow)
  */
 #define INTERFACE IOleClientSite
 #define IOleClientSite_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(SaveObject)(THIS) PURE; \
 	STDMETHOD(GetMoniker)(THIS_ DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk) PURE; \
 	STDMETHOD(GetContainer)(THIS_ IOleContainer **ppContainer) PURE; \
 	STDMETHOD(ShowObject)(THIS) PURE; \
 	STDMETHOD(OnShowWindow)(THIS_ BOOL fShow) PURE; \
 	STDMETHOD(RequestNewObjectLayout)(THIS) PURE;
-#define IOleClientSite_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleClientSite_METHODS
 ICOM_DEFINE(IOleClientSite,IUnknown)
 #undef INTERFACE
 
@@ -397,10 +383,8 @@ ICOM_DEFINE(IOleClientSite,IUnknown)
  */
 #define INTERFACE IParseDisplayName
 #define IParseDisplayName_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(ParseDisplayName)(THIS_ IBindCtx *pbc, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut) PURE;
-#define IParseDisplayName_IMETHODS \
-	IUnknown_IMETHODS \
-	IParseDisplayName_METHODS
 ICOM_DEFINE(IParseDisplayName,IUnknown)
 #undef INTERFACE
 
@@ -419,11 +403,9 @@ ICOM_DEFINE(IParseDisplayName,IUnknown)
  */
 #define INTERFACE IOleContainer
 #define IOleContainer_METHODS \
+	IParseDisplayName_METHODS \
 	STDMETHOD(EnumObjects)(THIS_ DWORD grfFlags, IEnumUnknown **ppenum) PURE; \
 	STDMETHOD(LockContainer)(THIS_ BOOL fLock) PURE;
-#define IOleContainer_IMETHODS \
-	IParseDisplayName_IMETHODS \
-	IOleContainer_METHODS
 ICOM_DEFINE(IOleContainer,IParseDisplayName)
 #undef INTERFACE
 
@@ -449,12 +431,10 @@ ICOM_DEFINE(IOleContainer,IParseDisplayName)
 
 #define INTERFACE IOleItemContainer
 #define IOleItemContainer_METHODS \
+	IOleContainer_METHODS \
 	STDMETHOD(GetObject)(THIS_ LPOLESTR pszItem, DWORD dwSpeedNeeded, IBindCtx *pbc, REFIID riid, void **ppvObject) PURE; \
 	STDMETHOD(GetObjectStorage)(THIS_ LPOLESTR pszItem, IBindCtx *pbc, REFIID riid, void **ppvStorage) PURE; \
 	STDMETHOD(IsRunning)(THIS_ LPOLESTR pszItem) PURE;
-#define IOleItemContainer_IMETHODS \
-	IOleContainer_IMETHODS \
-	IOleItemContainer_METHODS
 ICOM_DEFINE(IOleItemContainer,IOleContainer)
 #undef INTERFACE
 
@@ -475,6 +455,7 @@ ICOM_DEFINE(IOleItemContainer,IOleContainer)
  */
 #define INTERFACE IOleLink
 #define IOleLink_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(SetUpdateOptions)(THIS_ DWORD dwUpdateOpt) PURE; \
 	STDMETHOD(GetUpdateOptions)(THIS_ DWORD *pdwUpdateOpt) PURE; \
 	STDMETHOD(SetSourceMoniker)(THIS_ IMoniker *pmk, REFCLSID rclsid) PURE; \
@@ -486,9 +467,6 @@ ICOM_DEFINE(IOleItemContainer,IOleContainer)
 	STDMETHOD(GetBoundSource)(THIS_ IUnknown **ppunk) PURE; \
 	STDMETHOD(UnBindSource)(THIS) PURE; \
 	STDMETHOD(Update)(THIS_ IBindCtx *pbc) PURE;
-#define IOleLink_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleLink_METHODS
 ICOM_DEFINE(IOleLink,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_olefont.h b/include/wine/obj_olefont.h
index 836fe23a9a..e4d55c5c59 100644
--- a/include/wine/obj_olefont.h
+++ b/include/wine/obj_olefont.h
@@ -43,6 +43,7 @@ typedef TEXTMETRICW TEXTMETRICOLE;
  */
 #define INTERFACE IFont
 #define IFont_METHODS \
+  IUnknown_METHODS \
   STDMETHOD(get_Name)(THIS_ BSTR * pname) PURE; \
   STDMETHOD(put_Name)(THIS_ BSTR  name) PURE; \
   STDMETHOD(get_Size)(THIS_ CY * psize) PURE; \
@@ -67,9 +68,6 @@ typedef TEXTMETRICW TEXTMETRICOLE;
   STDMETHOD(AddRefHfont)(THIS_ HFONT  hfont) PURE; \
   STDMETHOD(ReleaseHfont)(THIS_ HFONT  hfont) PURE; \
   STDMETHOD(SetHdc)(THIS_ HDC  hdc) PURE;
-#define IFont_IMETHODS \
-	IUnknown_IMETHODS \
-	IFont_METHODS
 ICOM_DEFINE(IFont,IUnknown)
 #undef INTERFACE
 
@@ -110,10 +108,8 @@ ICOM_DEFINE(IFont,IUnknown)
  * IFont interface
  */
 #define INTERFACE IFontDisp
-#define IFontDisp_METHODS
-#define IFontDisp_IMETHODS \
-  IUnknown_IMETHODS \
-	IFontDisp_METHODS
+#define IFontDisp_METHODS \
+  IDispatch_METHODS
 ICOM_DEFINE(IFontDisp,IDispatch)
 #undef INTERFACE
 
diff --git a/include/wine/obj_oleobj.h b/include/wine/obj_oleobj.h
index 14b0648cb6..2a8f50bd88 100644
--- a/include/wine/obj_oleobj.h
+++ b/include/wine/obj_oleobj.h
@@ -94,6 +94,7 @@ typedef struct IEnumOLEVERB IEnumOLEVERB, *LPENUMOLEVERB;
  */
 #define INTERFACE IOleObject
 #define IOleObject_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(SetClientSite)(THIS_ IOleClientSite *pClientSite) PURE; \
 	STDMETHOD(GetClientSite)(THIS_ IOleClientSite **ppClientSite) PURE; \
 	STDMETHOD(SetHostNames)(THIS_ LPCOLESTR szContainerApp, LPCOLESTR szContainerObj) PURE; \
@@ -115,9 +116,6 @@ typedef struct IEnumOLEVERB IEnumOLEVERB, *LPENUMOLEVERB;
 	STDMETHOD(EnumAdvise)(THIS_ IEnumSTATDATA **ppenumAdvise) PURE; \
 	STDMETHOD(GetMiscStatus)(THIS_ DWORD dwAspect, DWORD *pdwStatus) PURE; \
 	STDMETHOD(SetColorScheme)(THIS_ struct tagLOGPALETTE *pLogpal) PURE;
-#define IOleObject_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleObject_METHODS
 ICOM_DEFINE(IOleObject,IUnknown)
 #undef INTERFACE
 
@@ -156,15 +154,13 @@ ICOM_DEFINE(IOleObject,IUnknown)
  */
 #define INTERFACE IOleAdviseHolder
 #define IOleAdviseHolder_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Advise)(THIS_ IAdviseSink *pAdvise, DWORD *pdwConnection) PURE; \
 	STDMETHOD(Unadvise)(THIS_ DWORD dwConnection) PURE; \
 	STDMETHOD(EnumAdvise)(THIS_ IEnumSTATDATA **ppenumAdvise) PURE; \
 	STDMETHOD(SendOnRename)(THIS_ IMoniker *pmk) PURE; \
 	STDMETHOD(SendOnSave)(THIS) PURE; \
 	STDMETHOD(SendOnClose)(THIS) PURE;
-#define IOleAdviseHolder_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleAdviseHolder_METHODS
 ICOM_DEFINE(IOleAdviseHolder,IUnknown)
 #undef INTERFACE
 
@@ -188,13 +184,11 @@ ICOM_DEFINE(IOleAdviseHolder,IUnknown)
  */
 #define INTERFACE IEnumOLEVERB
 #define IEnumOLEVERB_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Next)(THIS_ ULONG celt, LPOLEVERB rgelt, ULONG *pceltFetched) PURE; \
 	STDMETHOD(Skip)(THIS_ ULONG celt) PURE; \
 	STDMETHOD(Reset)(THIS) PURE; \
 	STDMETHOD(Clone)(THIS_ IEnumOLEVERB **ppenum) PURE;
-#define IEnumOLEVERB_IMETHODS \
-	IUnknown_IMETHODS \
-	IEnumOLEVERB_METHODS
 ICOM_DEFINE(IEnumOLEVERB,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_oleundo.h b/include/wine/obj_oleundo.h
index 4612e5cd87..de47426038 100644
--- a/include/wine/obj_oleundo.h
+++ b/include/wine/obj_oleundo.h
@@ -101,12 +101,10 @@ typedef struct tagQACONTAINER
  */
 #define INTERFACE IQuickActivate
 #define IQuickActivate_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(QuickActivate)(THIS_ QACONTAINER *pQaContainer, QACONTROL *pQaControl) PURE; \
 	STDMETHOD(SetContentExtent)(THIS_ LPSIZEL pSizel) PURE; \
 	STDMETHOD(GetContentExtent)(THIS_ LPSIZEL pSizel) PURE;
-#define IQuickActivate_IMETHODS \
-	IUnknown_IMETHODS \
-	IQuickActivate_METHODS
 ICOM_DEFINE(IQuickActivate,IUnknown)
 #undef INTERFACE
 
@@ -127,12 +125,10 @@ ICOM_DEFINE(IQuickActivate,IUnknown)
  */
 #define INTERFACE IPointerInactive
 #define IPointerInactive_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetActivationPolicy)(THIS_ DWORD *pdwPolicy) PURE; \
 	STDMETHOD(OnInactiveMouseMove)(THIS_ LPCRECT pRectBounds, LONG x, LONG y, DWORD grfKeyState) PURE; \
 	STDMETHOD(OnInactiveSetCursor)(THIS_ LPCRECT pRectBounds, LONG x, LONG y, DWORD dwMouseMsg, BOOL fSetAlways) PURE;
-#define IPointerInactive_IMETHODS \
-	IUnknown_IMETHODS \
-	IPointerInactive_METHODS
 ICOM_DEFINE(IPointerInactive,IUnknown)
 #undef INTERFACE
 
@@ -153,10 +149,8 @@ ICOM_DEFINE(IPointerInactive,IUnknown)
  */
 #define INTERFACE IAdviseSinkEx
 #define IAdviseSinkEx_METHODS \
+	IAdviseSink_METHODS \
 	STDMETHOD(OnViewStatusChange)(THIS_ DWORD dwViewStatus) PURE;
-#define IAdviseSinkEx_IMETHODS \
-	IAdviseSink_IMETHODS \
-	IAdviseSinkEx_METHODS
 ICOM_DEFINE(IAdviseSinkEx,IAdviseSink)
 #undef INTERFACE
 
@@ -181,6 +175,7 @@ ICOM_DEFINE(IAdviseSinkEx,IAdviseSink)
  */
 #define INTERFACE IOleUndoManager
 #define IOleUndoManager_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Open)(THIS_ IOleParentUndoUnit *pPUU) PURE; \
 	STDMETHOD(Close)(THIS_ IOleParentUndoUnit *pPUU, BOOL fCommit) PURE; \
 	STDMETHOD(Add)(THIS_ IOleUndoUnit *pUU) PURE; \
@@ -193,9 +188,6 @@ ICOM_DEFINE(IAdviseSinkEx,IAdviseSink)
 	STDMETHOD(GetLastUndoDescription)(THIS_ BSTR *pBstr) PURE; \
 	STDMETHOD(GetLastRedoDescription)(THIS_ BSTR *pBstr) PURE; \
 	STDMETHOD(Enable)(THIS_ BOOL fEnable) PURE;
-#define IOleUndoManager_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleUndoManager_METHODS
 ICOM_DEFINE(IOleUndoManager,IUnknown)
 #undef INTERFACE
 
@@ -225,13 +217,11 @@ ICOM_DEFINE(IOleUndoManager,IUnknown)
  */
 #define INTERFACE IOleUndoUnit
 #define IOleUndoUnit_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Do)(THIS_ IOleUndoManager *pUndoManager) PURE; \
 	STDMETHOD(GetDescription)(THIS_ BSTR *pBstr) PURE; \
 	STDMETHOD(GetUnitType)(THIS_ CLSID *pClsid, LONG *plID) PURE; \
 	STDMETHOD(OnNextAdd)(THIS) PURE;
-#define IOleUndoUnit_IMETHODS \
-	IUnknown_IMETHODS \
-	IOleUndoUnit_METHODS
 ICOM_DEFINE(IOleUndoUnit,IUnknown)
 #undef INTERFACE
 
@@ -254,14 +244,12 @@ ICOM_DEFINE(IOleUndoUnit,IUnknown)
  */
 #define INTERFACE IOleParentUndoUnit
 #define IOleParentUndoUnit_METHODS \
+	IOleUndoUnit_METHODS \
 	STDMETHOD(Open)(THIS_ IOleParentUndoUnit *pPUU) PURE; \
 	STDMETHOD(Close)(THIS_ IOleParentUndoUnit *pPUU, BOOL fCommit) PURE; \
 	STDMETHOD(Add)(THIS_ IOleUndoUnit *pUU) PURE; \
 	STDMETHOD(FindUnit)(THIS_ IOleUndoUnit *pUU) PURE; \
 	STDMETHOD(GetParentState)(THIS_ DWORD *pdwState) PURE;
-#define IOleParentUndoUnit_IMETHODS \
-	IOleUndoUnit_IMETHODS \
-	IOleParentUndoUnit_METHODS
 ICOM_DEFINE(IOleParentUndoUnit,IOleUndoUnit)
 #undef INTERFACE
 
@@ -289,13 +277,11 @@ ICOM_DEFINE(IOleParentUndoUnit,IOleUndoUnit)
  */
 #define INTERFACE IEnumOleUndoUnits
 #define IEnumOleUndoUnits_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Next)(THIS_ ULONG cElt, IOleUndoUnit **rgElt, ULONG *pcEltFetched) PURE; \
 	STDMETHOD(Skip)(THIS_ ULONG cElt) PURE; \
 	STDMETHOD(Reset)(THIS) PURE; \
 	STDMETHOD(Clone)(THIS_ IEnumOleUndoUnits **ppEnum) PURE;
-#define IEnumOleUndoUnits_IMETHODS \
-	IUnknown_IMETHODS \
-	IEnumOleUndoUnits_METHODS
 ICOM_DEFINE(IEnumOleUndoUnits,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_oleview.h b/include/wine/obj_oleview.h
index affe82dcaa..2b3474e517 100644
--- a/include/wine/obj_oleview.h
+++ b/include/wine/obj_oleview.h
@@ -49,15 +49,13 @@ typedef BOOL    (CALLBACK *IVO_ContCallback)(DWORD);
 
 #define INTERFACE IViewObject
 #define IViewObject_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Draw)(THIS_ DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, IVO_ContCallback  pfnContinue, DWORD dwContinue) PURE; \
 	STDMETHOD(GetColorSet)(THIS_ DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDevice, struct tagLOGPALETTE **ppColorSet) PURE; \
 	STDMETHOD(Freeze)(THIS_ DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze) PURE; \
 	STDMETHOD(Unfreeze)(THIS_ DWORD dwFreeze) PURE; \
 	STDMETHOD(SetAdvise)(THIS_ DWORD aspects, DWORD advf, IAdviseSink *pAdvSink) PURE; \
 	STDMETHOD(GetAdvise)(THIS_ DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink) PURE;
-#define IViewObject_IMETHODS \
-	IUnknown_IMETHODS \
-	IViewObject_METHODS
 ICOM_DEFINE(IViewObject,IUnknown)
 #undef INTERFACE
 
@@ -82,10 +80,8 @@ ICOM_DEFINE(IViewObject,IUnknown)
  */
 #define INTERFACE IViewObject2
 #define IViewObject2_METHODS \
+	IViewObject_METHODS \
 	STDMETHOD(GetExtent)(THIS_ DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL lpsizel) PURE;
-#define IViewObject2_IMETHODS \
-	IViewObject_IMETHODS \
-	IViewObject2_METHODS
 ICOM_DEFINE(IViewObject2,IViewObject)
 #undef INTERFACE
 
diff --git a/include/wine/obj_picture.h b/include/wine/obj_picture.h
index d37da7a6e7..8f8e505018 100644
--- a/include/wine/obj_picture.h
+++ b/include/wine/obj_picture.h
@@ -55,6 +55,7 @@ typedef struct IPictureDisp IPictureDisp, *LPPICTUREDISP;
  */
 #define INTERFACE IPicture
 #define IPicture_METHODS \
+  IUnknown_METHODS \
   STDMETHOD(get_Handle)(THIS_ OLE_HANDLE *pHandle) PURE; \
   STDMETHOD(get_hPal)(THIS_ OLE_HANDLE *phPal) PURE; \
   STDMETHOD(get_Type)(THIS_ SHORT *pType) PURE; \
@@ -69,9 +70,6 @@ typedef struct IPictureDisp IPictureDisp, *LPPICTUREDISP;
   STDMETHOD(PictureChanged)(THIS) PURE; \
   STDMETHOD(SaveAsFile)(THIS_ LPSTREAM pStream, BOOL fSaveMemCopy, LONG *pCbSize) PURE; \
   STDMETHOD(get_Attributes)(THIS_ DWORD *pDwAttr) PURE;
-#define IPicture_IMETHODS \
-	IUnknown_IMETHODS \
-	IPicture_METHODS
 ICOM_DEFINE(IPicture,IUnknown)
 #undef INTERFACE
 
@@ -102,10 +100,8 @@ ICOM_DEFINE(IPicture,IUnknown)
  * IPictureDisp interface
  */
 #define INTERFACE IPictureDisp
-#define IPictureDisp_METHODS
-#define IPictureDisp_IMETHODS \
-				IDispatch_IMETHODS \
-				IPictureDisp_METHODS
+#define IPictureDisp_METHODS \
+     IDispatch_METHODS
 ICOM_DEFINE(IPictureDisp,IDispatch)
 #undef INTERFACE
 
diff --git a/include/wine/obj_property.h b/include/wine/obj_property.h
index 28c4cb2f59..8d2de3a62e 100644
--- a/include/wine/obj_property.h
+++ b/include/wine/obj_property.h
@@ -138,6 +138,7 @@ typedef struct IPerPropertyBrowsing IPerPropertyBrowsing,*LPPERPROPERTYBROWSING;
  */
 #define INTERFACE IPropertyPage
 #define IPropertyPage_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(SetPageSite)(THIS_ IPropertyPageSite *pPageSite) PURE; \
 	STDMETHOD(Activate)(THIS_ HWND hWndParent, LPCRECT pRect, BOOL bModal) PURE; \
 	STDMETHOD(Deactivate)(THIS) PURE; \
@@ -149,9 +150,6 @@ typedef struct IPerPropertyBrowsing IPerPropertyBrowsing,*LPPERPROPERTYBROWSING;
 	STDMETHOD(Apply)(THIS) PURE; \
 	STDMETHOD(Help)(THIS_ LPCOLESTR pszHelpDir) PURE; \
 	STDMETHOD(TranslateAccelerator)(THIS_ MSG *pMsg) PURE;
-#define IPropertyPage_IMETHODS \
-	IUnknown_IMETHODS \
-	IPropertyPage_METHODS
 ICOM_DEFINE(IPropertyPage,IUnknown)
 #undef INTERFACE
 
@@ -180,10 +178,8 @@ ICOM_DEFINE(IPropertyPage,IUnknown)
  */
 #define INTERFACE IPropertyPage2
 #define IPropertyPage2_METHODS \
+	IPropertyPage_METHODS \
 	STDMETHOD(EditProperty)(THIS_ DISPID dispID) PURE;
-#define IPropertyPage2_IMETHODS \
-	IPropertyPage_IMETHODS \
-	IPropertyPage2_METHODS
 ICOM_DEFINE(IPropertyPage2,IPropertyPage)
 #undef INTERFACE
 
@@ -214,13 +210,11 @@ ICOM_DEFINE(IPropertyPage2,IPropertyPage)
  */
 #define INTERFACE IPropertyPageSite
 #define IPropertyPageSite_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(OnStatusChange)(THIS_ DWORD dwFlags) PURE; \
 	STDMETHOD(GetLocaleID)(THIS_ LCID *pLocaleID) PURE; \
 	STDMETHOD(GetPageContainer)(THIS_ IUnknown **ppUnk) PURE; \
 	STDMETHOD(TranslateAccelerator)(THIS_ MSG *pMsg) PURE;
-#define IPropertyPageSite_IMETHODS \
-	IUnknown_IMETHODS \
-	IPropertyPageSite_METHODS
 ICOM_DEFINE(IPropertyPageSite,IUnknown)
 #undef INTERFACE
 
@@ -242,11 +236,9 @@ ICOM_DEFINE(IPropertyPageSite,IUnknown)
  */
 #define INTERFACE IPropertyNotifySink
 #define IPropertyNotifySink_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(OnChanged)(THIS_ DISPID dispID) PURE; \
 	STDMETHOD(OnRequestEdit)(THIS_ DISPID dispID) PURE;
-#define IPropertyNotifySink_IMETHODS \
-	IUnknown_IMETHODS \
-	IPropertyNotifySink_METHODS
 ICOM_DEFINE(IPropertyNotifySink,IUnknown)
 #undef INTERFACE
 
@@ -266,11 +258,9 @@ ICOM_DEFINE(IPropertyNotifySink,IUnknown)
  */
 #define INTERFACE ISimpleFrameSite
 #define ISimpleFrameSite_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(PreMessageFilter)(THIS_ HWND hWnd, UINT msg, WPARAM wp, LPARAM lp, LRESULT *plResult, DWORD *pwdCookie) PURE; \
 	STDMETHOD(PostMessageFilter)(THIS_ HWND hWnd, UINT msg, WPARAM wp, LPARAM lp, LRESULT *plResult, DWORD pwdCookie) PURE;
-#define ISimpleFrameSite_IMETHODS \
-	IUnknown_IMETHODS \
-	ISimpleFrameSite_METHODS
 ICOM_DEFINE(ISimpleFrameSite,IUnknown)
 #undef INTERFACE
 
@@ -290,14 +280,12 @@ ICOM_DEFINE(ISimpleFrameSite,IUnknown)
  */
 #define INTERFACE IPersistStreamInit
 #define IPersistStreamInit_METHODS \
+	IPersist_METHODS \
 	STDMETHOD(IsDirty)(THIS) PURE; \
 	STDMETHOD(Load)(THIS_ LPSTREAM pStm) PURE; \
 	STDMETHOD(Save)(THIS_ LPSTREAM pStm, BOOL fClearDirty) PURE; \
 	STDMETHOD(GetSizeMax)(THIS_ ULARGE_INTEGER *pcbSize) PURE; \
 	STDMETHOD(InitNew)(THIS) PURE;
-#define IPersistStreamInit_IMETHODS \
-	IPersist_IMETHODS \
-	IPersistStreamInit_METHODS
 ICOM_DEFINE(IPersistStreamInit,IPersist)
 #undef INTERFACE
 
@@ -322,14 +310,12 @@ ICOM_DEFINE(IPersistStreamInit,IPersist)
  */
 #define INTERFACE IPersistMemory
 #define IPersistMemory_METHODS \
+	IPersist_METHODS \
 	STDMETHOD(IsDirty)(THIS) PURE; \
 	STDMETHOD(Load)(THIS_ LPVOID pMem, ULONG cbSize) PURE; \
 	STDMETHOD(Save)(THIS_ LPVOID pMem, BOOL fClearDirty, ULONG cbSize) PURE; \
 	STDMETHOD(GetSizeMax)(THIS_ ULONG *pCbSize) PURE; \
 	STDMETHOD(InitNew)(THIS) PURE;
-#define IPersistMemory_IMETHODS \
-	IPersist_IMETHODS \
-	IPersistMemory_METHODS
 ICOM_DEFINE(IPersistMemory,IPersist)
 #undef INTERFACE
 
@@ -354,12 +340,10 @@ ICOM_DEFINE(IPersistMemory,IPersist)
  */
 #define INTERFACE IPersistPropertyBag
 #define IPersistPropertyBag_METHODS \
+	IPersist_METHODS \
 	STDMETHOD(InitNew)(THIS) PURE; \
 	STDMETHOD(Load)(THIS_ IPropertyBag *pPropBag, IErrorLog *pErrorLog) PURE; \
 	STDMETHOD(Save)(THIS_ IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties) PURE;
-#define IPersistPropertyBag_IMETHODS \
-	IPersist_IMETHODS \
-	IPersistPropertyBag_METHODS
 ICOM_DEFINE(IPersistPropertyBag,IPersist)
 #undef INTERFACE
 
@@ -382,13 +366,11 @@ ICOM_DEFINE(IPersistPropertyBag,IPersist)
  */
 #define INTERFACE IPersistPropertyBag2
 #define IPersistPropertyBag2_METHODS \
+	IPersist_METHODS \
 	STDMETHOD(InitNew)(THIS) PURE; \
 	STDMETHOD(Load)(THIS_ IPropertyBag2 *pPropBag, IErrorLog *pErrorLog) PURE; \
 	STDMETHOD(Save)(THIS_ IPropertyBag2 *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties) PURE; \
-    STDMETHOD(IsDirty)(THIS) PURE;
-#define IPersistPropertyBag2_IMETHODS \
-	IPersist_IMETHODS \
-	IPersistPropertyBag2_METHODS
+	STDMETHOD(IsDirty)(THIS) PURE;
 ICOM_DEFINE(IPersistPropertyBag2,IPersist)
 #undef INTERFACE
 
@@ -412,10 +394,8 @@ ICOM_DEFINE(IPersistPropertyBag2,IPersist)
  */
 #define INTERFACE IErrorLog
 #define IErrorLog_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(AddError)(THIS_ LPCOLESTR pszPropName, EXCEPINFO *pExcepInfo) PURE;
-#define IErrorLog_IMETHODS \
-	IUnknown_IMETHODS \
-	IErrorLog_METHODS
 ICOM_DEFINE(IErrorLog,IUnknown)
 #undef INTERFACE
 
@@ -434,11 +414,9 @@ ICOM_DEFINE(IErrorLog,IUnknown)
  */
 #define INTERFACE IPropertyBag
 #define IPropertyBag_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Read)(THIS_ LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog) PURE; \
 	STDMETHOD(Write)(THIS_ LPCOLESTR pszPropName, VARIANT *pVar) PURE;
-#define IPropertyBag_IMETHODS \
-	IUnknown_IMETHODS \
-	IPropertyBag_METHODS
 ICOM_DEFINE(IPropertyBag,IUnknown)
 #undef INTERFACE
 
@@ -458,14 +436,12 @@ ICOM_DEFINE(IPropertyBag,IUnknown)
  */
 #define INTERFACE IPropertyBag2
 #define IPropertyBag2_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Read)(THIS_ ULONG cProperties, PROPBAG2 *pPropBag, IErrorLog *pErrLog, VARIANT *pvarValue, HRESULT *phrError) PURE; \
     STDMETHOD(Write)(THIS_ ULONG cProperties, PROPBAG2 *pPropBag, VARIANT *pvarValue) PURE; \
     STDMETHOD(CountProperties)(THIS_ ULONG *pcProperties) PURE; \
     STDMETHOD(GetPropertyInfo)(THIS_ ULONG iProperty, ULONG cProperties, PROPBAG2 *pPropBag, ULONG *pcProperties) PURE; \
     STDMETHOD(LoadObject)(THIS_ LPCOLESTR pstrName, DWORD dwHint, IUnknown *pUnkObject, IErrorLog *pErrLog) PURE;
-#define IPropertyBag2_IMETHODS \
-	IUnknown_IMETHODS \
-	IPropertyBag2_METHODS
 ICOM_DEFINE(IPropertyBag2,IUnknown)
 #undef INTERFACE
 
@@ -488,10 +464,8 @@ ICOM_DEFINE(IPropertyBag2,IUnknown)
  */
 #define INTERFACE ISpecifyPropertyPages
 #define ISpecifyPropertyPages_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetPages)(THIS_ CAUUID *pPages) PURE;
-#define ISpecifyPropertyPages_IMETHODS \
-	IUnknown_IMETHODS \
-	ISpecifyPropertyPages_METHODS
 ICOM_DEFINE(ISpecifyPropertyPages,IUnknown)
 #undef INTERFACE
 
@@ -510,13 +484,11 @@ ICOM_DEFINE(ISpecifyPropertyPages,IUnknown)
  */
 #define INTERFACE IPerPropertyBrowsing
 #define IPerPropertyBrowsing_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(GetDisplayString)(THIS_ DISPID dispID, BSTR *pBstr) PURE; \
 	STDMETHOD(MapPropertyToPage)(THIS_ DISPID dispID, CLSID *pClsid) PURE; \
 	STDMETHOD(GetPredefinedStrings)(THIS_ DISPID dispID, CALPOLESTR *pCaStringsOut, CADWORD *pCaCookiesOut) PURE; \
 	STDMETHOD(GetPredefinedValue)(THIS_ DISPID dispID, DWORD dwCookie, VARIANT *pVarOut) PURE;
-#define IPerPropertyBrowsing_IMETHODS \
-	IUnknown_IMETHODS \
-	IPerPropertyBrowsing_METHODS
 ICOM_DEFINE(IPerPropertyBrowsing,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_serviceprovider.h b/include/wine/obj_serviceprovider.h
index 4795e11f4e..d518aed47b 100644
--- a/include/wine/obj_serviceprovider.h
+++ b/include/wine/obj_serviceprovider.h
@@ -42,10 +42,8 @@ typedef struct IServiceProvider IServiceProvider, *LPSERVICEPROVIDER;
  */
 #define INTERFACE IServiceProvider
 #define IServiceProvider_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(QueryService)(THIS_ REFGUID  guidService, REFIID  riid, void ** ppv) PURE;
-#define IServiceProvider_IMETHODS \
-    IUnknown_IMETHODS \
-    IServiceProvider_METHODS
 ICOM_DEFINE(IServiceProvider,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_shellbrowser.h b/include/wine/obj_shellbrowser.h
index 36e4dcb0e7..1f2d70c35c 100644
--- a/include/wine/obj_shellbrowser.h
+++ b/include/wine/obj_shellbrowser.h
@@ -68,6 +68,7 @@ DEFINE_GUID(SID_STopLevelBrowser, 0x4C96BE40L, 0x915C, 0x11CF, 0x99, 0xD3, 0x00,
 
 #define INTERFACE IShellBrowser
 #define IShellBrowser_METHODS \
+	IOleWindow_METHODS \
 	STDMETHOD(InsertMenusSB)(THIS_ HMENU  hmenuShared, LPOLEMENUGROUPWIDTHS  lpMenuWidths) PURE; \
 	STDMETHOD(SetMenuSB)(THIS_ HMENU  hmenuShared, HOLEMENU  holemenuReserved, HWND  hwndActiveObject) PURE; \
 	STDMETHOD(RemoveMenusSB)(THIS_ HMENU  hmenuShared) PURE; \
@@ -81,9 +82,6 @@ DEFINE_GUID(SID_STopLevelBrowser, 0x4C96BE40L, 0x915C, 0x11CF, 0x99, 0xD3, 0x00,
 	STDMETHOD(QueryActiveShellView)(THIS_ IShellView ** IShellView) PURE; \
 	STDMETHOD(OnViewWindowActive)(THIS_ IShellView * IShellView) PURE; \
 	STDMETHOD(SetToolbarItems)(THIS_ LPTBBUTTON  lpButtons, UINT  nButtons, UINT  uFlags) PURE;
-#define IShellBrowser_IMETHODS \
-	IOleWindow_IMETHODS \
-	IShellBrowser_METHODS
 ICOM_DEFINE(IShellBrowser,IOleWindow)
 #undef INTERFACE
 
diff --git a/include/wine/obj_shellextinit.h b/include/wine/obj_shellextinit.h
index 99378c3785..1c2b0b0e2c 100644
--- a/include/wine/obj_shellextinit.h
+++ b/include/wine/obj_shellextinit.h
@@ -29,10 +29,8 @@ typedef struct 	IShellExtInit IShellExtInit, *LPSHELLEXTINIT;
 
 #define INTERFACE IShellExtInit
 #define IShellExtInit_METHODS \
+	IUnknown_METHODS \
 	STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST  pidlFolder, LPDATAOBJECT  lpdobj, HKEY  hkeyProgID) PURE;
-#define IShellExtInit_IMETHODS \
-	IUnknown_IMETHODS \
-	IShellExtInit_METHODS
 ICOM_DEFINE(IShellExtInit,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_shellfolder.h b/include/wine/obj_shellfolder.h
index 31dcac5aae..3a72483fb9 100644
--- a/include/wine/obj_shellfolder.h
+++ b/include/wine/obj_shellfolder.h
@@ -80,13 +80,11 @@ typedef struct
 
 #define INTERFACE IEnumExtraSearch
 #define IEnumExtraSearch_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(Next)(THIS_ ULONG  celt, LPEXTRASEARCH * rgelt, ULONG * pceltFetched) PURE; \
     STDMETHOD(Skip)(THIS_ ULONG  celt) PURE; \
     STDMETHOD(Reset)(THIS) PURE; \
     STDMETHOD(Clone)(THIS_ IEnumExtraSearch ** ppenum) PURE;
-#define IEnumExtraSearch_IMETHODS \
-    IUnknown_IMETHODS \
-    IEnumExtraSearch_METHODS
 ICOM_DEFINE(IEnumExtraSearch,IUnknown)
 #undef INTERFACE
 
@@ -200,6 +198,7 @@ DWORD WINAPI SHGetDesktopFolder(IShellFolder * *);
  */
 #define INTERFACE IShellFolder
 #define IShellFolder_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(ParseDisplayName)(THIS_ HWND  hwndOwner,LPBC  pbcReserved, LPOLESTR  lpszDisplayName, ULONG  * pchEaten, LPITEMIDLIST  * ppidl, ULONG  * pdwAttributes) PURE; \
     STDMETHOD(EnumObjects)(THIS_ HWND  hwndOwner, DWORD  grfFlags, LPENUMIDLIST  * ppenumIDList) PURE;\
     STDMETHOD(BindToObject)(THIS_ LPCITEMIDLIST  pidl, LPBC  pbcReserved, REFIID  riid, LPVOID  * ppvOut) PURE;\
@@ -210,9 +209,6 @@ DWORD WINAPI SHGetDesktopFolder(IShellFolder * *);
     STDMETHOD(GetUIObjectOf)(THIS_ HWND  hwndOwner, UINT  cidl, LPCITEMIDLIST  * apidl, REFIID  riid, UINT  * prgfInOut, LPVOID  * ppvOut) PURE;\
     STDMETHOD(GetDisplayNameOf)(THIS_ LPCITEMIDLIST  pidl, DWORD  uFlags, LPSTRRET  lpName) PURE;\
     STDMETHOD(SetNameOf)(THIS_ HWND  hwndOwner, LPCITEMIDLIST  pidl,LPCOLESTR  lpszName, DWORD  uFlags,LPITEMIDLIST  * ppidlOut) PURE;
-#define IShellFolder_IMETHODS \
-    IUnknown_IMETHODS \
-    IShellFolder_METHODS
 ICOM_DEFINE(IShellFolder,IUnknown)
 #undef INTERFACE
 
@@ -274,6 +270,7 @@ typedef struct
 
 #define INTERFACE IShellFolder2
 #define IShellFolder2_METHODS \
+    IShellFolder_METHODS \
     STDMETHOD(GetDefaultSearchGUID)(THIS_ LPGUID  lpguid) PURE;\
     STDMETHOD(EnumSearches)(THIS_ LPENUMEXTRASEARCH  * ppEnum) PURE; \
     STDMETHOD(GetDefaultColumn)(THIS_ DWORD  dwReserved, ULONG  * pSort, ULONG  * pDisplay) PURE;\
@@ -281,9 +278,6 @@ typedef struct
     STDMETHOD(GetDetailsEx)(THIS_ LPCITEMIDLIST  pidl, const SHCOLUMNID  * pscid, VARIANT  * pv) PURE;\
     STDMETHOD(GetDetailsOf)(THIS_ LPCITEMIDLIST  pidl, UINT  iColumn, LPSHELLDETAILS  pDetails) PURE;\
     STDMETHOD(MapNameToSCID)(THIS_ LPCWSTR  pwszName, SHCOLUMNID  * pscid) PURE;
-#define IShellFolder2_IMETHODS \
-    IShellFolder_METHODS \
-    IShellFolder2_METHODS
 ICOM_DEFINE(IShellFolder2, IShellFolder)
 #undef INTERFACE
 
@@ -319,10 +313,8 @@ ICOM_DEFINE(IShellFolder2, IShellFolder)
 
 #define INTERFACE IPersistFolder
 #define IPersistFolder_METHODS \
+    IPersist_METHODS \
     STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST  pidl) PURE;
-#define IPersistFolder_IMETHODS \
-    IPersist_IMETHODS \
-    IPersistFolder_METHODS
 ICOM_DEFINE(IPersistFolder, IPersist)
 #undef INTERFACE
 
@@ -343,11 +335,8 @@ ICOM_DEFINE(IPersistFolder, IPersist)
 
 #define INTERFACE IPersistFolder2
 #define IPersistFolder2_METHODS \
-    STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST * pidl) PURE;
-#define IPersistFolder2_IMETHODS \
-    IPersist_IMETHODS \
     IPersistFolder_METHODS \
-    IPersistFolder2_METHODS
+    STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST * pidl) PURE;
 ICOM_DEFINE(IPersistFolder2, IPersistFolder)
 #undef INTERFACE
 
@@ -379,13 +368,9 @@ typedef struct {
 
 #define INTERFACE IPersistFolder3
 #define IPersistFolder3_METHODS \
+    IPersistFolder2_METHODS \
     STDMETHOD(InitializeEx)(THIS_ IBindCtx * pbc, LPCITEMIDLIST  pidlRoot, const PERSIST_FOLDER_TARGET_INFO * ppfti) PURE;\
     STDMETHOD(GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO * ppfti) PURE;
-#define IPersistFolder3_IMETHODS \
-    IPersist_IMETHODS \
-    IPersistFolder_METHODS \
-    IPersistFolder2_METHODS \
-    IPersistFolder3_METHODS
 ICOM_DEFINE(IPersistFolder3, IPersistFolder2)
 #undef INTERFACE
 
diff --git a/include/wine/obj_shelllink.h b/include/wine/obj_shelllink.h
index fb652eed91..8206611962 100644
--- a/include/wine/obj_shelllink.h
+++ b/include/wine/obj_shelllink.h
@@ -54,6 +54,7 @@ typedef enum
  */
 #define INTERFACE IShellLinkA
 #define IShellLinkA_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetPath)(THIS_ LPSTR  pszFile, INT  cchMaxPath, WIN32_FIND_DATAA  * pfd, DWORD  fFlags) PURE; \
     STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST  * ppidl) PURE; \
     STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST  pidl) PURE; \
@@ -72,9 +73,6 @@ typedef enum
     STDMETHOD(SetRelativePath)(THIS_ LPCSTR  pszPathRel, DWORD  dwReserved) PURE; \
     STDMETHOD(Resolve)(THIS_ HWND  hwnd, DWORD  fFlags) PURE; \
     STDMETHOD(SetPath)(THIS_ LPCSTR  pszFile) PURE;
-#define IShellLinkA_IMETHODS \
-    IUnknown_IMETHODS \
-    IShellLinkA_METHODS
 ICOM_DEFINE(IShellLinkA,IUnknown)
 #undef INTERFACE
 
@@ -109,6 +107,7 @@ ICOM_DEFINE(IShellLinkA,IUnknown)
  */
 #define INTERFACE IShellLinkW
 #define IShellLinkW_METHODS \
+    IUnknown_METHODS \
     STDMETHOD(GetPath)(THIS_ LPWSTR  pszFile, INT  cchMaxPath, WIN32_FIND_DATAA  * pfd, DWORD  fFlags) PURE; \
     STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST  * ppidl) PURE; \
     STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST  pidl) PURE; \
@@ -127,9 +126,6 @@ ICOM_DEFINE(IShellLinkA,IUnknown)
     STDMETHOD(SetRelativePath)(THIS_ LPCWSTR  pszPathRel, DWORD  dwReserved) PURE; \
     STDMETHOD(Resolve)(THIS_ HWND  hwnd, DWORD  fFlags) PURE; \
     STDMETHOD(SetPath)(THIS_ LPCWSTR  pszFile) PURE;
-#define IShellLinkW_IMETHODS \
-    IUnknown_IMETHODS \
-    IShellLinkW_METHODS
 ICOM_DEFINE(IShellLinkW,IUnknown)
 #undef INTERFACE
 
diff --git a/include/wine/obj_shellview.h b/include/wine/obj_shellview.h
index 8087bacd59..93162f2b66 100644
--- a/include/wine/obj_shellview.h
+++ b/include/wine/obj_shellview.h
@@ -129,6 +129,7 @@ typedef enum
 
 #define INTERFACE IShellView
 #define IShellView_METHODS \
+	IOleWindow_METHODS \
 	STDMETHOD(TranslateAccelerator)(THIS_ LPMSG  lpmsg) PURE; \
 	STDMETHOD(EnableModeless)(THIS_ BOOL  fEnable) PURE; \
 	STDMETHOD(UIActivate)(THIS_ UINT  uState) PURE; \
@@ -141,9 +142,6 @@ typedef enum
 	STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST  pidlItem, UINT  uFlags) PURE; \
 	STDMETHOD(GetItemObject)(THIS_ UINT  uItem, REFIID  riid, LPVOID * ppv) PURE; \
 	STDMETHOD(EditItem)(THIS_ LPCITEMIDLIST  pidlItem) PURE;
-#define IShellView_IMETHODS \
-	IOleWindow_IMETHODS \
-	IShellView_METHODS
 ICOM_DEFINE(IShellView,IOleWindow)
 #undef INTERFACE
 
diff --git a/include/wine/obj_webbrowser.h b/include/wine/obj_webbrowser.h
index 4e23ed475a..6588679018 100644
--- a/include/wine/obj_webbrowser.h
+++ b/include/wine/obj_webbrowser.h
@@ -65,6 +65,7 @@ typedef enum RefreshConstants
  */
 #define INTERFACE IWebBrowser
 #define IWebBrowser_METHODS \
+	IDispatch_METHODS \
 	STDMETHOD(GoBack)(THIS) PURE; \
 	STDMETHOD(GoForward)(THIS) PURE; \
 	STDMETHOD(GoHome)(THIS) PURE; \
@@ -91,9 +92,6 @@ typedef enum RefreshConstants
 	STDMETHOD(get_LocationName)(THIS_ BSTR *LocationName) PURE; \
 	STDMETHOD(get_LocationURL)(THIS_ BSTR *LocationURL) PURE; \
 	STDMETHOD(get_Busy)(THIS_ VARIANT *pBool) PURE;
-#define IWebBrowser_IMETHODS \
-	IDispatch_IMETHODS \
-	IWebBrowser_METHODS
 ICOM_DEFINE(IWebBrowser,IDispatch)
 #undef INTERFACE
 
@@ -137,6 +135,7 @@ ICOM_DEFINE(IWebBrowser,IDispatch)
 
 #define INTERFACE IWebBrowserApp
 #define IWebBrowserApp_METHODS \
+    IWebBrowser_METHODS \
     STDMETHOD(Quit)(THIS) PURE; \
     STDMETHOD(ClientToWindow)(THIS_ int *pcx,int *pcy) PURE; \
     STDMETHOD(PutProperty)(THIS_ BSTR szProperty,VARIANT vtValue) PURE; \
@@ -157,10 +156,6 @@ ICOM_DEFINE(IWebBrowser,IDispatch)
     STDMETHOD(put_MenuBar)(THIS_ VARIANT_BOOL Value) PURE; \
     STDMETHOD(get_FullScreen)(THIS_ VARIANT_BOOL *pbFullScreen) PURE; \
     STDMETHOD(put_FullScreen)(THIS_ VARIANT_BOOL bFullScreen) PURE;
-#define IWebBrowserApp_IMETHODS \
-    IDispatch_IMETHODS \
-    IWebBrowser_METHODS \
-    IWebBrowserApp_METHODS
 ICOM_DEFINE(IWebBrowserApp,IWebBrowser)
 #undef INTERFACE
 
diff --git a/tools/widl/header.c b/tools/widl/header.c
index 1d60b21135..bae0c53df9 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -438,20 +438,20 @@ static void write_icom_method_def(type_t *iface)
 	  arg = NEXT_LINK(arg);
 	}
       }
-      fprintf(header, " \\\n    ");
+      fprintf(header, " \\\n    STDMETHOD_(");
       write_type(header, def->type, def, def->tname);
-      fprintf(header, " (STDMETHODCALLTYPE *");
+      fprintf(header, ",");
       write_name(header, def);
-      fprintf(header, ")(INTERFACE *This");
+      fprintf(header, ")(%s", arg ? "THIS_ " : "THIS" );
       while (arg) {
-	fprintf(header, ", ");
 	write_type(header, arg->type, arg, arg->tname);
 	fprintf(header, " ");
 	write_name(header,arg);
 	write_array(header, arg->array, 0);
 	arg = PREV_LINK(arg);
+	if (arg) fprintf(header, ", ");
       }
-      fprintf(header, ");");
+      fprintf(header, ") PURE;");
     }
     cur = PREV_LINK(cur);
   }
@@ -711,15 +711,16 @@ void write_com_interface(type_t *iface)
   indentation--;
   fprintf(header, "};\n");
   fprintf(header, "\n");
-  if (compat_icom) {
-      fprintf(header, "#define %s_IMETHODS", iface->name);
-      write_icom_method_def(iface);
-      fprintf(header, "\n\n");
-  }
   write_method_macro(iface, iface->name);
   fprintf(header, "\n");
   fprintf(header, "#endif\n");
   fprintf(header, "\n");
+  if (compat_icom) {
+      fprintf(header, "#define %s_METHODS \\\n", iface->name);
+      fprintf(header, "    ICOM_MSVTABLE_COMPAT_FIELDS");
+      write_icom_method_def(iface);
+      fprintf(header, "\n\n");
+  }
   write_method_proto(iface);
   fprintf(header, "\n");