diff --git a/include/wine/obj_moniker.h b/include/wine/obj_moniker.h
index a41c165570f35a0a4d56d30968c3c7ac9d150f9b..83c055be0241a54e0fad71cb316591fa4180d3c6 100644
--- a/include/wine/obj_moniker.h
+++ b/include/wine/obj_moniker.h
@@ -39,18 +39,18 @@ typedef struct IRunningObjectTable IRunningObjectTable,*LPRUNNINGOBJECTTABLE;
 
 /*********************************************************************************
  *	BIND_OPTS and BIND_OPTS2 structures definition
- *	Thes structures contain parameters used during a moniker-binding operation.
+ *	These structures contain parameters used during a moniker-binding operation.
  *********************************************************************************/
-typedef struct tagBIND_OPTS{
-
+typedef struct tagBIND_OPTS
+{
     DWORD cbStruct;
     DWORD grfFlags;
     DWORD grfMode;
     DWORD dwTickCountDeadline;
 } BIND_OPTS, * LPBIND_OPTS;
 
-typedef struct tagBIND_OPTS2{
-
+typedef struct tagBIND_OPTS2
+{
     DWORD cbStruct;
     DWORD grfFlags;
     DWORD grfMode;
@@ -59,131 +59,297 @@ typedef struct tagBIND_OPTS2{
     DWORD dwClassContext;
     LCID  locale;
     COSERVERINFO* pServerInfo;
-    
 } BIND_OPTS2, * LPBIND_OPTS2;
 
 /*****************************************************************************
  * IBindCtx interface
  */
 #define ICOM_INTERFACE IBindCtx
-ICOM_BEGIN(IBindCtx,IUnknown)
-    ICOM_METHOD1 (HRESULT, RegisterObjectBound,IUnknown*,punk);
-    ICOM_METHOD1 (HRESULT, RevokeObjectBound,IUnknown*,punk);
-    ICOM_METHOD  (HRESULT, ReleaseObjects);
-    ICOM_METHOD1 (HRESULT, SetBindOptions,LPBIND_OPTS2,pbindopts);
-    ICOM_METHOD1 (HRESULT, GetBindOptions,LPBIND_OPTS2,pbindopts);
-    ICOM_METHOD1 (HRESULT, GetRunningObjectTable,IRunningObjectTable**,pprot);
-    ICOM_METHOD2 (HRESULT, RegisterObjectParam,LPOLESTR32,pszkey,IUnknown*,punk);
-    ICOM_METHOD2 (HRESULT, GetObjectParam,LPOLESTR32,pszkey,IUnknown*,punk);
-    ICOM_METHOD1 (HRESULT, EnumObjectParam,IEnumString**,ppenum);
-    ICOM_METHOD1 (HRESULT, RevokeObjectParam,LPOLESTR32,pszkey);
-ICOM_END(IBindCtx)
-
+#define IBindCtx_METHODS \
+    ICOM_METHOD1 (HRESULT, RegisterObjectBound,  IUnknown*,punk) \
+    ICOM_METHOD1 (HRESULT, RevokeObjectBound,    IUnknown*,punk) \
+    ICOM_METHOD  (HRESULT, ReleaseObjects) \
+    ICOM_METHOD1 (HRESULT, SetBindOptions,       LPBIND_OPTS2,pbindopts) \
+    ICOM_METHOD1 (HRESULT, GetBindOptions,       LPBIND_OPTS2,pbindopts) \
+    ICOM_METHOD1 (HRESULT, GetRunningObjectTable,IRunningObjectTable**,pprot) \
+    ICOM_METHOD2 (HRESULT, RegisterObjectParam,  LPOLESTR32,pszkey, IUnknown*,punk) \
+    ICOM_METHOD2 (HRESULT, GetObjectParam,       LPOLESTR32,pszkey, IUnknown*,punk) \
+    ICOM_METHOD1 (HRESULT, EnumObjectParam,      IEnumString**,ppenum) \
+    ICOM_METHOD1 (HRESULT, RevokeObjectParam,    LPOLESTR32,pszkey)
+#define IBindCtx_IMETHODS \
+    IUnknown_IMETHODS \
+    IBindCtx_METHODS
+ICOM_DEFINE(IBindCtx,IUnknown)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IBindCtx_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IBindCtxr_AddRef(p)            ICOM_ICALL (IUnknown,AddRef,p)
-#define IBindCtx_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IBindCtx_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IBindCtxr_AddRef(p)            ICOM_CALL (AddRef,p)
+#define IBindCtx_Release(p)            ICOM_CALL (Release,p)
 /* IBindCtx methods*/
-#define IBindCtx_RegisterObjectBound(p,a)           ICOM_CALL1 (RegisterObjectBound,p,a);
-#define IBindCtx_RevokeObjectBound(p,a)             ICOM_CALL1 (RevokeObjectBound,p,a);
-#define IBindCtx_ReleaseObjects(p)                  ICOM_CALL  (ReleaseObjects,p);
-#define IBindCtx_SetBindOptions(p,a)                ICOM_CALL1 (SetBindOptions,p,a);
-#define IBindCtx_GetBindOptions(p,a)                ICOM_CALL1 (GetBindOptions,p,a);
-#define IBindCtx_GetRunningObjectTable(p,a)         ICOM_CALL1 (GetRunningObjectTable,p,a);
-#define IBindCtx_RegisterObjectParam(p,a,b)         ICOM_CALL2 (RegisterObjectParam,p,a,b);
-#define IBindCtx_GetObjectParam(p,a,b)              ICOM_CALL2 (GetObjectParam,p,a,b);
-#define IBindCtx_EnumObjectParam(p,a)               ICOM_CALL1 (EnumObjectParam,p,a);
-#define IBindCtx_RevokeObjectParam(p,a)             ICOM_CALL1 (RevokeObjectParam,p,a);
-
+#define IBindCtx_RegisterObjectBound(p,a)   ICOM_CALL1(RegisterObjectBound,p,a)
+#define IBindCtx_RevokeObjectBound(p,a)     ICOM_CALL1(RevokeObjectBound,p,a)
+#define IBindCtx_ReleaseObjects(p)          ICOM_CALL (ReleaseObjects,p)
+#define IBindCtx_SetBindOptions(p,a)        ICOM_CALL1(SetBindOptions,p,a)
+#define IBindCtx_GetBindOptions(p,a)        ICOM_CALL1(GetBindOptions,p,a)
+#define IBindCtx_GetRunningObjectTable(p,a) ICOM_CALL1(GetRunningObjectTable,p,a)
+#define IBindCtx_RegisterObjectParam(p,a,b) ICOM_CALL2(RegisterObjectParam,p,a,b)
+#define IBindCtx_GetObjectParam(p,a,b)      ICOM_CALL2(GetObjectParam,p,a,b)
+#define IBindCtx_EnumObjectParam(p,a)       ICOM_CALL1(EnumObjectParam,p,a)
+#define IBindCtx_RevokeObjectParam(p,a)     ICOM_CALL1(RevokeObjectParam,p,a)
 #endif
 
+HRESULT WINAPI CreateBindCtx16(DWORD reserved, LPBC* ppbc);
+HRESULT WINAPI CreateBindCtx32(DWORD reserved, LPBC* ppbc);
 #define CreateBindCtx WINELIB_NAME(CreateBindCtx)
+
+
 /*****************************************************************************
  * IClassActivator interface
  */
-/* FIXME: not implemented */
+#define ICOM_INTERFACE IClassActivator
+#define IClassActivator_METHODS \
+    ICOM_METHOD5(HRESULT,GetClassObject, REFCLSID,rclsid, DWORD,dwClassContext, LCID,locale, REFIID,riid, void**,ppv)
+#define IClassActivator_IMETHODS \
+    IUnknown_IMETHODS \
+    IClassActivator_METHODS
+ICOM_DEFINE(IClassActivator,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define IClassActivator_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IClassActivator_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IClassActivator_Release(p)            ICOM_CALL (Release,p)
+/*** IClassActivator methods ***/
+#define IClassActivator_GetClassObject(p,a,b,c,d,e) ICOM_CALL5(GetClassObject,p,a,b,c,d,e)
+#endif
+
 
 /*****************************************************************************
  * IEnumMoniker interface
  */
-/* FIXME: not implemented */
+#define ICOM_INTERFACE IEnumMoniker
+#define IEnumMoniker_METHODS \
+    ICOM_METHOD3(HRESULT,Next,  ULONG,celt, IMoniker***,rgelt, ULONG*,pceltFethed) \
+    ICOM_METHOD1(HRESULT,Skip,  ULONG,celt) \
+    ICOM_METHOD (HRESULT,Reset) \
+    ICOM_METHOD1(HRESULT,Clone, IEnumMoniker**,ppenum)
+#define IEnumMoniker_IMETHODS \
+    IUnknown_IMETHODS \
+    IEnumMoniker_METHODS
+ICOM_DEFINE(IEnumMoniker,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define IEnumMoniker_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IEnumMoniker_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IEnumMoniker_Release(p)            ICOM_CALL (Release,p)
+/*** IEnumMoniker methods ***/
+#define IEnumMoniker_Next(p,a,b,c) ICOM_CALL3(Next,p,a,b,c)
+#define IEnumMoniker_Skip(p,a)     ICOM_CALL1(Skip,p,a)
+#define IEnumMoniker_Reset(p)      ICOM_CALL (Reset,p)
+#define IEnumMoniker_Clone(p,a)    ICOM_CALL1(Clone,p,a)
+#endif
+
 
 /*****************************************************************************
  * IMoniker interface
  */
+
+typedef enum tagMKSYS
+{
+    MKSYS_NONE              = 0,
+    MKSYS_GENERICCOMPOSITE  = 1,
+    MKSYS_FILEMONIKER       = 2,
+    MKSYS_ANTIMONIKER       = 3,
+    MKSYS_ITEMMONIKER       = 4,
+    MKSYS_POINTERMONIKER    = 5,
+    MKSYS_CLASSMONIKER      = 7
+} MKSYS;
+
+typedef enum tagMKREDUCE
+{
+    MKRREDUCE_ONE           = 3 << 16,
+    MKRREDUCE_TOUSER        = 2 << 16,
+    MKRREDUCE_THROUGHUSER   = 1 << 16,
+    MKRREDUCE_ALL           = 0
+} MKRREDUCE;
+
 #define ICOM_INTERFACE IMoniker
-ICOM_BEGIN(IMoniker,IPersistStream)
-    ICOM_METHOD4 (HRESULT,BindToObject,IBindCtx*,pbc,IMoniker*,pmkToLeft,REFIID,riid,VOID**,ppvResult);
-    ICOM_METHOD4 (HRESULT,BindToStorage,IBindCtx*,pbc,IMoniker*,pmkToLeft,REFIID,riid,VOID**,ppvResult);
-    ICOM_METHOD4 (HRESULT,Reduce,IBindCtx*,pbc,DWORD,dwReduceHowFar,IMoniker**,ppmkToLeft,IMoniker**,ppmkReduced);
-    ICOM_METHOD3 (HRESULT,ComposeWith,IMoniker*,pmkRight,BOOL32,fOnlyIfNotGeneric,IMoniker**,ppmkComposite);
-    ICOM_METHOD2 (HRESULT,Enum,BOOL32,fForward,IEnumMoniker**,ppenumMoniker);
-    ICOM_METHOD1 (HRESULT,IsEqual,IMoniker*, pmkOtherMoniker);
-    ICOM_METHOD1 (HRESULT,Hash,DWORD*,pdwHash);
-    ICOM_METHOD3 (HRESULT,IsRunning,IBindCtx*,pbc,IMoniker*,pmkToLeft,IMoniker*,pmkNewlyRunning);
-    ICOM_METHOD3 (HRESULT,GetTimeOfLastChange,IBindCtx*,pbc,IMoniker*,pmkToLeft,FILETIME*,pFileTime);
-    ICOM_METHOD1 (HRESULT,Inverse,IMoniker**,ppmk);
-    ICOM_METHOD2 (HRESULT,CommonPrefixWith,IMoniker*,pmkOther,IMoniker**,ppmkPrefix);
-    ICOM_METHOD2 (HRESULT,RelativePathTo,IMoniker*,pmOther,IMoniker**,ppmkRelPath);
-    ICOM_METHOD3 (HRESULT,GetDisplayName,IBindCtx*,pbc,IMoniker*,pmkToLeft,LPOLESTR32,*ppszDisplayName);
-    ICOM_METHOD5 (HRESULT,ParseDisplayName,IBindCtx*,pbc,IMoniker*,pmkToLeft,LPOLESTR32,pszDisplayName,ULONG*,pchEaten,IMoniker**,ppmkOut);
-    ICOM_METHOD1 (HRESULT,IsSystemMoniker,DWORD*,pwdMksys);
-ICOM_END(IMoniker)
+#define IMoniker_METHODS \
+    ICOM_METHOD4(HRESULT,BindToObject,        IBindCtx*,pbc, IMoniker*,pmkToLeft, REFIID,riidResult, void**,ppvResult) \
+    ICOM_METHOD4(HRESULT,BindToStorage,       IBindCtx*,pbc, IMoniker*,pmkToLeft, REFIID,riid, void**,ppvObj) \
+    ICOM_METHOD4(HRESULT,Reduce,              IBindCtx*,pbc, DWORD,dwReduceHowFar, IMoniker**,ppmkToLeft, IMoniker**,ppmkReduced) \
+    ICOM_METHOD3(HRESULT,ComposeWith,         IMoniker*,pmkRight, BOOL32,fOnlyIfNotGeneric, IMoniker**,ppmkComposite) \
+    ICOM_METHOD2(HRESULT,Enum,                BOOL32,fForward, IEnumMoniker**,ppenumMoniker) \
+    ICOM_METHOD1(HRESULT,IsEqual,             IMoniker*,pmkOtherMoniker) \
+    ICOM_METHOD1(HRESULT,Hash,                DWORD*,pdwHash) \
+    ICOM_METHOD3(HRESULT,IsRunning,           IBindCtx*,pbc, IMoniker*,pmkToLeft, IMoniker*,pmkNewlyRunning) \
+    ICOM_METHOD3(HRESULT,GetTimeOfLastChange, IBindCtx*,pbc, IMoniker*,pmkToLeft, FILETIME*,pFileTime) \
+    ICOM_METHOD1(HRESULT,Inverse,             IMoniker**,ppmk) \
+    ICOM_METHOD2(HRESULT,CommonPrefixWith,    IMoniker*,pmkOtherMoniker, IMoniker**,ppmkPrefix) \
+    ICOM_METHOD2(HRESULT,RelativePathTo,      IMoniker*,pmkOther, IMoniker**,ppmkRelPath) \
+    ICOM_METHOD3(HRESULT,GetDisplayName,      IBindCtx*,pbc, IMoniker*,pmkToLeft, LPOLESTR32*,ppszDisplayName) \
+    ICOM_METHOD5(HRESULT,ParseDisplayName,    IBindCtx*,pbc, IMoniker*,pmkToLeft, LPOLESTR32,pszDisplayName, ULONG*,pchEaten, IMoniker**,ppmkOut) \
+    ICOM_METHOD1(HRESULT,IsSystemMoniker,     DWORD*,pdwMksys)
+#define IMoniker_IMETHODS \
+    IPersistStream_IMETHODS \
+    IMoniker_METHODS
+ICOM_DEFINE(IMoniker,IPersistStream)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IMoniker_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IMoniker_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IMoniker_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IMoniker_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IMoniker_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IMoniker_Release(p)            ICOM_CALL (Release,p)
 /*** IPersist methods ***/
-#define IMoniker_GetClassID(p,a)       ICOM_ICALL1(IPersist,GetClassID,p,a)
-/*** IPersistStream ***/
-#define IMoniker_Stream_IsDirty(p)      ICOM_ICALL(IPersistStream,IsDirty,p)
-#define IMoniker_Stream_Load(p,a)       ICOM_ICALL1(IPersistStream,Load,p,a)
-#define IMoniker_Stream_Save(p,a,b)     ICOM_ICALL2(IPersistStream,Save,p,a,b)
-#define IMoniker_Stream_GetSizeMax(p,a) ICOM_ICALL1(IPersistStream,GetSizeMax,p,a)
-/* IMonker methods*/
-#define IMoniker_BindToObject(p,a,b,c,d)            ICOM_CALL4(BindToObject,p,a,b,c,d)
-#define IMoniker_BindToStorage(p,a,b,c,d)           ICOM_CALL4(BindToStorage,p,a,b,c,d)
-#define IMoniker_Reduce(p,a,b,c,d)                  ICOM_CALL4(Reduce,p,a,b,c,d)
-#define IMoniker_ComposeWith(p,a,b,c)               ICOM_CALL3(ComposeWith,p,a,b,c)
-#define IMoniker_Enum(p,a,b)                        ICOM_CALL2(Enum,p,a,b)
-#define IMoniker_IsEqual(p,a)                       ICOM_CALL1(IsEqual,p,a)
-#define IMoniker_Hash(p,a)                          ICOM_CALL1(Hash,p,a)
-#define IMoniker_IsRunning(p,a,b,c)                 ICOM_CALL3(IsRunning,p,a,b,c)
-#define IMoniker_GetTimeOfLastChange(p,a,b,c)       ICOM_CALL3(GetTimeOfLastChange,p,a,b,c)
-#define IMoniker_Inverse(p,a)                       ICOM_CALL1(Inverse,p,a)
-#define IMoniker_CommonPrefixWith(p,a,b)            ICOM_CALL2(CommonPrefixWith,p,a,b)
-#define IMoniker_RelativePathTo(p,a,b)              ICOM_CALL2(RelativePathTo,p,a,b)
-#define IMoniker_GetDisplayName(p,a,b,c)            ICOM_CALL3(GetDisplayName,p,a,b,c)
-#define IMoniker_ParseDisplayName(p,a,b,c,d,e)      ICOM_CALL5(ParseDisplayName,p,a,b,c,d,e)
-#define IMoniker_IsSystemMoniker(p,a)               ICOM_CALL1(IsSystemMonker,p,a)
+#define IMoniker_GetClassID(p,a) ICOM_CALL1(GetClassID,p,a)
+/*** IPersistStream methods ***/
+#define IMoniker_IsDirty(p)      ICOM_CALL (IsDirty,p)
+#define IMoniker_Load(p,a)       ICOM_CALL1(Load,p,a)
+#define IMoniker_Save(p,a,b)     ICOM_CALL2(Save,p,a,b)
+#define IMoniker_GetSizeMax(p,a) ICOM_CALL1(GetSizeMax,p,a)
+/*** IMoniker methods ***/
+#define IMoniker_BindToObject(p,a,b,c,d)       ICOM_CALL(BindToObject,p,a,b,c,d)
+#define IMoniker_BindToStorage(p,a,b,c,d)      ICOM_CALL(BindToStorage,p,a,b,c,d)
+#define IMoniker_Reduce(p,a,b,c,d)             ICOM_CALL(Reduce,p,a,b,c,d)
+#define IMoniker_ComposeWith(p,a,b,c)          ICOM_CALL(ComposeWith,p,a,b,c)
+#define IMoniker_Enum(p,a,b)                   ICOM_CALL(Enum,p,a,b)
+#define IMoniker_IsEqual(p,a)                  ICOM_CALL(IsEqual,p,a)
+#define IMoniker_Hash(p,a)                     ICOM_CALL(Hash,p,a)
+#define IMoniker_IsRunning(p,a,b,c)            ICOM_CALL(IsRunning,p,a,b,c)
+#define IMoniker_GetTimeOfLastChange(p,a,b,c)  ICOM_CALL(GetTimeOfLastChange,p,a,b,c)
+#define IMoniker_Inverse(p,a)                  ICOM_CALL(Inverse,p,a)
+#define IMoniker_CommonPrefixWith(p,a,b)       ICOM_CALL(CommonPrefixWith,p,a,b)
+#define IMoniker_RelativePathTo(p,a,b)         ICOM_CALL(RelativePathTo,p,a,b)
+#define IMoniker_GetDisplayName(p,a,b,c)       ICOM_CALL(GetDisplayName,p,a,b,c)
+#define IMoniker_ParseDisplayName(p,a,b,c,d,e) ICOM_CALL(ParseDisplayName,p,a,b,c,d,e)
+#define IMoniker_IsSystemMoniker(p,a)          ICOM_CALL(IsSystemMoniker,p,a)
 #endif
 
+/* FIXME: not implemented */
+HRESULT WINAPI  BindMoniker(LPMONIKER pmk, DWORD grfOpt, REFIID iidResult, LPVOID* ppvResult);
+
+/* FIXME: not implemented */
+HRESULT WINAPI CreateAntiMoniker(LPMONIKER* ppmk);
+
+/* FIXME: not implemented */
+HRESULT WINAPI CreateClassMoniker(REFCLSID rclsid, LPMONIKER* ppmk);
+
+HRESULT WINAPI CreateFileMoniker16(LPCOLESTR16 lpszPathName, LPMONIKER* ppmk);
+HRESULT WINAPI CreateFileMoniker32(LPCOLESTR32 lpszPathName, LPMONIKER* ppmk);
 #define CreateFileMoniker WINELIB_NAME(CreateFileMoniker)
+
+HRESULT WINAPI CreateItemMoniker16(LPCOLESTR16 lpszDelim, LPCOLESTR32  lpszItem, LPMONIKER* ppmk);
+HRESULT WINAPI CreateItemMoniker32(LPCOLESTR32 lpszDelim, LPCOLESTR32  lpszItem, LPMONIKER* ppmk);
 #define CreateItemMoniker WINELIB_NAME(CreateItemMoniker)
 
+/* FIXME: not implemented */
+HRESULT WINAPI CreateGenericComposite(LPMONIKER pmkFirst, LPMONIKER pmkRest, LPMONIKER* ppmkComposite);
+
+/* FIXME: not implemented */
+HRESULT WINAPI CreatePointerMoniker(LPUNKNOWN punk, LPMONIKER* ppmk);
+
 
 /*****************************************************************************
  * IROTData interface
  */
-/* FIXME: not implemented */
+#define ICOM_INTERFACE IROTData
+#define IROTData_METHODS \
+    ICOM_METHOD3(HRESULT,GetComparisonData, byte*,pbData, ULONG,cbMax, ULONG*,pcbData)
+#define IROTData_IMETHODS \
+    IUnknown_IMETHODS \
+    IROTData_METHODS
+ICOM_DEFINE(IROTData,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define IROTData_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IROTData_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IROTData_Release(p)            ICOM_CALL (Release,p)
+/*** IROTData methods ***/
+#define IROTData_GetComparisonData(p,a,b,c) ICOM_CALL3(GetComparisonData,p,a,b,c)
+#endif
 
 
 /*****************************************************************************
  * IRunnableObject interface
  */
-/* FIXME: not implemented */
+#define ICOM_INTERFACE IRunnableObject
+#define IRunnableObject_METHODS \
+    ICOM_METHOD1(HRESULT,GetRunningClass,    LPCLSID,lpClsid) \
+    ICOM_METHOD1(HRESULT,Run,                IBindCtx*,pbc) \
+    ICOM_METHOD (BOOL32,IsRunning) \
+    ICOM_METHOD2(HRESULT,LockRunning,        BOOL32,fLock, BOOL32,fLastUnlockCloses) \
+    ICOM_METHOD1(HRESULT,SetContainedObject, BOOL32,fContained)
+#define IRunnableObject_IMETHODS \
+    IUnknown_IMETHODS \
+    IRunnableObject_METHODS
+ICOM_DEFINE(IRunnableObject,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define IRunnableObject_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IRunnableObject_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IRunnableObject_Release(p)            ICOM_CALL (Release,p)
+/*** IRunnableObject methods ***/
+#define IRunnableObject_GetRunningClass(p,a)    ICOM_CALL1(GetRunningClass,p,a)
+#define IRunnableObject_Run(p,a)                ICOM_CALL1(Run,p,a)
+#define IRunnableObject_IsRunning(p)            ICOM_CALL (IsRunning,p)
+#define IRunnableObject_LockRunning(p,a,b)      ICOM_CALL2(LockRunning,p,a,b)
+#define IRunnableObject_SetContainedObject(p,a) ICOM_CALL1(SetContainedObject,p,a)
+#endif
 
 
 /*****************************************************************************
  * IRunningObjectTable interface
  */
+#define ICOM_INTERFACE IRunningObjectTable
+#define IRunningObjectTable_METHODS \
+    ICOM_METHOD4(HRESULT,Register,            DWORD,grfFlags, IUnknown*,punkObject, IMoniker*,pmkObjectName, DWORD*,pdwRegister) \
+    ICOM_METHOD1(HRESULT,Revoke,              DWORD,dwRegister) \
+    ICOM_METHOD1(HRESULT,IsRunning,           IMoniker*,pmkObjectName) \
+    ICOM_METHOD2(HRESULT,GetObject,           IMoniker*,pmkObjectName, IUnknown**,ppunkObject) \
+    ICOM_METHOD2(HRESULT,NoteChangeTime,      DWORD,dwRegister, FILETIME*,pfiletime) \
+    ICOM_METHOD2(HRESULT,GetTimeOfLastChange, IMoniker*,pmkObjectName, FILETIME*,pfiletime) \
+    ICOM_METHOD1(HRESULT,EnumRunning,         IEnumMoniker**,ppenumMoniker)
+#define IRunningObjectTable_IMETHODS \
+    IUnknown_IMETHODS \
+    IRunningObjectTable_METHODS
+ICOM_DEFINE(IRunningObjectTable,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define IRunningObjectTable_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IRunningObjectTable_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IRunningObjectTable_Release(p)            ICOM_CALL (Release,p)
+/*** IRunningObjectTable methods ***/
+#define IRunningObjectTable_Register(p,a,b,c,d)        ICOM_CALL4(Register,p,a,b,c,d)
+#define IRunningObjectTable_Revoke(p,a)                ICOM_CALL1(Revoke,p,a)
+#define IRunningObjectTable_IsRunning(p,a)             ICOM_CALL1(IsRunning,p,a)
+#define IRunningObjectTable_GetObject(p,a,b)           ICOM_CALL2(GetObject,p,a,b)
+#define IRunningObjectTable_NoteChangeTime(p,a,b)      ICOM_CALL2(NoteChangeTime,p,a,b)
+#define IRunningObjectTable_GetTimeOfLastChange(p,a,b) ICOM_CALL2(GetTimeOfLastChange,p,a,b)
+#define IRunningObjectTable_EnumRunning(p,a)           ICOM_CALL1(EnumRunning,p,a)
+#endif
+
+
+/*****************************************************************************
+ * Additional API
+ */
+
+/* FIXME: not implemented */
+HRESULT WINAPI CoGetInstanceFromFile(COSERVERINFO* pServerInfo, CLSID* pClsid, IUnknown* punkOuter, DWORD dwClsCtx, DWORD grfMode, OLECHAR32* pwszName, DWORD dwCount, MULTI_QI* pResults);
+
 /* FIXME: not implemented */
+HRESULT WINAPI CoGetInstanceFromIStorage(COSERVERINFO* pServerInfo, CLSID* pClsid, IUnknown* punkOuter, DWORD dwClsCtx, IStorage32* pstg, DWORD dwCount, MULTI_QI* pResults);
 
 
 #endif /* __WINE_WINE_OBJ_MONIKER_H */
diff --git a/include/wine/obj_storage.h b/include/wine/obj_storage.h
index 65a8361a644e49388811326c3ed1389568d84de4..a698e7ede2819c2522ff3d2affce04e34bb3472c 100644
--- a/include/wine/obj_storage.h
+++ b/include/wine/obj_storage.h
@@ -140,19 +140,22 @@ struct STATSTG {
  * IEnumSTATSTG interface
  */
 #define ICOM_INTERFACE IEnumSTATSTG
-ICOM_BEGIN(IEnumSTATSTG,IUnknown)
-     ICOM_METHOD3(HRESULT, Next, ULONG, celt, STATSTG*, rgelt, ULONG*, pceltFetched);   
-     ICOM_METHOD1(HRESULT, Skip, ULONG, celt);
-     ICOM_CMETHOD(HRESULT, Reset);
-     ICOM_METHOD1(HRESULT, Clone, IEnumSTATSTG**, ppenum);
-ICOM_END(IEnumSTATSTG)
+#define IEnumSTATSTG_METHODS \
+    ICOM_METHOD3(HRESULT,Next,  ULONG,celt, STATSTG*,rgelt, ULONG*,pceltFethed) \
+    ICOM_METHOD1(HRESULT,Skip,  ULONG,celt) \
+    ICOM_METHOD (HRESULT,Reset) \
+    ICOM_METHOD1(HRESULT,Clone, IEnumSTATSTG**,ppenum)
+#define IEnumSTATSTG_IMETHODS \
+    IUnknown_IMETHODS \
+    IEnumSTATSTG_METHODS
+ICOM_DEFINE(IEnumSTATSTG,IUnknown)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IEnumSTATSTG_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IEnumSTATSTG_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IEnumSTATSTG_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IEnumSTATSTG_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IEnumSTATSTG_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IEnumSTATSTG_Release(p)            ICOM_CALL (Release,p)
 /*** IEnumSTATSTG methods ***/
 #define IEnumSTATSTG_Next(p,a,b,c)         ICOM_CALL3(Next,p,a,b,c)
 #define IEnumSTATSTG_Skip(p,a)             ICOM_CALL1(Skip,p,a)
@@ -160,38 +163,124 @@ ICOM_END(IEnumSTATSTG)
 #define IEnumSTATSTG_Clone(p,a)            ICOM_CALL1(Clone,p,a)
 #endif
 
+
 /*****************************************************************************
  * IFillLockBytes interface
  */
-/* FIXME: not implemented */
+#define ICOM_INTERFACE IFillLockBytes
+#define IFillLockBytes_METHODS \
+    ICOM_METHOD3(HRESULT,FillAppend,  const void*,pv, ULONG,cb, ULONG*,pcbWritten) \
+    ICOM_METHOD4(HRESULT,FillAt,      ULARGE_INTEGER,ulOffset, const void*,pv, ULONG,cb, ULONG*,pcbWritten) \
+    ICOM_METHOD1(HRESULT,SetFillSize, ULARGE_INTEGER,ulSize) \
+    ICOM_METHOD1(HRESULT,Terminate,   BOOL32,bCanceled)
+#define IFillLockBytes_IMETHODS \
+    IUnknown_IMETHODS \
+    IFillLockBytes_METHODS
+ICOM_DEFINE(IFillLockBytes,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define IFillLockBytes_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IFillLockBytes_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IFillLockBytes_Release(p)            ICOM_CALL (Release,p)
+/*** IFillLockBytes methods ***/
+#define IFillLockBytes_FillAppend(p,a,b,c) ICOM_CALL3(FillAppend,p,a,b,c)
+#define IFillLockBytes_FillAt(p,a,b,c,d)   ICOM_CALL4(FillAt,p,a,b,c,d)
+#define IFillLockBytes_SetFillSize(p,a)    ICOM_CALL1(SetFillSize,p,a)
+#define IFillLockBytes_Terminate(p,a)      ICOM_CALL1(Terminate,p,a)
+#endif
 
 
 /*****************************************************************************
  * ILayoutStorage interface
  */
-/* FIXME: not implemented */
+typedef struct tagStorageLayout
+{
+    DWORD LayoutType;
+    OLECHAR16* pwcsElementName;
+    LARGE_INTEGER cOffset;
+    LARGE_INTEGER cBytes;
+} StorageLayout;
+
+#define ICOM_INTERFACE ILayoutStorage
+#define ILayoutStorage_METHODS \
+    ICOM_METHOD2(HRESULT,LayoutScript,                DWORD,nEntries, DWORD,glfInterleavedFlag) \
+    ICOM_METHOD (HRESULT,BeginMonitor) \
+    ICOM_METHOD (HRESULT,EndMonitor) \
+    ICOM_METHOD1(HRESULT,ReLayoutDocfile,             OLECHAR16*,pwcsNewDfName) \
+    ICOM_METHOD1(HRESULT,ReLayoutDocfileOnILockBytes, ILockBytes*,pILockBytes)
+#define ILayoutStorage_IMETHODS \
+    IUnknown_IMETHODS \
+    ILayoutStorage_METHODS
+ICOM_DEFINE(ILayoutStorage,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define ILayoutStorage_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define ILayoutStorage_AddRef(p)             ICOM_CALL (AddRef,p)
+#define ILayoutStorage_Release(p)            ICOM_CALL (Release,p)
+/*** ILayoutStorage methods ***/
+#define ILayoutStorage_LayoutScript(p,a,b)              ICOM_CALL2(LayoutScript,p,a,b)
+#define ILayoutStorage_BeginMonitor(p)                  ICOM_CALL (BeginMonitor,p)
+#define ILayoutStorage_EndMonitor(p)                    ICOM_CALL (EndMonitor,p)
+#define ILayoutStorage_ReLayoutDocfile(p,a)             ICOM_CALL1(ReLayoutDocfile,p,a)
+#define ILayoutStorage_ReLayoutDocfileOnILockBytes(p,a) ICOM_CALL1(ReLayoutDocfileOnILockBytes,p,a)
+#endif
 
 
 /*****************************************************************************
  * ILockBytes interface
  */
-/* FIXME: not implemented */
+#define ICOM_INTERFACE ILockBytes
+#define ILockBytes_METHODS \
+    ICOM_METHOD4(HRESULT,ReadAt,       ULARGE_INTEGER,ulOffset, void*,pv, ULONG,cb, ULONG*,pcbRead) \
+    ICOM_METHOD4(HRESULT,WriteAt,      ULARGE_INTEGER,ulOffset, const void*,pv, ULONG,cb, ULONG*,pcbWritten) \
+    ICOM_METHOD (HRESULT,Flush); \
+    ICOM_METHOD1(HRESULT,SetSize,      ULARGE_INTEGER,cb) \
+    ICOM_METHOD3(HRESULT,LockRegion,   ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) \
+    ICOM_METHOD3(HRESULT,UnlockRegion, ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) \
+    ICOM_METHOD2(HRESULT,Stat,         STATSTG*,pstatstg, DWORD,grfStatFlag)
+#define ILockBytes_IMETHODS \
+    IUnknown_IMETHODS \
+    ILockBytes_METHODS
+ICOM_DEFINE(ILockBytes,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define ILockBytes_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define ILockBytes_AddRef(p)             ICOM_CALL (AddRef,p)
+#define ILockBytes_Release(p)            ICOM_CALL (Release,p)
+/*** ILockBytes methods ***/
+#define ILockBytes_ReadAt(p,a,b,c,d)     ICOM_CALL4(ReadAt,p,a,b,c,d)
+#define ILockBytes_WriteAt(p,a,b,c,d)    ICOM_CALL4(WriteAt,p,a,b,c,d)
+#define ILockBytes_Flush(p)              ICOM_CALL (Flush,p)
+#define ILockBytes_SetSize(p,a)          ICOM_CALL1(SetSize,p,a)
+#define ILockBytes_LockRegion(p,a,b,c)   ICOM_CALL3(LockRegion,p,a,b,c)
+#define ILockBytes_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c)
+#define ILockBytes_Stat(p,a,b)           ICOM_CALL2(Stat,p,a,b)
+#endif
 
 
 /*****************************************************************************
  * IPersist interface
  */
 #define ICOM_INTERFACE IPersist
-ICOM_BEGIN(IPersist,IUnknown)
-    ICOM_CMETHOD1(HRESULT,GetClassID, CLSID*,pClassID);
-ICOM_END(IPersist)
+#define IPersist_METHODS \
+    ICOM_CMETHOD1(HRESULT,GetClassID, CLSID*,pClassID)
+#define IPersist_IMETHODS \
+    IUnknown_IMETHODS \
+    IPersist_METHODS
+ICOM_DEFINE(IPersist,IUnknown)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IPersist_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IPersist_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IPersist_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IPersist_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IPersist_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IPersist_Release(p)            ICOM_CALL (Release,p)
 /*** IPersist methods ***/
 #define IPersist_GetClassID(p,a) ICOM_CALL1(GetClassID,p,a)
 #endif
@@ -201,22 +290,25 @@ ICOM_END(IPersist)
  * IPersistFile interface
  */
 #define ICOM_INTERFACE IPersistFile
-ICOM_BEGIN(IPersistFile,IPersist)
-    ICOM_CMETHOD (HRESULT,IsDirty);
-    ICOM_METHOD2 (HRESULT,Load,          LPCOLESTR32,pszFileName, DWORD,dwMode);
-    ICOM_METHOD2 (HRESULT,Save,          LPCOLESTR32,pszFileName, BOOL32,fRemember);
-    ICOM_METHOD1 (HRESULT,SaveCompleted, LPCOLESTR32,pszFileName);
-    ICOM_CMETHOD1(HRESULT,GetCurFile,    LPOLESTR32*,ppszFileName);
-ICOM_END(IPersistFile)
+#define IPersistFile_METHODS \
+    ICOM_CMETHOD (HRESULT,IsDirty) \
+    ICOM_METHOD2 (HRESULT,Load,          LPCOLESTR32,pszFileName, DWORD,dwMode) \
+    ICOM_METHOD2 (HRESULT,Save,          LPCOLESTR32,pszFileName, BOOL32,fRemember) \
+    ICOM_METHOD1 (HRESULT,SaveCompleted, LPCOLESTR32,pszFileName) \
+    ICOM_CMETHOD1(HRESULT,GetCurFile,    LPOLESTR32*,ppszFileName)
+#define IPersistFile_IMETHODS \
+    IPersist_IMETHODS \
+    IPersistFile_METHODS
+ICOM_DEFINE(IPersistFile,IPersist)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IPersistFile_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IPersistFile_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IPersistFile_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IPersistFile_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IPersistFile_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IPersistFile_Release(p)            ICOM_CALL (Release,p)
 /*** IPersist methods ***/
-#define IPersistFile_GetClassID(p,a) ICOM_ICALL1(IPersist,GetClassID,p,a)
+#define IPersistFile_GetClassID(p,a) ICOM_CALL1(GetClassID,p,a)
 /*** IPersistFile methods ***/
 #define IPersistFile_IsDirty(p)         ICOM_CALL(IsDirty,p)
 #define IPersistFile_Load(p,a,b)        ICOM_CALL2(Load,p,a,b)
@@ -230,24 +322,27 @@ ICOM_END(IPersistFile)
  * IPersistStorage interface
  */
 #define ICOM_INTERFACE IPersistStorage
-ICOM_BEGIN(IPersistStorage, IPersist)
-		ICOM_METHOD (HRESULT,IsDirty)
-		ICOM_METHOD1(HRESULT,InitNew,         IStorage32*,pStg)
-		ICOM_METHOD1(HRESULT,Load,            IStorage32*,pStg)
-		ICOM_METHOD2(HRESULT,Save,            IStorage32*,pStgSave,  BOOL32,fSameAsLoad)
-		ICOM_METHOD1(HRESULT,SaveCompleted,   IStorage32*,pStgNew);
+#define IPersistStorage_METHODS \
+    ICOM_METHOD (HRESULT,IsDirty) \
+    ICOM_METHOD1(HRESULT,InitNew,        IStorage32*,pStg) \
+    ICOM_METHOD1(HRESULT,Load,           IStorage32*,pStg) \
+    ICOM_METHOD2(HRESULT,Save,           IStorage32*,pStg, BOOL32,fSameAsLoad) \
+    ICOM_METHOD1(HRESULT,SaveCompleted,  IStorage32*,pStgNew) \
 		ICOM_METHOD (HRESULT,HandsOffStorage)
-ICOM_END(IPersistStorage)
+#define IPersistStorage_IMETHODS \
+    IPersist_IMETHODS \
+    IPersistStorage_METHODS
+ICOM_DEFINE(IPersistStorage,IPersist)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IPersistStorage_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IPersistStorage_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IPersistStorage_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IPersistStorage_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IPersistStorage_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IPersistStorage_Release(p)            ICOM_CALL (Release,p)
 /*** IPersist methods ***/
-#define IPersistStorage_GetClassID(p,a)    ICOM_ICALL1(IPersist,GetClassID,p,a)
-/*** IPersistFile methods ***/
+#define IPersistStorage_GetClassID(p,a) ICOM_CALL1(GetClassID,p,a)
+/*** IPersistStorage methods ***/
 #define IPersistStorage_IsDirty(p)         ICOM_CALL (IsDirty,p)
 #define IPersistStorage_InitNew(p,a)			 ICOM_CALL1(InitNew,p,a)
 #define IPersistStorage_Load(p,a)          ICOM_CALL1(Load,p,a)
@@ -261,56 +356,94 @@ ICOM_END(IPersistStorage)
  * IPersistStream interface
  */
 #define ICOM_INTERFACE IPersistStream
-ICOM_BEGIN(IPersistStream,IPersist);
-          ICOM_METHOD(HRESULT, IsDirty);
-          ICOM_METHOD1(HRESULT, Load, IStream32*, pStm);
-          ICOM_METHOD2(HRESULT, Save, IStream32*, pStm, BOOL32, fClearDirty);
-          ICOM_METHOD1(HRESULT, GetSizeMax, ULARGE_INTEGER*, pcbSize);
-ICOM_END(IPersistStream)
+#define IPersistStream_METHODS \
+    ICOM_METHOD (HRESULT,IsDirty) \
+    ICOM_METHOD1(HRESULT,Load,       IStream32*,pStm) \
+    ICOM_METHOD2(HRESULT,Save,       IStream32*,pStm, BOOL32,fClearDirty) \
+    ICOM_METHOD1(HRESULT,GetSizeMax, ULARGE_INTEGER*,pcbSize)
+#define IPersistStream_IMETHODS \
+    IPersist_IMETHODS \
+    IPersistStream_METHODS
+ICOM_DEFINE(IPersistStream,IPersist)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IPersistStream_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IPersistStream_AddRef(p)             ICOM_ICALL(IUnknown,AddRef,p)
-#define IPersistStream_Release(p)            ICOM_ICALL(IUnknown,Release,p)
+#define IPersistStream_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IPersistStream_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IPersistStream_Release(p)            ICOM_CALL (Release,p)
 /*** IPersist methods ***/
-#define IPersistStream_GetClassID(p,a)       ICOM_ICALL1(IPersist,GetClassID,p,a)
-/*** IPersistStream ***/
-#define IPersist_Stream_IsDirty(p)       ICOM_CALL(IsDirty,p)
-#define IPersist_Stream_Load(p,a)        ICOM_CALL1(Load,p,a)
-#define IPersist_Stream_Save(p,a,b)      ICOM_CALL2(Save,p,a,b)
-#define IPersist_Stream_GetSizeMax(p,a)  ICOM_CALL(GetSizeMax,p)
+#define IPersistStream_GetClassID(p,a) ICOM_CALL1(GetClassID,p,a)
+/*** IPersistStream methods ***/
+#define IPersistStream_IsDirty(p)      ICOM_CALL (IsDirty,p)
+#define IPersistStream_Load(p,a)       ICOM_CALL1(Load,p,a)
+#define IPersistStream_Save(p,a,b)     ICOM_CALL2(Save,p,a,b)
+#define IPersistStream_GetSizeMax(p,a) ICOM_CALL1(GetSizeMax,p,a)
 #endif
 
 
 /*****************************************************************************
  * IProgressNotify interface
  */
-/* FIXME: not implemented */
+#define ICOM_INTERFACE IProgressNotify
+#define IProgressNotify_METHODS \
+    ICOM_METHOD4(HRESULT,OnProgress, DWORD,dwProgressCurrent, DWORD,dwProgressMaximum, BOOL32,fAccurate, BOOL32,fOwner)
+#define IProgressNotify_IMETHODS \
+    IUnknown_IMETHODS \
+    IProgressNotify_METHODS
+ICOM_DEFINE(IProgressNotify,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define IProgressNotify_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IProgressNotify_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IProgressNotify_Release(p)            ICOM_CALL (Release,p)
+/*** IProgressNotify methods ***/
+#define IProgressNotify_OnProgress(p,a,b,c,d) ICOM_CALL4(OnProgress,p,a,b,c,d)
+#endif
 
 
 /*****************************************************************************
  * IRootStorage interface
  */
-/* FIXME: not implemented */
+#define ICOM_INTERFACE IRootStorage
+#define IRootStorage_METHODS \
+    ICOM_METHOD1(HRESULT,SwitchToFile, LPOLESTR32,pszFile)
+#define IRootStorage_IMETHODS \
+    IUnknown_IMETHODS \
+    IRootStorage_METHODS
+ICOM_DEFINE(IRootStorage,IUnknown)
+#undef ICOM_INTERFACE
+
+#ifdef ICOM_CINTERFACE
+/*** IUnknown methods ***/
+#define IRootStorage_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IRootStorage_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IRootStorage_Release(p)            ICOM_CALL (Release,p)
+/*** IRootStorage methods ***/
+#define IRootStorage_SwitchToFile(p,a) ICOM_CALLSwitchToFile(,p,a)
+#endif
 
 
 /*****************************************************************************
  * ISequentialStream interface
  */
 #define ICOM_INTERFACE ISequentialStream
-ICOM_BEGIN(ISequentialStream,IUnknown)
-    ICOM_METHOD3(HRESULT,Read,        void*,pv, ULONG,cb, ULONG*,pcbRead);
-    ICOM_METHOD3(HRESULT,Write,       const void*,pv, ULONG,cb, ULONG*,pcbWritten);
-ICOM_END(ISequentialStream)
+#define ISequentialStream_METHODS \
+    ICOM_METHOD3(HRESULT,Read,  void*,pv, ULONG,cb, ULONG*,pcbRead) \
+    ICOM_METHOD3(HRESULT,Write, const void*,pv, ULONG,cb, ULONG*,pcbWritten)
+#define ISequentialStream_IMETHODS \
+    IUnknown_IMETHODS \
+    ISequentialStream_METHODS
+ICOM_DEFINE(ISequentialStream,IUnknown)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define ISequentialStream_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define ISequentialStream_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define ISequentialStream_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define ISequentialStream_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define ISequentialStream_AddRef(p)             ICOM_CALL (AddRef,p)
+#define ISequentialStream_Release(p)            ICOM_CALL (Release,p)
 /*** ISequentialStream methods ***/
 #define ISequentialStream_Read(p,a,b,c)  ICOM_CALL3(Read,p,a,b,c)
 #define ISequentialStream_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c)
@@ -321,30 +454,33 @@ ICOM_END(ISequentialStream)
  * IStorage interface
  */
 #define ICOM_INTERFACE IStorage16
-ICOM_BEGIN(IStorage16,IUnknown)
-    ICOM_METHOD5(HRESULT,CreateStream,   LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream16**,ppstm)
-    ICOM_METHOD5(HRESULT,OpenStream,     LPCOLESTR16,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream16**,ppstm)
-    ICOM_METHOD5(HRESULT,CreateStorage,  LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage16**,ppstg)
-    ICOM_METHOD6(HRESULT,OpenStorage,    LPCOLESTR16,pwcsName, IStorage16*,pstgPriority, DWORD,grfMode, SNB16,snb16Exclude, DWORD,reserved, IStorage16**,ppstg)
-    ICOM_METHOD4(HRESULT,CopyTo,         DWORD,ciidExclude, const IID*,rgiidExclude, SNB16,snb16Exclude, IStorage16*,pstgDest)
-    ICOM_METHOD4(HRESULT,MoveElementTo,  LPCOLESTR16,pwcsName, IStorage16*,pstgDest, LPCOLESTR16,pwcsNewName, DWORD,grfFlags)
-    ICOM_METHOD1(HRESULT,Commit,         DWORD,grfCommitFlags)
-    ICOM_METHOD (HRESULT,Revert)
-    ICOM_METHOD4(HRESULT,EnumElements,   DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum)
-    ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR16,pwcsName)
-    ICOM_METHOD2(HRESULT,RenameElement,  LPCOLESTR16,pwcsOldName, LPCOLESTR16,pwcsNewName)
-    ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR16,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime)
-    ICOM_METHOD1(HRESULT,SetClass,       REFCLSID,clsid)
-    ICOM_METHOD2(HRESULT,SetStateBits,   DWORD,grfStateBits, DWORD,grfMask)
+#define IStorage16_METHODS \
+    ICOM_METHOD5(HRESULT,CreateStream,   LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream16**,ppstm) \
+    ICOM_METHOD5(HRESULT,OpenStream,     LPCOLESTR16,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream16**,ppstm) \
+    ICOM_METHOD5(HRESULT,CreateStorage,  LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage16**,ppstg) \
+    ICOM_METHOD6(HRESULT,OpenStorage,    LPCOLESTR16,pwcsName, IStorage16*,pstgPriority, DWORD,grfMode, SNB16,snb16Exclude, DWORD,reserved, IStorage16**,ppstg) \
+    ICOM_METHOD4(HRESULT,CopyTo,         DWORD,ciidExclude, const IID*,rgiidExclude, SNB16,snb16Exclude, IStorage16*,pstgDest) \
+    ICOM_METHOD4(HRESULT,MoveElementTo,  LPCOLESTR16,pwcsName, IStorage16*,pstgDest, LPCOLESTR16,pwcsNewName, DWORD,grfFlags) \
+    ICOM_METHOD1(HRESULT,Commit,         DWORD,grfCommitFlags) \
+    ICOM_METHOD (HRESULT,Revert) \
+    ICOM_METHOD4(HRESULT,EnumElements,   DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum) \
+    ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR16,pwcsName) \
+    ICOM_METHOD2(HRESULT,RenameElement,  LPCOLESTR16,pwcsOldName, LPCOLESTR16,pwcsNewName) \
+    ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR16,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime) \
+    ICOM_METHOD1(HRESULT,SetClass,       REFCLSID,clsid) \
+    ICOM_METHOD2(HRESULT,SetStateBits,   DWORD,grfStateBits, DWORD,grfMask) \
     ICOM_METHOD2(HRESULT,Stat,           STATSTG*,pstatstg, DWORD,grfStatFlag)
-ICOM_END(IStorage16)
+#define IStorage16_IMETHODS \
+    IUnknown_IMETHODS \
+    IStorage16_METHODS
+ICOM_DEFINE(IStorage16,IUnknown)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IStorage16_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IStorage16_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IStorage16_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IStorage16_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IStorage16_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IStorage16_Release(p)            ICOM_CALL (Release,p)
 /*** IStorage16 methods ***/
 #define IStorage16_CreateStream(p,a,b,c,d,e)  ICOM_CALL5(CreateStream,p,a,b,c,d,e)
 #define IStorage16_OpenStream(p,a,b,c,d,e)    ICOM_CALL5(OpenStream,p,a,b,c,d,e)
@@ -365,30 +501,33 @@ ICOM_END(IStorage16)
 
 
 #define ICOM_INTERFACE IStorage32
-ICOM_BEGIN(IStorage32,IUnknown)
-    ICOM_METHOD5(HRESULT,CreateStream,   LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream32**,ppstm);
-    ICOM_METHOD5(HRESULT,OpenStream,     LPCOLESTR32,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream32**,ppstm);
-    ICOM_METHOD5(HRESULT,CreateStorage,  LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage32**,ppstg);
-    ICOM_METHOD6(HRESULT,OpenStorage,    LPCOLESTR32,pwcsName, IStorage32*,pstgPriority, DWORD,grfMode, SNB32,snb16Exclude, DWORD,reserved, IStorage32**,ppstg);
-    ICOM_METHOD4(HRESULT,CopyTo,         DWORD,ciidExclude, const IID*,rgiidExclude, SNB32,snb16Exclude, IStorage32*,pstgDest);
-    ICOM_METHOD4(HRESULT,MoveElementTo,  LPCOLESTR32,pwcsName, IStorage32*,pstgDest, LPCOLESTR32,pwcsNewName, DWORD,grfFlags);
-    ICOM_METHOD1(HRESULT,Commit,         DWORD,grfCommitFlags);
-    ICOM_METHOD (HRESULT,Revert);
-    ICOM_METHOD4(HRESULT,EnumElements,   DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum);
-    ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR32,pwcsName);
-    ICOM_METHOD2(HRESULT,RenameElement,  LPCOLESTR32,pwcsOldName, LPCOLESTR32,pwcsNewName);
-    ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR32,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime);
-    ICOM_METHOD1(HRESULT,SetClass,       REFCLSID,clsid);
-    ICOM_METHOD2(HRESULT,SetStateBits,   DWORD,grfStateBits, DWORD,grfMask);
-    ICOM_METHOD2(HRESULT,Stat,           STATSTG*,pstatstg, DWORD,grfStatFlag);
-ICOM_END(IStorage32)
+#define IStorage32_METHODS \
+    ICOM_METHOD5(HRESULT,CreateStream,   LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream32**,ppstm) \
+    ICOM_METHOD5(HRESULT,OpenStream,     LPCOLESTR32,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream32**,ppstm) \
+    ICOM_METHOD5(HRESULT,CreateStorage,  LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage32**,ppstg) \
+    ICOM_METHOD6(HRESULT,OpenStorage,    LPCOLESTR32,pwcsName, IStorage32*,pstgPriority, DWORD,grfMode, SNB32,snb16Exclude, DWORD,reserved, IStorage32**,ppstg) \
+    ICOM_METHOD4(HRESULT,CopyTo,         DWORD,ciidExclude, const IID*,rgiidExclude, SNB32,snb16Exclude, IStorage32*,pstgDest) \
+    ICOM_METHOD4(HRESULT,MoveElementTo,  LPCOLESTR32,pwcsName, IStorage32*,pstgDest, LPCOLESTR32,pwcsNewName, DWORD,grfFlags) \
+    ICOM_METHOD1(HRESULT,Commit,         DWORD,grfCommitFlags) \
+    ICOM_METHOD (HRESULT,Revert) \
+    ICOM_METHOD4(HRESULT,EnumElements,   DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum) \
+    ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR32,pwcsName) \
+    ICOM_METHOD2(HRESULT,RenameElement,  LPCOLESTR32,pwcsOldName, LPCOLESTR32,pwcsNewName) \
+    ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR32,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime) \
+    ICOM_METHOD1(HRESULT,SetClass,       REFCLSID,clsid) \
+    ICOM_METHOD2(HRESULT,SetStateBits,   DWORD,grfStateBits, DWORD,grfMask) \
+    ICOM_METHOD2(HRESULT,Stat,           STATSTG*,pstatstg, DWORD,grfStatFlag)
+#define IStorage32_IMETHODS \
+    IUnknown_IMETHODS \
+    IStorage32_METHODS
+ICOM_DEFINE(IStorage32,IUnknown)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IStorage32_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IStorage32_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IStorage32_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IStorage32_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IStorage32_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IStorage32_Release(p)            ICOM_CALL (Release,p)
 /*** IStorage32 methods ***/
 #define IStorage32_CreateStream(p,a,b,c,d,e)  ICOM_CALL5(CreateStream,p,a,b,c,d,e)
 #define IStorage32_OpenStream(p,a,b,c,d,e)    ICOM_CALL5(OpenStream,p,a,b,c,d,e)
@@ -409,9 +548,9 @@ ICOM_END(IStorage32)
 #ifndef __WINE__
 /* Duplicated for WINELIB */
 /*** IUnknown methods ***/
-#define IStorage_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IStorage_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IStorage_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IStorage_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IStorage_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IStorage_Release(p)            ICOM_CALL (Release,p)
 /*** IStorage methods ***/
 #define IStorage_CreateStream(p,a,b,c,d,e)  ICOM_CALL5(CreateStream,p,a,b,c,d,e)
 #define IStorage_OpenStream(p,a,b,c,d,e)    ICOM_CALL5(OpenStream,p,a,b,c,d,e)
@@ -436,27 +575,30 @@ ICOM_END(IStorage32)
  * IStream interface
  */
 #define ICOM_INTERFACE IStream16
-ICOM_BEGIN(IStream16,ISequentialStream)
-    ICOM_METHOD3(HRESULT,Seek,        LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition); 
-    ICOM_METHOD1(HRESULT,SetSize,     ULARGE_INTEGER,libNewSize);
-    ICOM_METHOD4(HRESULT,CopyTo,      IStream16*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten);
-    ICOM_METHOD1(HRESULT,Commit,      DWORD,grfCommitFlags);
-    ICOM_METHOD (HRESULT,Revert);
-    ICOM_METHOD3(HRESULT,LockRegion,  ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType);
-    ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType);
-    ICOM_METHOD2(HRESULT,Stat,        STATSTG*,pstatstg, DWORD,grfStatFlag);
-    ICOM_METHOD1(HRESULT,Clone,       IStream16**,ppstm);
-ICOM_END(IStream16)
+#define IStream16_METHODS \
+    ICOM_METHOD3(HRESULT,Seek,        LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition) \
+    ICOM_METHOD1(HRESULT,SetSize,     ULARGE_INTEGER,libNewSize) \
+    ICOM_METHOD4(HRESULT,CopyTo,      IStream16*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten) \
+    ICOM_METHOD1(HRESULT,Commit,      DWORD,grfCommitFlags) \
+    ICOM_METHOD (HRESULT,Revert) \
+    ICOM_METHOD3(HRESULT,LockRegion,  ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) \
+    ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) \
+    ICOM_METHOD2(HRESULT,Stat,        STATSTG*,pstatstg, DWORD,grfStatFlag) \
+    ICOM_METHOD1(HRESULT,Clone,       IStream16**,ppstm)
+#define IStream16_IMETHODS \
+    ISequentialStream_IMETHODS \
+    IStream16_METHODS
+ICOM_DEFINE(IStream16,ISequentialStream)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IStream16_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IStream16_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IStream16_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IStream16_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IStream16_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IStream16_Release(p)            ICOM_CALL (Release,p)
 /*** ISequentialStream methods ***/
-#define IStream16_Read(p,a,b,c)  ICOM_ICALL3(ISequentialStream,Read,p,a,b,c)
-#define IStream16_Write(p,a,b,c) ICOM_ICALL3(ISequentialStream,Write,p,a,b,c)
+#define IStream16_Read(p,a,b,c)  ICOM_CALL3(Read,p,a,b,c)
+#define IStream16_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c)
 /*** IStream16 methods ***/
 #define IStream16_Seek(p)               ICOM_CALL3(Seek,p)
 #define IStream16_SetSize(p,a,b)        ICOM_CALL1(SetSize,p,a,b)
@@ -471,27 +613,30 @@ ICOM_END(IStream16)
 
 
 #define ICOM_INTERFACE IStream32
-ICOM_BEGIN(IStream32,ISequentialStream)
-    ICOM_METHOD3(HRESULT,Seek,        LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition); 
-    ICOM_METHOD1(HRESULT,SetSize,     ULARGE_INTEGER,libNewSize);
-    ICOM_METHOD4(HRESULT,CopyTo,      IStream32*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten);
-    ICOM_METHOD1(HRESULT,Commit,      DWORD,grfCommitFlags);
-    ICOM_METHOD (HRESULT,Revert);
-    ICOM_METHOD3(HRESULT,LockRegion,  ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType);
-    ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType);
-    ICOM_METHOD2(HRESULT,Stat,        STATSTG*,pstatstg, DWORD,grfStatFlag);
-    ICOM_METHOD1(HRESULT,Clone,       IStream32**,ppstm);
-ICOM_END(IStream32)
+#define IStream32_METHODS \
+    ICOM_METHOD3(HRESULT,Seek,        LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition) \
+    ICOM_METHOD1(HRESULT,SetSize,     ULARGE_INTEGER,libNewSize) \
+    ICOM_METHOD4(HRESULT,CopyTo,      IStream32*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten) \
+    ICOM_METHOD1(HRESULT,Commit,      DWORD,grfCommitFlags) \
+    ICOM_METHOD (HRESULT,Revert) \
+    ICOM_METHOD3(HRESULT,LockRegion,  ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) \
+    ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) \
+    ICOM_METHOD2(HRESULT,Stat,        STATSTG*,pstatstg, DWORD,grfStatFlag) \
+    ICOM_METHOD1(HRESULT,Clone,       IStream32**,ppstm)
+#define IStream32_IMETHODS \
+    ISequentialStream_IMETHODS \
+    IStream32_METHODS
+ICOM_DEFINE(IStream32,ISequentialStream)
 #undef ICOM_INTERFACE
 
-#if !defined(__cplusplus) || defined(CINTERFACE)
+#ifdef ICOM_CINTERFACE
 /*** IUnknown methods ***/
-#define IStream32_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IStream32_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IStream32_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IStream32_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IStream32_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IStream32_Release(p)            ICOM_CALL (Release,p)
 /*** ISequentialStream methods ***/
-#define IStream32_Read(p,a,b,c)  ICOM_ICALL3(ISequentialStream,Read,p,a,b,c)
-#define IStream32_Write(p,a,b,c) ICOM_ICALL3(ISequentialStream,Write,p,a,b,c)
+#define IStream32_Read(p,a,b,c)  ICOM_CALL3(Read,p,a,b,c)
+#define IStream32_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c)
 /*** IStream32 methods ***/
 #define IStream32_Seek(p,a,b,c)         ICOM_CALL3(Seek,p,a,b,c)
 #define IStream32_SetSize(p,a)          ICOM_CALL1(SetSize,p,a)
@@ -506,12 +651,12 @@ ICOM_END(IStream32)
 #ifndef __WINE__
 /* Duplicated for WINELIB */
 /*** IUnknown methods ***/
-#define IStream_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
-#define IStream_AddRef(p)             ICOM_ICALL (IUnknown,AddRef,p)
-#define IStream_Release(p)            ICOM_ICALL (IUnknown,Release,p)
+#define IStream_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IStream_AddRef(p)             ICOM_CALL (AddRef,p)
+#define IStream_Release(p)            ICOM_CALL (Release,p)
 /*** ISequentialStream methods ***/
-#define IStream_Read(p,a,b,c)  ICOM_ICALL3(ISequentialStream,Read,p,a,b,c)
-#define IStream_Write(p,a,b,c) ICOM_ICALL3(ISequentialStream,Write,p,a,b,c)
+#define IStream_Read(p,a,b,c)  ICOM_CALL3(Read,p,a,b,c)
+#define IStream_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c)
 /*** IStream methods ***/
 #define IStream_Seek(p,a,b,c)         ICOM_CALL3(Seek,p,a,b,c)
 #define IStream_SetSize(p,a)          ICOM_CALL1(SetSize,p,a)
@@ -545,4 +690,16 @@ HRESULT WINAPI StgOpenStorage32(const OLECHAR32* pwcsName,IStorage32* pstgPriori
 HRESULT WINAPI WriteClassStg32(IStorage32* pStg, REFCLSID rclsid);
 #define WriteClassStg WINELIB_NAME(WriteClassStg)
 
+
+/*****************************************************************************
+ * Other storage API
+ */
+
+/* FIXME: not implemented */
+BOOL32 WINAPI CoDosDateTimeToFileTime(WORD nDosDate, WORD nDosTime, FILETIME* lpFileTime);
+
+/* FIXME: not implemented */
+BOOL32 WINAPI CoFileTimeToDosDateTime(FILETIME* lpFileTime, WORD* lpDosDate, WORD* lpDosTime);
+
+
 #endif /* __WINE_WINE_OBJ_STORAGE_H */
diff --git a/ole/storage.c b/ole/storage.c
index 2fd87dd64b117a1abeb1b7c5f2f64f06d7bd26b1..ce177ed355819e3b578816c5a14a105a1669b221 100644
--- a/ole/storage.c
+++ b/ole/storage.c
@@ -681,7 +681,7 @@ typedef struct
  *		IStream16_QueryInterface	[STORAGE.518]
  */
 HRESULT WINAPI IStream16_fnQueryInterface(
-	LPUNKNOWN iface,REFIID refiid,LPVOID *obj
+	IStream16* iface,REFIID refiid,LPVOID *obj
 ) {
 	ICOM_THIS(IStream16Impl,iface);
 	char    xrefiid[50];
@@ -698,7 +698,7 @@ HRESULT WINAPI IStream16_fnQueryInterface(
 /******************************************************************************
  * IStream16_AddRef [STORAGE.519]
  */
-ULONG WINAPI IStream16_fnAddRef(LPUNKNOWN iface) {
+ULONG WINAPI IStream16_fnAddRef(IStream16* iface) {
 	ICOM_THIS(IStream16Impl,iface);
 	return ++(This->ref);
 }
@@ -706,7 +706,7 @@ ULONG WINAPI IStream16_fnAddRef(LPUNKNOWN iface) {
 /******************************************************************************
  * IStream16_Release [STORAGE.520]
  */
-ULONG WINAPI IStream16_fnRelease(LPUNKNOWN iface) {
+ULONG WINAPI IStream16_fnRelease(IStream16* iface) {
 	ICOM_THIS(IStream16Impl,iface);
 	FlushFileBuffers(This->hf);
 	This->ref--;
@@ -769,7 +769,7 @@ HRESULT WINAPI IStream16_fnSeek(
  *		IStream16_Read	[STORAGE.521]
  */
 HRESULT WINAPI IStream16_fnRead(
-        LPSEQUENTIALSTREAM iface,void  *pv,ULONG cb,ULONG  *pcbRead
+        IStream16* iface,void  *pv,ULONG cb,ULONG  *pcbRead
 ) {
 	ICOM_THIS(IStream16Impl,iface);
 	BYTE	block[BIGSIZE];
@@ -830,7 +830,7 @@ HRESULT WINAPI IStream16_fnRead(
  *		IStream16_Write	[STORAGE.522]
  */
 HRESULT WINAPI IStream16_fnWrite(
-        LPSEQUENTIALSTREAM iface,const void *pv,ULONG cb,ULONG *pcbWrite
+        IStream16* iface,const void *pv,ULONG cb,ULONG *pcbWrite
 ) {
 	ICOM_THIS(IStream16Impl,iface);
 	BYTE	block[BIGSIZE];
@@ -1094,20 +1094,16 @@ HRESULT WINAPI IStream16_fnWrite(
 static void _create_istream16(LPSTREAM16 *str) {
 	IStream16Impl*	lpst;
 
-	if (!strvt16.bvt.bvt.fnQueryInterface) {
+	if (!strvt16.fnQueryInterface) {
 		HMODULE16	wp = GetModuleHandle16("STORAGE");
 		if (wp>=32) {
-		  /* FIXME: what is this WIN32_GetProcAddress16. Should the name be IStream16_QueryInterface of IStream16_fnQueryInterface */
-#define VTENT(xfn)  strvt16.bvt.bvt.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStream16_"#xfn);assert(strvt16.bvt.bvt.fn##xfn)
+		  /* FIXME: what is This WIN32_GetProcAddress16. Should the name be IStream16_QueryInterface of IStream16_fnQueryInterface */
+#define VTENT(xfn)  strvt16.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStream16_"#xfn);assert(strvt16.fn##xfn)
 			VTENT(QueryInterface);
 			VTENT(AddRef);
 			VTENT(Release);
-#undef VTENT
-#define VTENT(xfn)  strvt16.bvt.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStream16_"#xfn);assert(strvt16.bvt.fn##xfn)
 			VTENT(Read);
 			VTENT(Write);
-#undef VTENT
-#define VTENT(xfn)  strvt16.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStream16_"#xfn);assert(strvt16.fn##xfn)
 			VTENT(Seek);
 			VTENT(SetSize);
 			VTENT(CopyTo);
@@ -1122,16 +1118,12 @@ static void _create_istream16(LPSTREAM16 *str) {
 			memcpy(segstrvt16,&strvt16,sizeof(strvt16));
 			segstrvt16 = (ICOM_VTABLE(IStream16)*)SEGPTR_GET(segstrvt16);
 		} else {
-#define VTENT(xfn) strvt16.bvt.bvt.fn##xfn = IStream16_fn##xfn;
+#define VTENT(xfn) strvt16.fn##xfn = IStream16_fn##xfn;
 			VTENT(QueryInterface);
 			VTENT(AddRef);
 			VTENT(Release);
-#undef VTENT
-#define VTENT(xfn) strvt16.bvt.fn##xfn = IStream16_fn##xfn;
 			VTENT(Read);
 			VTENT(Write);
-#undef VTENT
-#define VTENT(xfn) strvt16.fn##xfn = IStream16_fn##xfn;
 			VTENT(Seek);
 	/*
 			VTENT(CopyTo);
@@ -1173,7 +1165,7 @@ typedef struct
  *		IStream32_QueryInterface	[VTABLE]
  */
 HRESULT WINAPI IStream32_fnQueryInterface(
-	LPUNKNOWN iface,REFIID refiid,LPVOID *obj
+	IStream32* iface,REFIID refiid,LPVOID *obj
 ) {
 	ICOM_THIS(IStream32Impl,iface);
 	char    xrefiid[50];
@@ -1191,7 +1183,7 @@ HRESULT WINAPI IStream32_fnQueryInterface(
 /******************************************************************************
  * IStream32_AddRef [VTABLE]
  */
-ULONG WINAPI IStream32_fnAddRef(LPUNKNOWN iface) {
+ULONG WINAPI IStream32_fnAddRef(IStream32* iface) {
 	ICOM_THIS(IStream32Impl,iface);
 	return ++(This->ref);
 }
@@ -1199,7 +1191,7 @@ ULONG WINAPI IStream32_fnAddRef(LPUNKNOWN iface) {
 /******************************************************************************
  * IStream32_Release [VTABLE]
  */
-ULONG WINAPI IStream32_fnRelease(LPUNKNOWN iface) {
+ULONG WINAPI IStream32_fnRelease(IStream32* iface) {
 	ICOM_THIS(IStream32Impl,iface);
 	FlushFileBuffers(This->hf);
 	This->ref--;
@@ -1229,7 +1221,7 @@ typedef struct
  *		IStorage16_QueryInterface	[STORAGE.500]
  */
 HRESULT WINAPI IStorage16_fnQueryInterface(
-	LPUNKNOWN iface,REFIID refiid,LPVOID *obj
+	IStorage16* iface,REFIID refiid,LPVOID *obj
 ) {
 	ICOM_THIS(IStorage16Impl,iface);
 	char    xrefiid[50];
@@ -1247,7 +1239,7 @@ HRESULT WINAPI IStorage16_fnQueryInterface(
 /******************************************************************************
  * IStorage16_AddRef [STORAGE.501]
  */
-ULONG WINAPI IStorage16_fnAddRef(LPUNKNOWN iface) {
+ULONG WINAPI IStorage16_fnAddRef(IStorage16* iface) {
 	ICOM_THIS(IStorage16Impl,iface);
 	return ++(This->ref);
 }
@@ -1255,7 +1247,7 @@ ULONG WINAPI IStorage16_fnAddRef(LPUNKNOWN iface) {
 /******************************************************************************
  * IStorage16_Release [STORAGE.502]
  */
-ULONG WINAPI IStorage16_fnRelease(LPUNKNOWN iface) {
+ULONG WINAPI IStorage16_fnRelease(IStorage16* iface) {
 	ICOM_THIS(IStorage16Impl,iface);
 	This->ref--;
 	if (This->ref)
@@ -1455,12 +1447,12 @@ HRESULT WINAPI IStorage16_fnOpenStorage(
 	lstrcpyAtoW(name,pwcsName);
 	newpps = STORAGE_look_for_named_pps(lpstg->hf,This->stde.pps_dir,name);
 	if (newpps==-1) {
-		IStream16_fnRelease((IUnknown*)lpstg);
+		IStream16_fnRelease((IStream16*)lpstg);
 		return E_FAIL;
 	}
 
 	if (1!=STORAGE_get_pps_entry(lpstg->hf,newpps,&(lpstg->stde))) {
-		IStream16_fnRelease((IUnknown*)lpstg);
+		IStream16_fnRelease((IStream16*)lpstg);
 		return E_FAIL;
 	}
 	lpstg->ppsent		= newpps;
@@ -1490,12 +1482,12 @@ HRESULT WINAPI IStorage16_fnOpenStream(
 	lstrcpyAtoW(name,pwcsName);
 	newpps = STORAGE_look_for_named_pps(lpstr->hf,This->stde.pps_dir,name);
 	if (newpps==-1) {
-		IStream16_fnRelease((IUnknown*)lpstr);
+		IStream16_fnRelease((IStream16*)lpstr);
 		return E_FAIL;
 	}
 
 	if (1!=STORAGE_get_pps_entry(lpstr->hf,newpps,&(lpstr->stde))) {
-		IStream16_fnRelease((IUnknown*)lpstr);
+		IStream16_fnRelease((IStream16*)lpstr);
 		return E_FAIL;
 	}
 	lpstr->offset.LowPart	= 0;
@@ -1510,15 +1502,13 @@ HRESULT WINAPI IStorage16_fnOpenStream(
 static void _create_istorage16(LPSTORAGE16 *stg) {
 	IStorage16Impl*	lpst;
 
-	if (!stvt16.bvt.fnQueryInterface) {
+	if (!stvt16.fnQueryInterface) {
 		HMODULE16	wp = GetModuleHandle16("STORAGE");
 		if (wp>=32) {
-#define VTENT(xfn)  stvt16.bvt.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStorage16_"#xfn);
+#define VTENT(xfn)  stvt16.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStorage16_"#xfn);
 			VTENT(QueryInterface)
 			VTENT(AddRef)
 			VTENT(Release)
-#undef VTENT
-#define VTENT(xfn)  stvt16.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStorage16_"#xfn);
 			VTENT(CreateStream)
 			VTENT(OpenStream)
 			VTENT(CreateStorage)
@@ -1539,12 +1529,10 @@ static void _create_istorage16(LPSTORAGE16 *stg) {
 			memcpy(segstvt16,&stvt16,sizeof(stvt16));
 			segstvt16 = (ICOM_VTABLE(IStorage16)*)SEGPTR_GET(segstvt16);
 		} else {
-#define VTENT(xfn) stvt16.bvt.fn##xfn = IStorage16_fn##xfn;
+#define VTENT(xfn) stvt16.fn##xfn = IStorage16_fn##xfn;
 			VTENT(QueryInterface)
 			VTENT(AddRef)
 			VTENT(Release)
-#undef VTENT
-#define VTENT(xfn) stvt16.fn##xfn = IStorage16_fn##xfn;
 			VTENT(CreateStream)
 			VTENT(OpenStream)
 			VTENT(CreateStorage)
@@ -1615,7 +1603,7 @@ HRESULT WINAPI StgCreateDocFile16(
 		i++;
 	}
 	if (ret!=1) {
-		IStorage16_fnRelease((IUnknown*)lpstg); /* will remove it */
+		IStorage16_fnRelease((IStorage16*)lpstg); /* will remove it */
 		return E_FAIL;
 	}
 
@@ -1707,7 +1695,7 @@ HRESULT WINAPI StgOpenStorage16(
 		i++;
 	}
 	if (ret!=1) {
-		IStorage16_fnRelease((IUnknown*)lpstg); /* will remove it */
+		IStorage16_fnRelease((IStorage16*)lpstg); /* will remove it */
 		return E_FAIL;
 	}
 	return S_OK;