/*
 *  objidl.h    Definition of basic COM interfaces
 *
 * =========================================================================
 *
 *                          Open Watcom Project
 *
 * Copyright (c) 2004-2010 The Open Watcom Contributors. All Rights Reserved.
 *
 *    This file is automatically generated. Do not edit directly.
 *
 * =========================================================================
 */

#include <rpc.h>
#include <rpcndr.h>
#ifndef COM_NO_WINDOWS_H
    #include <windows.h>
    #include <ole2.h>
#endif

#ifndef __objidl_h__
#define __objidl_h__

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file;
#endif

#include <unknwn.h>
#include <wtypes.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Forward declarations */
typedef interface IAdviseSink           IAdviseSink;
typedef interface IAsyncManager         IAsyncManager;
typedef interface IEnumString           IEnumString;
typedef interface IMoniker              IMoniker;
typedef interface IRunningObjectTable   IRunningObjectTable;
typedef interface IStorage              IStorage;
typedef interface IStream               IStream;
typedef interface ISynchronize          ISynchronize;

/* String name block */
typedef LPOLESTR    *SNB;

/* Pointer to clipboard format */
typedef CLIPFORMAT  *LPCLIPFORMAT;

/* RPC OLE data representation */
typedef unsigned long   RPCOLEDATAREP;

/* Apartment identifier data type */
typedef DWORD   APARTMENTID;

/* OLE authentication defaults */
#if (_WIN32_WINNT >= 0x0400)
    #define COLE_DEFAULT_PRINCIPAL  ((OLECHAR *)-1)
    #define COLE_DEFAULT_AUTHINFO   ((void *)-1)
#endif

/* COM server information */
typedef struct _COSERVERINFO {
    DWORD       dwReserved1;
    LPWSTR      pwszName;
    COAUTHINFO  *pAuthInfo;
    DWORD       dwReserved2;
} COSERVERINFO;

/* External connection flags */
typedef enum tagEXTCONN {
    EXTCONN_STRONG      = 0x00000001,
    EXTCONN_WEAK        = 0x00000002,
    EXTCONN_CALLABLE    = 0x00000004
} EXTCONN;

/* IMultiQI::MultipleQueryInterfaces() parameters */
typedef struct tagMULTI_QI {
    const IID   *pIID;
    IUnknown    *pItf;
    HRESULT     hr;
} MULTI_QI;

/* Bind options */
typedef struct tagBIND_OPTS {
    DWORD   cbStruct;
    DWORD   grfFlags;
    DWORD   grfMode;
    DWORD   dwTickCountDeadline;
} BIND_OPTS;
typedef BIND_OPTS   *LPBIND_OPTS;

/* Bind options (version 2) */
#ifdef __cplusplus
typedef struct tagBIND_OPTS2 : public tagBIND_OPTS {
    DWORD           dwTrackFlags;
    DWORD           dwClassContext;
    LCID            locale;
    COSERVERINFO    *pServerInfo;
} BIND_OPTS2;
#else
typedef struct tagBIND_OPTS2 {
    DWORD           cbStruct;
    DWORD           grfFlags;
    DWORD           grfMode;
    DWORD           dwTickCountDeadline;
    DWORD           dwTrackFlags;
    DWORD           dwClassContext;
    LCID            locale;
    COSERVERINFO    *pServerInfo;
} BIND_OPTS2;
#endif
typedef BIND_OPTS2  *LPBIND_OPTS2;

/* Bind options (version 3) */
#ifdef __cplusplus
typedef struct tagBIND_OPTS3 : public tagBIND_OPTS2 {
    HWND    hwnd;
} BIND_OPTS3;
#else
typedef struct tagBIND_OPTS3 {
    DWORD           cbStruct;
    DWORD           grfFlags;
    DWORD           grfMode;
    DWORD           dwTickCountDeadline;
    DWORD           dwTrackFlags;
    DWORD           dwClassContext;
    LCID            locale;
    COSERVERINFO    *pServerInfo;
} BIND_OPTS3;
#endif
typedef BIND_OPTS3  *LPBIND_OPTS3;

/* Bind flags */
typedef enum tagBIND_FLAGS {
    BIND_MAYBOTHERUSER      = 1,
    BIND_JUSTTEXTEXISTENCE  = 2
} BIND_FLAGS;

/* System moniker types */
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_OBJREFMONIKER     = 8,
    MKSYS_SESSIONMONIKER    = 9,
    MKSYS_LUAMONIKER        = 10
} MKSYS;

/* Moniker reductions */
typedef enum tagMKREDUCE {
    MKRREDUCE_ONE           = 3 << 16,
    MKRREDUCE_TOUSER        = 2 << 16,
    MKRREDUCE_THROUGHUSER   = 1 << 16,
    MKRREDUCE_ALL           = 0 << 16
} MKRREDUCE;

/* Static storage */
typedef struct tagSTATSTG {
    LPOLESTR        pwcsName;
    DWORD           type;
    ULARGE_INTEGER  cbSize;
    FILETIME        mtime;
    FILETIME        ctime;
    FILETIME        atime;
    DWORD           grfMode;
    DWORD           grfLocksSupported;
    CLSID           clsid;
    DWORD           grfStateBits;
    DWORD           reserved;
} STATSTG;

/* Storage types */
typedef enum tagSTGTY {
    STGTY_STORAGE   = 1,
    STGTY_STREAM    = 2,
    STGTY_LOCKBYTES = 3,
    STGTY_PROPERTY  = 4
} STGTY;

/* Stream seek values */
typedef enum tagSTREAM_SEEK {
    STREAM_SEEK_SET = 0,
    STREAM_SEEK_CUR = 1,
    STREAM_SEEK_END = 2
} STREAM_SEEK;

/* Lock types */
typedef enum tagLOCKTYPE {
    LOCK_WRITE      = 1,
    LOCK_EXCLUSIVE  = 2,
    LOCK_ONLYONCE   = 4
} LOCKTYPE;

/* Data/view target device */
typedef struct tagDVTARGETDEVICE {
    DWORD   tdSize;
    WORD    tdDriverNameOffset;
    WORD    tdDeviceNameOffset;
    WORD    tdPortNameOffset;
    WORD    tdExtDevmodeOffset;
    BYTE    tdData[1];
} DVTARGETDEVICE;

/* Data format information */
typedef struct tagFORMATETC {
    CLIPFORMAT      cfFormat;
    DVTARGETDEVICE  *ptd;
    DWORD           dwAspect;
    LONG            lindex;
    DWORD           tymed;
} FORMATETC;
typedef FORMATETC   *LPFORMATETC;

/* Advise flags */
typedef enum tagADVF {
    ADVF_NODATA             = 1,
    ADVF_PRIMEFIRST         = 2,
    ADVF_ONLYONCE           = 4,
    ADVF_DATAONSTOP         = 64,
    ADVFCACHE_NOHANDLER     = 8,
    ADVFCACHE_FORCEBUILTIN  = 16,
    ADVFCACHE_ONSAVE        = 32
} ADVF;

/* Static data */
typedef struct tagSTATDATA {
    FORMATETC   formatetc;
    DWORD       advf;
    IAdviseSink *pAdvSink;
    DWORD       dwConnection;
} STATDATA;
typedef STATDATA    *LPSTATDATA;

/* Type media */
typedef enum tagTYMED {
    TYMED_HGLOBAL   = 1,
    TYMED_FILE      = 2,
    TYMED_ISTREAM   = 4,
    TYMED_ISTORAGE  = 8,
    TYMED_GDI       = 16,
    TYMED_MFPICT    = 32,
    TYMED_ENHMF     = 64,
    TYMED_NULL      = 0
} TYMED;

/* Storage medium */
typedef struct tagSTGMEDIUM {
    DWORD       tymed;
    union {
        HBITMAP         hBitmap;
        HMETAFILEPICT   hMetaFilePict;
        HENHMETAFILE    hEnhMetaFile;
        HGLOBAL         hGlobal;
        LPOLESTR        lpszFileName;
        IStream         *pstm;
        IStorage        *pstg;
#ifdef NONAMELESSUNION
    } u;
#else
    };
#endif
    IUnknown    *pUnkForRelease;
} STGMEDIUM;
typedef STGMEDIUM   *LPSTGMEDIUM;

/* Flag storage medium */
typedef struct _FLAG_STGMEDIUM {
    long        ContextFlags;
    long        fPassOwnership;
    STGMEDIUM   Stgmed;
} FLAG_STGMEDIUM;

/* Data format direction */
typedef enum tagDATADIR {
    DATADIR_GET = 1,
    DATADIR_SET = 2
} DATADIR;

/* IMessageFilter::HandleInComingCall() call types */
typedef enum tagCALLTYPE {
    CALLTYPE_TOPLEVEL               = 1,
    CALLTYPE_NESTED                 = 2,
    CALLTYPE_ASYNC                  = 3,
    CALLTYPE_TOPLEVEL_CALLPENDING   = 4,
    CALLTYPE_ASYNC_CALLPENDING      = 5
} CALLTYPE;

/* Server call status values */
typedef enum tagSERVERCALL {
    SERVERCALL_ISHANDLED    = 0,
    SERVERCALL_REJECTED     = 1,
    SERVERCALL_RETRYLATER   = 2
} SERVERCALL;

/* Pending types */
typedef enum tagPENDINGTYPE {
    PENDINGTYPE_TOPLEVEL    = 1,
    PENDINGTYPE_NESTED      = 2
} PENDINGTYPE;

/* IMessageFilter::MessagePending() return values */
typedef enum tagPENDINGMSG {
    PENDINGMSG_CANCELCALL       = 0,
    PENDINGMSG_WAITNOPROCESS    = 1,
    PENDINGMSG_WAITDEFPROCESS   = 2
} PENDINGMSG;

/* Interface information */
typedef struct tagINTERFACEINFO {
    IUnknown    *pUnk;
    IID         iid;
    WORD        wMethod;
} INTERFACEINFO;
typedef INTERFACEINFO   *LPINTERFACEINFO;

/* RPC OLE message */
typedef struct tagRPCOLEMESSAGE {
    void            *reserved1;
    RPCOLEDATAREP   dataRepresentation;
    void            *Buffer;
    ULONG           cbBuffer;
    ULONG           iMethod;
    void            *reserved2[5];
    ULONG           rpcFlags;
} RPCOLEMESSAGE;
typedef RPCOLEMESSAGE   *PRPCOLEMESSAGE;

/* Channel hook call information */
#if (_WIN32_WINNT >= 0x0400)
typedef struct SChannelHookCallInfo {
    IID     iid;
    DWORD   cbSize;
    GUID    uCausality;
    DWORD   dwServerPid;
    DWORD   iMethod;
    void    *pObject;
} SChannelHookCallInfo;
#endif

/* OLE authentication service */
#if (_WIN32_WINNT >= 0x0400)
typedef struct tagSOLE_AUTHENTICATION_SERVICE {
    DWORD   dwAuthnSvc;
    DWORD   dwAuthzSvc;
    OLECHAR *pPrincipalName;
    HRESULT hr;
} SOLE_AUTHENTICATION_SERVICE;
typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;
#endif

/* OLE authentication capabilities */
#if (_WIN32_WINNT >= 0x0400)
typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES {
    EOAC_NONE               = 0x00000000,
    EOAC_MUTUAL_AUTH        = 0x00000001,
    EOAC_STATIC_CLOAKING    = 0x00000020,
    EOAC_DYNAMIC_CLOAKING   = 0x00000040,
    EOAC_ANY_AUTHORITY      = 0x00000080,
    EOAC_MAKE_FULLSIC       = 0x00000100,
    EOAC_DEFAULT            = 0x00000800,
    EOAC_SECURE_REFS        = 0x00000002,
    EOAC_ACCESS_CONTROL     = 0x00000004,
    EOAC_APPID              = 0x00000008,
    EOAC_DYNAMIC            = 0x00000010,
    EOAC_REQUIRE_FULLSIC    = 0x00000200,
    EOAC_AUTO_IMPERSONATE   = 0x00000400,
    EOAC_NO_CUSTOM_MARSHAL  = 0x00002000,
    EOAC_DISABLE_AAA        = 0x00001000
} EOLE_AUTHENTICATION_CAPABILITIES;
#endif

/* OLE authentication information */
#if (_WIN32_WINNT >= 0x0400)
typedef struct tagSOLE_AUTHENTICATION_INFO {
    DWORD   dwAuthnSvc;
    DWORD   dwAuthzSvc;
    void    *pAuthInfo;
} SOLE_AUTHENTICATION_INFO;
typedef SOLE_AUTHENTICATION_INFO    *PSOLE_AUTHENTICATION_INFO;
#endif

/* OLE authentication list */
#if (_WIN32_WINNT >= 0x0400)
typedef struct tagSOLE_AUTHENTICATION_LIST {
    DWORD                       cAuthInfo;
    SOLE_AUTHENTICATION_INFO    *aAuthInfo;
} SOLE_AUTHENTICATION_LIST;
typedef SOLE_AUTHENTICATION_LIST    *PSOLE_AUTHENTICATION_LIST;
#endif

/* COM binding properties */
#if (_WIN32_WINNT >= 0x0400)
typedef enum {
    COMBND_RPCTIMEOUT       = 0x00000001,
    COMBND_SERVER_LOCALITY  = 0x00000002
} RPCOPT_PROPERTIES;
#endif

/* Server locality values */
#if (_WIN32_WINNT >= 0x0400)
typedef enum {
    SERVER_LOCALITY_PROCESS_LOCAL   = 0,
    SERVER_LOCALITY_MACHINE_LOCAL   = 1,
    SERVER_LOCALITY_REMOTE          = 2
} RPCOPT_SERVER_LOCALITY_VALUES;
#endif

/* COM global properties */
#if (_WIN32_WINNT >= 0x0400)
typedef enum {
    COMGLB_EXCEPTION_HANDLING       = 1,
    COMGLB_APPID                    = 2,
    COMGLB_RPC_THREADPOOL_SETTING   = 3
} GLOBALOPT_PROPERTIES;
#endif

/* COM global exception handling values */
#if (_WIN32_WINNT >= 0x0400)
typedef enum {
    COMGLB_EXCEPTION_HANDLE             = 0,
    COMGLB_EXCEPTION_DONOT_HANDLE_FATAL = 1,
    COMGLB_EXCEPTION_DONOT_HANDLE       = COMGLB_EXCEPTION_DONOT_HANDLE_FATAL,
    COMGLB_EXCEPTION_DONOT_HANDLE_ANY   = 2
} GLOBALOPT_EH_VALUES;
#endif

/* COM global RPC thread pool values */
#if (_WIN32_WINNT >= 0x0400)
typedef enum {
    COMGLB_RPC_THREADPOOL_SETTING_DEFAULT_POOL  = 0,
    COMGLB_RPC_THREADPOOL_SETTING_PRIVATE_POOL  = 1
} GLOBALOPT_RPCTP_VALUES;
#endif

/* Storage layout */
typedef struct tagStorageLayout {
    DWORD           LayoutType;
    OLECHAR         *pwcsElementName;
    LARGE_INTEGER   cOffset;
    LARGE_INTEGER   cBytes;
} StorageLayout;

/* DCOM call states */
typedef enum tagDCOM_CALL_STATE {
    DCOM_NONE           = 0x00000000,
    DCOM_CALL_COMPLETE  = 0x00000001,
    DCOM_CALL_CANCELED  = 0x00000002
} DCOM_CALL_STATE;

/* Application types */
typedef enum tagApplicationType {
    ServerApplication   = 0,
    LibraryApplication  = 1
} ApplicationType;

/* Shutdown types */
typedef enum tagShutdownType {
    IdleShutdown    = 0,
    ForcedShutdown  = 1
} ShutdownType;

/* Apartment types */
typedef enum _APTTYPE {
    APTTYPE_CURRENT = -1,
    APTTYPE_STA     = 0,
    APTTYPE_MTA     = 1,
    APTTYPE_NA      = 2,
    APTTYPE_MAINSTA = 3
} APTTYPE;

/* Apartment type qualifiers */
typedef enum _APTTYPEQUALIFIER {
    APTTYPEQUALIFIER_NONE               = 0,
    APTTYPEQUALIFIER_IMPLICIT_MTA       = 1,
    APTTYPEQUALIFIER_NA_ON_MTA          = 2,
    APTTYPEQUALIFIER_NA_ON_STA          = 3,
    APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA = 4,
    APTTYPEQUALIFIER_NA_ON_MAINSTA      = 5
} APTTYPEQUALIFIER;

/* Thread types */
typedef enum _THDTYPE {
    THDTYPE_BLOCKMESSAGES   = 0,
    THDTYPE_PROCESSMESSAGES = 1
} THDTYPE;

/* GUIDs */
EXTERN_C const IID      IID_IMarshal;
EXTERN_C const IID      IID_IMarshal2;
EXTERN_C const IID      IID_IMalloc;
EXTERN_C const IID      IID_IMallocSpy;
EXTERN_C const IID      IID_IStdMarshalInfo;
EXTERN_C const IID      IID_IExternalConnection;
EXTERN_C const IID      IID_IMultiQI;
EXTERN_C const IID      IID_IInternalUnknown;
EXTERN_C const IID      IID_IEnumUnknown;
EXTERN_C const IID      IID_IBindCtx;
EXTERN_C const IID      IID_IEnumMoniker;
EXTERN_C const IID      IID_IRunnableObject;
EXTERN_C const IID      IID_IRunningObjectTable;
EXTERN_C const IID      IID_IPersist;
EXTERN_C const IID      IID_IPersistStream;
EXTERN_C const IID      IID_IMoniker;
EXTERN_C const IID      IID_IROTData;
EXTERN_C const IID      IID_IEnumString;
EXTERN_C const IID      IID_ISequentialStream;
EXTERN_C const IID      IID_IStream;
EXTERN_C const IID      IID_IEnumSTATSTG;
EXTERN_C const IID      IID_IStorage;
EXTERN_C const IID      IID_IPersistFile;
EXTERN_C const IID      IID_IPersistStorage;
EXTERN_C const IID      IID_ILockBytes;
EXTERN_C const IID      IID_IEnumFORMATETC;
EXTERN_C const IID      IID_IEnumSTATDATA;
EXTERN_C const IID      IID_IRootStorage;
EXTERN_C const IID      IID_IAdviseSink;
EXTERN_C const IID      IID_IAdviseSink2;
EXTERN_C const IID      IID_IDataObject;
EXTERN_C const IID      IID_IDataAdviseHolder;
EXTERN_C const IID      IID_IMessageFilter;
EXTERN_C const IID      IID_IRpcChannelBuffer;
EXTERN_C const IID      IID_IRpcChannelBuffer2;
EXTERN_C const IID      IID_IAsyncRpcChannelBuffer;
EXTERN_C const IID      IID_IRpcChannelBuffer3;
EXTERN_C const IID      IID_IRpcSyntaxNegotiate;
EXTERN_C const IID      IID_IRpcProxyBuffer;
EXTERN_C const IID      IID_IRpcStubBuffer;
EXTERN_C const IID      IID_IPSFactoryBuffer;
#if (_WIN32_WINNT >= 0x0400)
EXTERN_C const IID      IID_IChannelHook;
EXTERN_C const IID      IID_IClientSecurity;
EXTERN_C const IID      IID_IServerSecurity;
EXTERN_C const IID      IID_IClassActivator;
EXTERN_C const IID      IID_IRpcOptions;
EXTERN_C const IID      IID_IGlobalOptions;
#endif
EXTERN_C const IID      IID_IFillLockBytes;
EXTERN_C const IID      IID_IProgressNotify;
EXTERN_C const IID      IID_ILayoutStorage;
EXTERN_C const IID      IID_IBlockingLock;
EXTERN_C const IID      IID_ITimeAndNoticeControl;
EXTERN_C const IID      IID_IOplockStorage;
EXTERN_C const IID      IID_ISurrogate;
EXTERN_C const IID      IID_IGlobalInterfaceTable;
EXTERN_C const IID      IID_IDirectWriterLock;
EXTERN_C const IID      IID_ISynchronize;
EXTERN_C const IID      IID_ISynchronizeHandle;
EXTERN_C const IID      IID_ISynchronizeEvent;
EXTERN_C const IID      IID_ISynchronizeContainer;
EXTERN_C const IID      IID_ISynchronizeMutex;
EXTERN_C const IID      IID_ICancelMethodCalls;
EXTERN_C const IID      IID_IAsyncManager;
EXTERN_C const IID      IID_ICallFactory;
EXTERN_C const IID      IID_IRpcHelper;
EXTERN_C const IID      IID_IReleaseMarshalBuffers;
EXTERN_C const IID      IID_IWaitMultiple;
EXTERN_C const IID      IID_IUrlMon;
EXTERN_C const IID      IID_IForegroundTransfer;
EXTERN_C const IID      IID_IAddrTrackingControl;
EXTERN_C const IID      IID_IAddrExclusionControl;
EXTERN_C const IID      IID_IPipeByte;
EXTERN_C const IID      IID_IPipeLong;
EXTERN_C const IID      IID_IPipeDouble;
EXTERN_C const IID      IID_IThumbnailExtractor;
EXTERN_C const IID      IID_IDummyHICONIncluder;
EXTERN_C const IID      IID_IProcessLock;
EXTERN_C const IID      IID_ISurrogateService;
EXTERN_C const IID      IID_IComThreadingInfo;
EXTERN_C const IID      IID_IProcessInitControl;
#if (_WIN32_WINNT >= 0x0501)
EXTERN_C const IID      IID_IInitializeSpy;
#endif
EXTERN_C const FMTID    FMTID_SummaryInformation;
EXTERN_C const FMTID    FMTID_DocSummaryInformation;
EXTERN_C const FMTID    FMTID_UserDefinedProperties;
EXTERN_C const FMTID    FMTID_DiscardableInformation;
EXTERN_C const FMTID    FMTID_ImageSummaryInformation;
EXTERN_C const FMTID    FMTID_AudioSummaryInformation;
EXTERN_C const FMTID    FMTID_VideoSummaryInformation;
EXTERN_C const FMTID    FMTID_MediaFileSummaryInformation;
 
/* IMarshal interface */
#undef INTERFACE
#define INTERFACE   IMarshal
DECLARE_INTERFACE_( IMarshal, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IMarshal methods */
    STDMETHOD( GetUnmarshalClass )( THIS_ REFIID, void *, DWORD, void *, DWORD, CLSID * ) PURE;
    STDMETHOD( GetMarshalSizeMax )( THIS_ REFIID, void *, DWORD, void *, DWORD, DWORD * ) PURE;
    STDMETHOD( MarshalInterface )( THIS_ IStream *, REFIID, void *, DWORD, void *, DWORD ) PURE;
    STDMETHOD( UnmarshalInterface )( THIS_ IStream *, REFIID, void ** ) PURE;
    STDMETHOD( ReleaseMarshalData )( THIS_ IStream * ) PURE;
    STDMETHOD( DisconnectObject )( THIS_ DWORD ) PURE;
};
typedef IMarshal    *LPMARSHAL;

/* IMarshal2 interface */
#undef INTERFACE
#define INTERFACE   IMarshal2
DECLARE_INTERFACE_( IMarshal2, IMarshal ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IMarshal methods */
    STDMETHOD( GetUnmarshalClass )( THIS_ REFIID, void *, DWORD, void *, DWORD, CLSID * ) PURE;
    STDMETHOD( GetMarshalSizeMax )( THIS_ REFIID, void *, DWORD, void *, DWORD, DWORD * ) PURE;
    STDMETHOD( MarshalInterface )( THIS_ IStream *, REFIID, void *, DWORD, void *, DWORD ) PURE;
    STDMETHOD( UnmarshalInterface )( THIS_ IStream *, REFIID, void ** ) PURE;
    STDMETHOD( ReleaseMarshalData )( THIS_ IStream * ) PURE;
    STDMETHOD( DisconnectObject )( THIS_ DWORD ) PURE;
};
typedef IMarshal2   *LPMARSHAL2;

/* IMalloc interface */
#undef INTERFACE
#define INTERFACE   IMalloc
DECLARE_INTERFACE_( IMalloc, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IMalloc methods */
    STDMETHOD_( void *, Alloc )( THIS_ SIZE_T ) PURE;
    STDMETHOD_( void *, Realloc )( THIS_ void *, SIZE_T ) PURE;
    STDMETHOD_( void, Free )( THIS_ void * ) PURE;
    STDMETHOD_( SIZE_T, GetSize )( THIS_ void * ) PURE;
    STDMETHOD_( int, DidAlloc )( THIS_ void * ) PURE;
    STDMETHOD_( void, HeapMinimize )( THIS ) PURE;
};
typedef IMalloc *LPMALLOC;

/* IMallocSpy interface */
#undef INTERFACE
#define INTERFACE   IMallocSpy
DECLARE_INTERFACE_( IMallocSpy, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IMallocSpy methods */
    STDMETHOD_( SIZE_T, PreAlloc )( THIS_ SIZE_T ) PURE;
    STDMETHOD_( void *, PostAlloc )( THIS_ void * ) PURE;
    STDMETHOD_( void *, PreFree )( THIS_ void *, BOOL ) PURE;
    STDMETHOD_( void, PostFree )( THIS_ BOOL ) PURE;
    STDMETHOD_( SIZE_T, PreRealloc )( THIS_ void *, SIZE_T, void **, BOOL ) PURE;
    STDMETHOD_( void *, PostRealloc )( THIS_ void *, BOOL ) PURE;
    STDMETHOD_( void *, PreGetSize )( THIS_ void *, BOOL ) PURE;
    STDMETHOD_( SIZE_T, PostGetSize )( THIS_ SIZE_T, BOOL ) PURE;
    STDMETHOD_( void *, PreDidAlloc )( THIS_ void *, BOOL ) PURE;
    STDMETHOD_( int, PostDidAlloc )( THIS_ void *, BOOL, int ) PURE;
    STDMETHOD_( void, PreHeapMinimize )( THIS ) PURE;
    STDMETHOD_( void, PostHeapMinimize )( THIS ) PURE;
};
typedef IMallocSpy  *LPMALLOCSPY;

/* IStdMarshalInfo interface */
#undef INTERFACE
#define INTERFACE   IStdMarshalInfo
DECLARE_INTERFACE_( IStdMarshalInfo, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IStdMarshalInfo methods */
    STDMETHOD( GetClassForHandler )( THIS_ DWORD, void *, CLSID * ) PURE;
};
typedef IStdMarshalInfo *LPSTDMARSHALINFO;

/* IExternalConnection interface */
#undef INTERFACE
#define INTERFACE   IExternalConnection
DECLARE_INTERFACE_( IExternalConnection, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IExternalConnection methods */
    STDMETHOD_( DWORD, AddConnection )( THIS_ DWORD, DWORD ) PURE;
    STDMETHOD_( DWORD, ReleaseConnection )( THIS_ DWORD, DWORD, BOOL ) PURE;
};
typedef IExternalConnection *LPEXTERNALCONNECTION;

/* IMultiQI interface */
#undef INTERFACE
#define INTERFACE   IMultiQI
DECLARE_INTERFACE_( IMultiQI, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IMultiQI methods */
    STDMETHOD( QueryMultipleInterfaces )( THIS_ ULONG, MULTI_QI * ) PURE;
};
typedef IMultiQI    *LPMULTIQI;

/* IInternalUnknown interface */
#undef INTERFACE
#define INTERFACE   IInternalUnknown
DECLARE_INTERFACE_( IInternalUnknown, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IInternalUnknown methods */
    STDMETHOD( QueryInternalInterface )( THIS_ REFIID, void ** ) PURE;
};

/* IEnumUnknown interface */
#undef INTERFACE
#define INTERFACE   IEnumUnknown
DECLARE_INTERFACE_( IEnumUnknown, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IEnumUnknown methods */
    STDMETHOD( Next )( THIS_ ULONG, IUnknown **, ULONG * ) PURE;
    STDMETHOD( Skip )( THIS_ ULONG ) PURE;
    STDMETHOD( Reset )( THIS ) PURE;
    STDMETHOD( Clone )( THIS_ IEnumUnknown ** ) PURE;
};
typedef IEnumUnknown    *LPENUMUNKNOWN;

/* IBindCtx interface */
#undef INTERFACE
#define INTERFACE   IBindCtx
DECLARE_INTERFACE_( IBindCtx, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IBindCtx methods */
    STDMETHOD( RegisterObjectBound )( THIS_ IUnknown * ) PURE;
    STDMETHOD( RevokeObjectBound )( THIS_ IUnknown * ) PURE;
    STDMETHOD( ReleaseBoundObjects )( THIS ) PURE;
    STDMETHOD( SetBindOptions )( THIS_ BIND_OPTS * ) PURE;
    STDMETHOD( GetBindOptions )( THIS_ BIND_OPTS * ) PURE;
    STDMETHOD( GetRunningObjectTable )( THIS_ IRunningObjectTable ** ) PURE;
    STDMETHOD( RegisterObjectParam )( THIS_ LPOLESTR, IUnknown * ) PURE;
    STDMETHOD( GetObjectParam )( THIS_ LPOLESTR, IUnknown ** ) PURE;
    STDMETHOD( EnumObjectParam )( THIS_ IEnumString ** ) PURE;
    STDMETHOD( RevokeObjectParam )( THIS_ LPOLESTR ) PURE;
};
typedef IBindCtx    *LPBC;
typedef IBindCtx    *LPBINDCTX;

/* IEnumMoniker interface */
#undef INTERFACE
#define INTERFACE   IEnumMoniker
DECLARE_INTERFACE_( IEnumMoniker, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IEnumMoniker methods */
    STDMETHOD( Next )( THIS_ ULONG, IMoniker **, ULONG * ) PURE;
    STDMETHOD( Skip )( THIS_ ULONG ) PURE;
    STDMETHOD( Reset )( THIS ) PURE;
    STDMETHOD( Clone )( THIS_ IEnumMoniker ** ) PURE;
};
typedef IEnumMoniker    *LPENUMMONIKER;

/* IRunnableObject interface */
#undef INTERFACE
#define INTERFACE   IRunnableObject
DECLARE_INTERFACE_( IRunnableObject, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRunnableObject methods */
    STDMETHOD( GetRunningClass )( THIS_ LPCLSID ) PURE;
    STDMETHOD( Run )( THIS_ LPBINDCTX ) PURE;
    STDMETHOD_( BOOL, IsRunning )( THIS ) PURE;
    STDMETHOD( LockRunning )( THIS_ BOOL, BOOL ) PURE;
    STDMETHOD( SetContainedObject )( THIS_ BOOL ) PURE;
};
typedef IRunnableObject *LPRUNNABLEOBJECT;

/* IRunningObjectTable interface */
#undef INTERFACE
#define INTERFACE   IRunningObjectTable
DECLARE_INTERFACE_( IRunningObjectTable, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRunningObjectTable methods */
    STDMETHOD( Register )( THIS_ DWORD, IUnknown *, IMoniker *, DWORD * ) PURE;
    STDMETHOD( Revoke )( THIS_ DWORD ) PURE;
    STDMETHOD( IsRunning )( THIS_ IMoniker * ) PURE;
    STDMETHOD( GetObject )( THIS_ IMoniker *, IUnknown ** ) PURE;
    STDMETHOD( NoteChangeTime )( THIS_ DWORD, FILETIME * ) PURE;
    STDMETHOD( GetTimeOfLastChange )( THIS_ IMoniker *, FILETIME * ) PURE;
    STDMETHOD( EnumRunning )( THIS_ IEnumMoniker ** ) PURE;
};
typedef IRunningObjectTable *LPRUNNINGOBJECTTABLE;

/* IPersist interface */
#undef INTERFACE
#define INTERFACE   IPersist
DECLARE_INTERFACE_( IPersist, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IPersist methods */
    STDMETHOD( GetClassID )( THIS_ CLSID * ) PURE;
};
typedef IPersist    *LPPERSIST;

/* IPersistStream interface */
#undef INTERFACE
#define INTERFACE   IPersistStream
DECLARE_INTERFACE_( IPersistStream, IPersist ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IPersist methods */
    STDMETHOD( GetClassID )( THIS_ CLSID * ) PURE;
    
    /* IPersistStream methods */
    STDMETHOD( IsDirty )( THIS ) PURE;
    STDMETHOD( Load )( THIS_ IStream * ) PURE;
    STDMETHOD( Save )( THIS_ IStream *, BOOL ) PURE;
    STDMETHOD( GetSizeMax )( THIS_ ULARGE_INTEGER * ) PURE;
};
typedef IPersistStream  *LPPERSISTSTREAM;

/* IMoniker interface */
#undef INTERFACE
#define INTERFACE   IMoniker
DECLARE_INTERFACE_( IMoniker, IPersistStream ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IPersist methods */
    STDMETHOD( GetClassID )( THIS_ CLSID * ) PURE;
    
    /* IPersistStream methods */
    STDMETHOD( IsDirty )( THIS ) PURE;
    STDMETHOD( Load )( THIS_ IStream * ) PURE;
    STDMETHOD( Save )( THIS_ IStream *, BOOL ) PURE;
    STDMETHOD( GetSizeMax )( THIS_ ULARGE_INTEGER * ) PURE;
    
    /* IMoniker methods */
    STDMETHOD( BindToObject )( THIS_ IBindCtx *, IMoniker *, REFIID, void ** ) PURE;
    STDMETHOD( BindToStorage )( THIS_ IBindCtx *, IMoniker *, REFIID, void ** ) PURE;
    STDMETHOD( Reduce )( THIS_ IBindCtx *, DWORD, IMoniker **, IMoniker ** ) PURE;
    STDMETHOD( ComposeWith )( THIS_ IMoniker *, BOOL, IMoniker ** ) PURE;
    STDMETHOD( Enum )( THIS_ BOOL, IEnumMoniker ** ) PURE;
    STDMETHOD( IsEqual )( THIS_ IMoniker * ) PURE;
    STDMETHOD( Hash )( THIS_ DWORD * ) PURE;
    STDMETHOD( IsRunning )( THIS_ IBindCtx *, IMoniker *, IMoniker * ) PURE;
    STDMETHOD( GetTimeOfLastChange )( THIS_ IBindCtx *, IMoniker *, FILETIME * ) PURE;
    STDMETHOD( Inverse )( THIS_ IMoniker ** ) PURE;
    STDMETHOD( CommonPrefixWith )( THIS_ IMoniker *, IMoniker ** ) PURE;
    STDMETHOD( RelativePathTo )( THIS_ IMoniker *, IMoniker ** ) PURE;
    STDMETHOD( GetDisplayName )( THIS_ IBindCtx *, IMoniker *, LPOLESTR * ) PURE;
    STDMETHOD( ParseDisplayName )( THIS_ IBindCtx *, IMoniker *, LPOLESTR, ULONG *, IMoniker ** ) PURE;
    STDMETHOD( IsSystemMoniker )( THIS_ DWORD * ) PURE;
};
typedef IMoniker    *LPMONIKER;

/* IROTData interface */
#undef INTERFACE
#define INTERFACE   IROTData
DECLARE_INTERFACE_( IROTData, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IROTData methods */
    STDMETHOD( GetComparisonData )( THIS_ byte *, ULONG, ULONG * ) PURE;
};

/* IEnumString interface */
#undef INTERFACE
#define INTERFACE   IEnumString
DECLARE_INTERFACE_( IEnumString, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IEnumString methods */
    STDMETHOD( Next )( THIS_ ULONG, LPOLESTR *, ULONG * ) PURE;
    STDMETHOD( Skip )( THIS_ ULONG ) PURE;
    STDMETHOD( Reset )( THIS ) PURE;
    STDMETHOD( Clone )( THIS_ IEnumString ** ) PURE;
};
typedef IEnumString *LPENUMSTRING;

/* ISequentialStream interface */
#undef INTERFACE
#define INTERFACE   ISequentialStream
DECLARE_INTERFACE_( ISequentialStream, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ISequentialStream methods */
    STDMETHOD( Read )( THIS_ void *, ULONG, ULONG * ) PURE;
    STDMETHOD( Write )( THIS_ void const *, ULONG, ULONG * ) PURE;
};

/* IStream interface */
#undef INTERFACE
#define INTERFACE   IStream
DECLARE_INTERFACE_( IStream, ISequentialStream ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ISequentialStream methods */
    STDMETHOD( Read )( THIS_ void *, ULONG, ULONG * ) PURE;
    STDMETHOD( Write )( THIS_ void const *, ULONG, ULONG * ) PURE;
    
    /* IStream methods */
    STDMETHOD( Seek )( THIS_ LARGE_INTEGER, DWORD, ULARGE_INTEGER * ) PURE;
    STDMETHOD( SetSize )( THIS_ ULARGE_INTEGER ) PURE;
    STDMETHOD( CopyTo )( THIS_ IStream *, ULARGE_INTEGER, ULARGE_INTEGER *, ULARGE_INTEGER * ) PURE;
    STDMETHOD( Commit )( THIS_ DWORD ) PURE;
    STDMETHOD( Revert )( THIS ) PURE;
    STDMETHOD( LockRegion )( THIS_ ULARGE_INTEGER, ULARGE_INTEGER, DWORD ) PURE;
    STDMETHOD( UnlockRegion )( THIS_ ULARGE_INTEGER, ULARGE_INTEGER, DWORD ) PURE;
    STDMETHOD( Stat )( THIS_ STATSTG *, DWORD ) PURE;
    STDMETHOD( Clone )( THIS_ IStream ** ) PURE;
};
typedef IStream *LPSTREAM;

/* IEnumSTATSTG interface */
#undef INTERFACE
#define INTERFACE   IEnumSTATSTG
DECLARE_INTERFACE_( IEnumSTATSTG, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IEnumSTATSTG methods */
    STDMETHOD( Next )( THIS_ ULONG, STATSTG *, ULONG * ) PURE;
    STDMETHOD( Skip )( THIS_ ULONG ) PURE;
    STDMETHOD( Reset )( THIS ) PURE;
    STDMETHOD( Clone )( THIS_ IEnumSTATSTG ** ) PURE;
};
typedef IEnumSTATSTG    *LPENUMSTATSTG;

/* IStorage interface */
#undef INTERFACE
#define INTERFACE   IStorage
DECLARE_INTERFACE_( IStorage, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IStorage methods */
    STDMETHOD( CreateStream )( THIS_ const OLECHAR *, DWORD, DWORD, DWORD, IStream ** ) PURE;
    STDMETHOD( OpenStream )( THIS_ const OLECHAR *, void *, DWORD, DWORD, IStream ** ) PURE;
    STDMETHOD( CreateStorage )( THIS_ const OLECHAR *, DWORD, DWORD, DWORD, IStorage ** ) PURE;
    STDMETHOD( OpenStorage )( THIS_ const OLECHAR *, IStorage *, DWORD, SNB, DWORD, IStorage ** ) PURE;
    STDMETHOD( CopyTo )( THIS_ DWORD, IID const *, SNB, IStorage * ) PURE;
    STDMETHOD( MoveElementTo )( THIS_ const OLECHAR *, IStorage *, const OLECHAR *, DWORD ) PURE;
    STDMETHOD( Commit )( THIS_ DWORD ) PURE;
    STDMETHOD( Revert )( THIS ) PURE;
    STDMETHOD( EnumElements )( THIS_ DWORD, void *, DWORD, IEnumSTATSTG ** ) PURE;
    STDMETHOD( DestroyElement )( THIS_ const OLECHAR * ) PURE;
    STDMETHOD( RenameElement )( THIS_ const OLECHAR *, const OLECHAR * ) PURE;
    STDMETHOD( SetElementTimes )( THIS_ const OLECHAR *, FILETIME const *, FILETIME const *, FILETIME const * ) PURE;
    STDMETHOD( SetClass )( THIS_ REFCLSID ) PURE;
    STDMETHOD( SetStateBits )( THIS_ DWORD, DWORD ) PURE;
    STDMETHOD( Stat )( THIS_ STATSTG *, DWORD ) PURE;
};
typedef IStorage    *LPSTORAGE;

/* IPersistFile interface */
#undef INTERFACE
#define INTERFACE   IPersistFile
DECLARE_INTERFACE_( IPersistFile, IPersist ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IPersist methods */
    STDMETHOD( GetClassID )( THIS_ CLSID * ) PURE;
    
    /* IPersistFile methods */
    STDMETHOD( IsDirty )( THIS ) PURE;
    STDMETHOD( Load )( THIS_ LPCOLESTR, DWORD ) PURE;
    STDMETHOD( Save )( THIS_ LPCOLESTR, BOOL ) PURE;
    STDMETHOD( SaveCompleted )( THIS_ LPCOLESTR ) PURE;
    STDMETHOD( GetCurFile )( THIS_ LPOLESTR * ) PURE;
};
typedef IPersistFile    *LPPERSISTFILE;

/* IPersistStorage interface */
#undef INTERFACE
#define INTERFACE   IPersistStorage
DECLARE_INTERFACE_( IPersistStorage, IPersist ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IPersist methods */
    STDMETHOD( GetClassID )( THIS_ CLSID * ) PURE;
    
    /* IPersistStorage methods */
    STDMETHOD( IsDirty )( THIS ) PURE;
    STDMETHOD( InitNew )( THIS_ IStorage * ) PURE;
    STDMETHOD( Load )( THIS_ IStorage * ) PURE;
    STDMETHOD( Save )( THIS_ IStorage *, BOOL ) PURE;
    STDMETHOD( SaveCompleted )( THIS_ IStorage * ) PURE;
    STDMETHOD( HandsOffStorage )( THIS ) PURE;
};
typedef IPersistStorage *LPPERSISTSTORAGE;

/* ILockBytes interface */
#undef INTERFACE
#define INTERFACE   ILockBytes
DECLARE_INTERFACE_( ILockBytes, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ILockBytes methods */
    STDMETHOD( ReadAt )( THIS_ ULARGE_INTEGER, void *, ULONG, ULONG * ) PURE;
    STDMETHOD( WriteAt )( THIS_ ULARGE_INTEGER, void const *, ULONG, ULONG * ) PURE;
    STDMETHOD( Flush )( THIS ) PURE;
    STDMETHOD( SetSize )( THIS_ ULARGE_INTEGER ) PURE;
    STDMETHOD( LockRegion )( THIS_ ULARGE_INTEGER, ULARGE_INTEGER, DWORD ) PURE;
    STDMETHOD( UnlockRegion )( THIS_ ULARGE_INTEGER, ULARGE_INTEGER, DWORD ) PURE;
    STDMETHOD( Stat )( THIS_ STATSTG *, DWORD ) PURE;
};
typedef ILockBytes  *LPLOCKBYTES;

/* IEnumFORMATETC interface */
#undef INTERFACE
#define INTERFACE   IEnumFORMATETC
DECLARE_INTERFACE_( IEnumFORMATETC, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IEnumFORMATETC methods */
    STDMETHOD( Next )( THIS_ ULONG, FORMATETC *, ULONG * ) PURE;
    STDMETHOD( Skip )( THIS_ ULONG ) PURE;
    STDMETHOD( Reset )( THIS ) PURE;
    STDMETHOD( Clone )( THIS_ IEnumFORMATETC ** ) PURE;
};
typedef IEnumFORMATETC  *LPENUMFORMATETC;

/* IEnumSTATDATA interface */
#undef INTERFACE
#define INTERFACE   IEnumSTATDATA
DECLARE_INTERFACE_( IEnumSTATDATA, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IEnumSTATDATA methods */
    STDMETHOD( Next )( THIS_ ULONG, STATDATA *, ULONG * ) PURE;
    STDMETHOD( Skip )( THIS_ ULONG ) PURE;
    STDMETHOD( Reset )( THIS ) PURE;
    STDMETHOD( Clone )( THIS_ IEnumSTATDATA ** ) PURE;
};
typedef IEnumSTATDATA   *LPENUMSTATDATA;

/* IRootStorage interface */
#undef INTERFACE
#define INTERFACE   IRootStorage
DECLARE_INTERFACE_( IRootStorage, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRootStorage methods */
    STDMETHOD( SwitchToFile )( THIS_ LPOLESTR ) PURE;
};
typedef IRootStorage    *LPROOTSTORAGE;

/* IAdviseSink interface */
#undef INTERFACE
#define INTERFACE   IAdviseSink
DECLARE_INTERFACE_( IAdviseSink, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IAdviseSink methods */
    STDMETHOD_( void, OnDataChange )( THIS_ FORMATETC *, STGMEDIUM * ) PURE;
    STDMETHOD_( void, OnViewChange )( THIS_ DWORD, LONG ) PURE;
    STDMETHOD_( void, OnRename )( THIS_ IMoniker * ) PURE;
    STDMETHOD_( void, OnSave )( THIS ) PURE;
    STDMETHOD_( void, OnClose )( THIS ) PURE;
};
typedef IAdviseSink *LPADVISESINK;

/* IAdviseSink2 interface */
#undef INTERFACE
#define INTERFACE   IAdviseSink2
DECLARE_INTERFACE_( IAdviseSink2, IAdviseSink ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IAdviseSink methods */
    STDMETHOD_( void, OnDataChange )( THIS_ FORMATETC *, STGMEDIUM * ) PURE;
    STDMETHOD_( void, OnViewChange )( THIS_ DWORD, LONG ) PURE;
    STDMETHOD_( void, OnRename )( THIS_ IMoniker * ) PURE;
    STDMETHOD_( void, OnSave )( THIS ) PURE;
    STDMETHOD_( void, OnClose )( THIS ) PURE;
    
    /* IAdviseSink2 methods */
    STDMETHOD_( void, OnLinkSrcChange )( THIS_ IMoniker * ) PURE;
};
typedef IAdviseSink2    *LPADVISESINK2;

/* IDataObject interface */
#undef INTERFACE
#define INTERFACE   IDataObject
DECLARE_INTERFACE_( IDataObject, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IDataObject methods */
    STDMETHOD( GetData )( THIS_ FORMATETC *, STGMEDIUM * ) PURE;
    STDMETHOD( GetDataHere )( THIS_ FORMATETC *, STGMEDIUM * ) PURE;
    STDMETHOD( QueryGetData )( THIS_ FORMATETC * ) PURE;
    STDMETHOD( GetCanonicalFormatEtc )( THIS_ FORMATETC *, FORMATETC * ) PURE;
    STDMETHOD( SetData )( THIS_ FORMATETC *, STGMEDIUM *, BOOL ) PURE;
    STDMETHOD( EnumFormatEtc )( THIS_ DWORD, IEnumFORMATETC ** ) PURE;
    STDMETHOD( DAdvise )( THIS_ FORMATETC *, DWORD, IAdviseSink *, DWORD * ) PURE;
    STDMETHOD( DUnadvise )( THIS_ DWORD ) PURE;
    STDMETHOD( EnumDAdvise )( THIS_ IEnumSTATDATA ** ) PURE;
};
typedef IDataObject *LPDATAOBJECT;

/* IDataAdviseHolder interface */
#undef INTERFACE
#define INTERFACE   IDataAdviseHolder
DECLARE_INTERFACE_( IDataAdviseHolder, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IDataAdviseHolder methods */
    STDMETHOD( Advise )( THIS_ IDataObject *, FORMATETC *, DWORD, IAdviseSink *, DWORD * ) PURE;
    STDMETHOD( Unadvise )( THIS_ DWORD ) PURE;
    STDMETHOD( EnumAdvise )( THIS_ IEnumSTATDATA ** ) PURE;
    STDMETHOD( SendOnDataChange )( THIS_ IDataObject *, DWORD, DWORD ) PURE;
};
typedef IDataAdviseHolder   *LPDATAADVISEHOLDER;

/* IMessageFilter interface */
#undef INTERFACE
#define INTERFACE   IMessageFilter
DECLARE_INTERFACE_( IMessageFilter, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IMessageFilter methods */
    STDMETHOD_( DWORD, HandleInComingCall )( THIS_ DWORD, HTASK, DWORD, LPINTERFACEINFO ) PURE;
    STDMETHOD_( DWORD, RetryRejectedCall )( THIS_ HTASK, DWORD, DWORD ) PURE;
    STDMETHOD_( DWORD, MessagePending )( THIS_ HTASK, DWORD, DWORD ) PURE;
};
typedef IMessageFilter  *LPMESSAGEFILTER;

/* IRpcChannelBuffer interface */
#undef INTERFACE
#define INTERFACE   IRpcChannelBuffer
DECLARE_INTERFACE_( IRpcChannelBuffer, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRpcChannelBuffer methods */
    STDMETHOD( GetBuffer )( THIS_ RPCOLEMESSAGE *, REFIID ) PURE;
    STDMETHOD( SendReceive )( THIS_ RPCOLEMESSAGE *, ULONG * ) PURE;
    STDMETHOD( FreeBuffer )( THIS_ RPCOLEMESSAGE * ) PURE;
    STDMETHOD( GetDestCtx )( THIS_ DWORD *, void ** ) PURE;
    STDMETHOD( IsConnected )( THIS ) PURE;
};

/* IRpcChannelBuffer2 interface */
#undef INTERFACE
#define INTERFACE   IRpcChannelBuffer2
DECLARE_INTERFACE_( IRpcChannelBuffer2, IRpcChannelBuffer ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRpcChannelBuffer methods */
    STDMETHOD( GetBuffer )( THIS_ RPCOLEMESSAGE *, REFIID ) PURE;
    STDMETHOD( SendReceive )( THIS_ RPCOLEMESSAGE *, ULONG * ) PURE;
    STDMETHOD( FreeBuffer )( THIS_ RPCOLEMESSAGE * ) PURE;
    STDMETHOD( GetDestCtx )( THIS_ DWORD *, void ** ) PURE;
    STDMETHOD( IsConnected )( THIS ) PURE;
    
    /* IRpcChannelBuffer2 methods */
    STDMETHOD( GetProtocolVersion )( THIS_ DWORD * ) PURE;
};

/* IAsyncRpcChannelBuffer interface */
#undef INTERFACE
#define INTERFACE   IAsyncRpcChannelBuffer
DECLARE_INTERFACE_( IAsyncRpcChannelBuffer, IRpcChannelBuffer2 ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRpcChannelBuffer methods */
    STDMETHOD( GetBuffer )( THIS_ RPCOLEMESSAGE *, REFIID ) PURE;
    STDMETHOD( SendReceive )( THIS_ RPCOLEMESSAGE *, ULONG * ) PURE;
    STDMETHOD( FreeBuffer )( THIS_ RPCOLEMESSAGE * ) PURE;
    STDMETHOD( GetDestCtx )( THIS_ DWORD *, void ** ) PURE;
    STDMETHOD( IsConnected )( THIS ) PURE;
    
    /* IRpcChannelBuffer2 methods */
    STDMETHOD( GetProtocolVersion )( THIS_ DWORD * ) PURE;
    
    /* IAsyncRpcChannelBuffer methods */
    STDMETHOD( Send )( THIS_ RPCOLEMESSAGE *, ISynchronize *, ULONG * ) PURE;
    STDMETHOD( Receive )( THIS_ RPCOLEMESSAGE *, ULONG * ) PURE;
    STDMETHOD( GetDestCtxEx )( THIS_ RPCOLEMESSAGE *, DWORD *, void ** ) PURE;
};

/* IRpcChannelBuffer3 interface */
#undef INTERFACE
#define INTERFACE   IRpcChannelBuffer3
DECLARE_INTERFACE_( IRpcChannelBuffer3, IRpcChannelBuffer2 ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRpcChannelBuffer methods */
    STDMETHOD( GetBuffer )( THIS_ RPCOLEMESSAGE *, REFIID ) PURE;
    STDMETHOD( SendReceive )( THIS_ RPCOLEMESSAGE *, ULONG * ) PURE;
    STDMETHOD( FreeBuffer )( THIS_ RPCOLEMESSAGE * ) PURE;
    STDMETHOD( GetDestCtx )( THIS_ DWORD *, void ** ) PURE;
    STDMETHOD( IsConnected )( THIS ) PURE;
    
    /* IRpcChannelBuffer2 methods */
    STDMETHOD( GetProtocolVersion )( THIS_ DWORD * ) PURE;
    
    /* IRpcChannelBuffer3 methods */
    STDMETHOD( Send )( THIS_ RPCOLEMESSAGE *, ULONG * ) PURE;
    STDMETHOD( Receive )( THIS_ RPCOLEMESSAGE *, ULONG, ULONG * ) PURE;
    STDMETHOD( Cancel )( THIS_ RPCOLEMESSAGE * ) PURE;
    STDMETHOD( GetCallContext )( THIS_ RPCOLEMESSAGE *, REFIID, void ** ) PURE;
    STDMETHOD( GetDestCtxEx )( THIS_ RPCOLEMESSAGE *, DWORD *, void ** ) PURE;
    STDMETHOD( GetState )( THIS_ RPCOLEMESSAGE *, DWORD * ) PURE;
    STDMETHOD( RegisterAsync )( THIS_ RPCOLEMESSAGE *, IAsyncManager * ) PURE;
};

/* IRpcSyntaxNegotiate interface */
#undef INTERFACE
#define INTERFACE   IRpcSyntaxNegotiate
DECLARE_INTERFACE_( IRpcSyntaxNegotiate, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRpcSyntaxNegotiate methods */
    STDMETHOD( NegotiateSyntax )( THIS_ RPCOLEMESSAGE * ) PURE;
};

/* IRpcProxyBuffer interface */
#undef INTERFACE
#define INTERFACE   IRpcProxyBuffer
DECLARE_INTERFACE_( IRpcProxyBuffer, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRpcProxyBuffer methods */
    STDMETHOD( Connect )( THIS_ IRpcChannelBuffer * ) PURE;
    STDMETHOD_( void, Disconnect )( THIS ) PURE;
};

/* IRpcStubBuffer interface */
#undef INTERFACE
#define INTERFACE   IRpcStubBuffer
DECLARE_INTERFACE_( IRpcStubBuffer, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRpcStubBuffer methods */
    STDMETHOD( Connect )( THIS_ IUnknown * ) PURE;
    STDMETHOD_( void, Disconnect )( THIS ) PURE;
    STDMETHOD( Invoke )( THIS_ RPCOLEMESSAGE *, IRpcChannelBuffer * ) PURE;
    STDMETHOD_( IRpcStubBuffer *, IsIIDSupported )( THIS_ REFIID ) PURE;
    STDMETHOD_( ULONG, CountRefs )( THIS ) PURE;
    STDMETHOD( DebugServerQueryInterface )( THIS_ void ** ) PURE;
    STDMETHOD_( void, DebugServerRelease )( THIS_ void * ) PURE;
};

/* IPSFactoryBuffer interface */
#undef INTERFACE
#define INTERFACE   IPSFactoryBuffer
DECLARE_INTERFACE_( IPSFactoryBuffer, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IPSFactoryBuffer methods */
    STDMETHOD( CreateProxy )( THIS_ IUnknown *, REFIID, IRpcProxyBuffer *, void ** ) PURE;
    STDMETHOD( CreateStub )( THIS_ REFIID, IUnknown *, IRpcStubBuffer * ) PURE;
};

/* IChannelHook interface */
#if (_WIN32_WINNT >= 0x0400)
#undef INTERFACE
#define INTERFACE   IChannelHook
DECLARE_INTERFACE_( IChannelHook, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IChannelHook methods */
    STDMETHOD_( void, ClientGetSize )( THIS_ REFGUID, REFIID, ULONG * ) PURE;
    STDMETHOD_( void, ClientFillBuffer )( THIS_ REFGUID, REFIID, ULONG *, void * ) PURE;
    STDMETHOD_( void, ClientNotify )( THIS_ REFGUID, REFIID, ULONG, void *, DWORD, HRESULT ) PURE;
    STDMETHOD_( void, ServerNotify )( THIS_ REFGUID, REFIID, ULONG, void *, DWORD ) PURE;
    STDMETHOD_( void, ServerGetSize )( THIS_ REFGUID, REFIID, HRESULT, ULONG * ) PURE;
    STDMETHOD_( void, ServerFillBuffer )( THIS_ REFGUID, REFIID, ULONG *, void *, HRESULT ) PURE;
};
#endif

/* IClientSecurity interface */
#if (_WIN32_WINNT >= 0x0400)
#undef INTERFACE
#define INTERFACE   IClientSecurity
DECLARE_INTERFACE_( IClientSecurity, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IClientSecurity methods */
    STDMETHOD( QueryBlanket )( THIS_ IUnknown *, DWORD *, DWORD *, OLECHAR **, DWORD *, DWORD *, void **, DWORD * ) PURE;
    STDMETHOD( SetBlanket )( THIS_ IUnknown *, DWORD, DWORD, OLECHAR *, DWORD, DWORD, void *, DWORD ) PURE;
    STDMETHOD( CopyProxy )( THIS_ IUnknown *, IUnknown ** ) PURE;
};
#endif

/* IServerSecurity interface */
#if (_WIN32_WINNT >= 0x0400)
#undef INTERFACE
#define INTERFACE   IServerSecurity
DECLARE_INTERFACE_( IServerSecurity, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IServerSecurity methods */
    STDMETHOD( QueryBlanket )( THIS_ DWORD *, DWORD *, OLECHAR **, DWORD *, DWORD *, void **, DWORD * ) PURE;
    STDMETHOD( ImpersonateClient )( THIS ) PURE;
    STDMETHOD( RevertToSelf )( THIS ) PURE;
    STDMETHOD_( BOOL, IsImpersonating )( THIS ) PURE;
};
#endif

/* IClassActivator interface */
#if (_WIN32_WINNT >= 0x0400)
#undef INTERFACE
#define INTERFACE   IClassActivator
DECLARE_INTERFACE_( IClassActivator, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IClassActivator methods */
    STDMETHOD( GetClassObject )( THIS_ REFCLSID, DWORD, LCID, REFIID, void ** ) PURE;
};
#endif

/* IRpcOptions interface */
#if (_WIN32_WINNT >= 0x0400)
#undef INTERFACE
#define INTERFACE   IRpcOptions
DECLARE_INTERFACE_( IRpcOptions, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRpcOptions methods */
    STDMETHOD( Set )( THIS_ IUnknown *, RPCOPT_PROPERTIES, ULONG_PTR ) PURE;
    STDMETHOD( Query )( THIS_ IUnknown *, RPCOPT_PROPERTIES, ULONG_PTR * ) PURE;
};
#endif

/* IGlobalOptions interface */
#if (_WIN32_WINNT >= 0x0400)
#undef INTERFACE
#define INTERFACE   IGlobalOptions
DECLARE_INTERFACE_( IGlobalOptions, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IGlobalOptions methods */
    STDMETHOD( Set )( THIS_ GLOBALOPT_PROPERTIES, ULONG_PTR ) PURE;
    STDMETHOD( Query )( THIS_ GLOBALOPT_PROPERTIES, ULONG_PTR * ) PURE;
};
#endif

/* IFillLockBytes interface */
#undef INTERFACE
#define INTERFACE   IFillLockBytes
DECLARE_INTERFACE_( IFillLockBytes, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IFillLockBytes methods */
    STDMETHOD( FillAppend )( THIS_ void const *, ULONG, ULONG * ) PURE;
    STDMETHOD( FillAt )( THIS_ ULARGE_INTEGER, void const *, ULONG, ULONG * ) PURE;
    STDMETHOD( SetFillSize )( THIS_ ULARGE_INTEGER ) PURE;
    STDMETHOD( Terminate )( THIS_ BOOL ) PURE;
};

/* IProgressNotify interface */
#undef INTERFACE
#define INTERFACE   IProgressNotify
DECLARE_INTERFACE_( IProgressNotify, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IProgressNotify methods */
    STDMETHOD( OnProgress )( THIS_ DWORD, DWORD, BOOL, BOOL ) PURE;
};

/* ILayoutStorage interface */
#undef INTERFACE
#define INTERFACE   ILayoutStorage
DECLARE_INTERFACE_( ILayoutStorage, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ILayoutStorage methods */
    STDMETHOD( LayoutScript )( THIS_ StorageLayout *, DWORD, DWORD ) PURE;
    STDMETHOD( BeginMonitor )( THIS ) PURE;
    STDMETHOD( EndMonitor )( THIS ) PURE;
    STDMETHOD( ReLayoutDocfile )( THIS_ OLECHAR * ) PURE;
    STDMETHOD( ReLayoutDocfileOnILockBytes )( THIS_ ILockBytes * ) PURE;
};

/* IBlockingLock interface */
#undef INTERFACE
#define INTERFACE   IBlockingLock
DECLARE_INTERFACE_( IBlockingLock, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IBlockingLock methods */
    STDMETHOD( Lock )( THIS_ DWORD ) PURE;
    STDMETHOD( Unlock )( THIS ) PURE;
};

/* ITimeAndNoticeControl interface */
#undef INTERFACE
#define INTERFACE   ITimeAndNoticeControl
DECLARE_INTERFACE_( ITimeAndNoticeControl, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ITimeAndNoticeControl methods */
    STDMETHOD( SuppressChanges )( THIS_ DWORD, DWORD ) PURE;
};

/* IOplockStorage interface */
#undef INTERFACE
#define INTERFACE   IOplockStorage
DECLARE_INTERFACE_( IOplockStorage, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IOplockStorage methods */
    STDMETHOD( CreateStorageEx )( THIS_ LPCWSTR, DWORD, DWORD, DWORD, REFIID, void ** ) PURE;
    STDMETHOD( OpenStorageEx )( THIS_ LPCWSTR, DWORD, DWORD, DWORD, REFIID, void ** ) PURE;
};

/* ISurrogate interface */
#undef INTERFACE
#define INTERFACE   ISurrogate
DECLARE_INTERFACE_( ISurrogate, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ISurrogate methods */
    STDMETHOD( LoadDllServer )( THIS_ REFCLSID ) PURE;
    STDMETHOD( FreeSurrogate )( THIS ) PURE;
};
typedef ISurrogate  *LPSURROGATE;

/* IGlobalInterfaceTable interface */
#undef INTERFACE
#define INTERFACE   IGlobalInterfaceTable
DECLARE_INTERFACE_( IGlobalInterfaceTable, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IGlobalInterfaceTable methods */
    STDMETHOD( RegisterInterfaceInGlobal )( THIS_ IUnknown *, REFIID, DWORD * ) PURE;
    STDMETHOD( RevokeInterfaceFromGlobal )( THIS_ DWORD ) PURE;
    STDMETHOD( GetInterfaceFromGlobal )( THIS_ DWORD, REFIID, void ** ) PURE;
};
typedef IGlobalInterfaceTable   *LPGLOBALINTERFACETABLE;

/* IDirectWriterLock interface */
#undef INTERFACE
#define INTERFACE   IDirectWriterLock
DECLARE_INTERFACE_( IDirectWriterLock, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IDirectWriterLock methods */
    STDMETHOD( WaitForWriteAccess )( THIS_ DWORD ) PURE;
    STDMETHOD( ReleaseWriteAccess )( THIS ) PURE;
    STDMETHOD( HaveWriteAccess )( THIS ) PURE;
};

/* ISynchronize interface */
#undef INTERFACE
#define INTERFACE   ISynchronize
DECLARE_INTERFACE_( ISynchronize, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ISynchronize methods */
    STDMETHOD( Wait )( THIS_ DWORD, DWORD ) PURE;
    STDMETHOD( Signal )( THIS ) PURE;
    STDMETHOD( Reset )( THIS ) PURE;
};

/* ISynchronizeHandle interface */
#undef INTERFACE
#define INTERFACE   ISynchronizeHandle
DECLARE_INTERFACE_( ISynchronizeHandle, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ISynchronizeHandle methods */
    STDMETHOD( GetHandle )( THIS_ HANDLE * ) PURE;
};

/* ISynchronizeEvent interface */
#undef INTERFACE
#define INTERFACE   ISynchronizeEvent
DECLARE_INTERFACE_( ISynchronizeEvent, ISynchronizeHandle ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ISynchronizeHandle methods */
    STDMETHOD( GetHandle )( THIS_ HANDLE * ) PURE;
    
    /* ISynchronizeEvent methods */
    STDMETHOD( SetEventHandle )( THIS_ HANDLE * ) PURE;
};

/* ISynchronizeContainer interface */
#undef INTERFACE
#define INTERFACE   ISynchronizeContainer
DECLARE_INTERFACE_( ISynchronizeContainer, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ISynchronizeContainer methods */
    STDMETHOD( AddSynchronize )( THIS_ ISynchronize * ) PURE;
    STDMETHOD( WaitMultiple )( THIS_ DWORD, DWORD, ISynchronize ** ) PURE;
};

/* ISynchronizeMutex interface */
#undef INTERFACE
#define INTERFACE   ISynchronizeMutex
DECLARE_INTERFACE_( ISynchronizeMutex, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ISynchronizeMutex methods */
    STDMETHOD( ReleaseMutex )( THIS ) PURE;
};

/* ICancelMethodCalls interface */
#undef INTERFACE
#define INTERFACE   ICancelMethodCalls
DECLARE_INTERFACE_( ICancelMethodCalls, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ICancelMethodCalls methods */
    STDMETHOD( Cancel )( THIS_ ULONG ) PURE;
    STDMETHOD( TestCancel )( THIS ) PURE;
};
typedef ICancelMethodCalls  *LPCANCELMETHODCALLS;

/* IAsyncManager interface */
#undef INTERFACE
#define INTERFACE   IAsyncManager
DECLARE_INTERFACE_( IAsyncManager, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IAsyncManager methods */
    STDMETHOD( CompleteCall )( THIS_ HRESULT ) PURE;
    STDMETHOD( GetCallContext )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD( GetState )( THIS_ ULONG * ) PURE;
};

/* ICallFactory interface */
#undef INTERFACE
#define INTERFACE   ICallFactory
DECLARE_INTERFACE_( ICallFactory, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ICallFactory methods */
    STDMETHOD( CreateCall )( THIS_ REFIID, IUnknown *, REFIID, IUnknown ** ) PURE;
};

/* IRpcHelper interface */
#undef INTERFACE
#define INTERFACE   IRpcHelper
DECLARE_INTERFACE_( IRpcHelper, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IRpcHelper methods */
    STDMETHOD( GetDCOMProtocolVersion )( THIS_ DWORD * ) PURE;
    STDMETHOD( GetIIDFromOBJREF )( THIS_ void *, IID ** ) PURE;
};

/* IReleaseMarshalBuffers interface */
#undef INTERFACE
#define INTERFACE   IReleaseMarshalBuffers
DECLARE_INTERFACE_( IReleaseMarshalBuffers, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IReleaseMarshalBuffers methods */
    STDMETHOD( ReleaseMarshalBuffers )( THIS_ RPCOLEMESSAGE *, DWORD, IUnknown * ) PURE;
};

/* IWaitMultiple interface */
#undef INTERFACE
#define INTERFACE   IWaitMultiple
DECLARE_INTERFACE_( IWaitMultiple, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IWaitMultiple methods */
    STDMETHOD( WaitMultiple )( THIS_ DWORD, ISynchronize ** ) PURE;
    STDMETHOD( AddSynchronize )( THIS_ ISynchronize * ) PURE;
};

/* IUrlMon interface */
#undef INTERFACE
#define INTERFACE   IUrlMon
DECLARE_INTERFACE_( IUrlMon, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IUrlMon methods */
    STDMETHOD( AsyncGetClassBits )( THIS_ REFCLSID, LPCWSTR, LPCWSTR, DWORD, DWORD, LPCWSTR, IBindCtx *, DWORD, REFIID, DWORD ) PURE;
};

/* IForegroundTransfer interface */
#undef INTERFACE
#define INTERFACE   IForegroundTransfer
DECLARE_INTERFACE_( IForegroundTransfer, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IForegroundTransfer methods */
    STDMETHOD( AllowForegroundTransfer )( THIS_ void * ) PURE;
};

/* IAddrTrackingControl interface */
#undef INTERFACE
#define INTERFACE   IAddrTrackingControl
DECLARE_INTERFACE_( IAddrTrackingControl, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IAddrTrackingControl methods */
    STDMETHOD( EnableCOMDynamicAddrTracking )( THIS ) PURE;
    STDMETHOD( DisableCOMDynamicAddrTracking )( THIS ) PURE;
};
typedef IAddrTrackingControl    *LPADDRTRACKINGCONTROL;

/* IAddrExclusionControl interface */
#undef INTERFACE
#define INTERFACE   IAddrExclusionControl
DECLARE_INTERFACE_( IAddrExclusionControl, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IAddrExclusionControl methods */
    STDMETHOD( GetCurrentAddrExclusionList )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD( UpdateAddrExclusionList )( THIS_ IUnknown * ) PURE;
};
typedef IAddrExclusionControl   *LPADDREXCLUSIONCONTROL;

/* IPipeByte interface */
#undef INTERFACE
#define INTERFACE   IPipeByte
DECLARE_INTERFACE_( IPipeByte, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IPipeByte methods */
    STDMETHOD( Pull )( THIS_ BYTE *, ULONG, ULONG * ) PURE;
    STDMETHOD( Push )( THIS_ BYTE *, ULONG ) PURE;
};

/* IPipeLong interface */
#undef INTERFACE
#define INTERFACE   IPipeLong
DECLARE_INTERFACE_( IPipeLong, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IPipeLong methods */
    STDMETHOD( Pull )( THIS_ LONG *, ULONG, ULONG * ) PURE;
    STDMETHOD( Push )( THIS_ LONG *, ULONG ) PURE;
};

/* IPipeDouble interface */
#undef INTERFACE
#define INTERFACE   IPipeDouble
DECLARE_INTERFACE_( IPipeDouble, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IPipeDouble methods */
    STDMETHOD( Pull )( THIS_ DOUBLE *, ULONG, ULONG * ) PURE;
    STDMETHOD( Push )( THIS_ DOUBLE *, ULONG ) PURE;
};

/* IThumbnailExtractor interface */
#undef INTERFACE
#define INTERFACE   IThumbnailExtractor
DECLARE_INTERFACE_( IThumbnailExtractor, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IThumbnailExtractor methods */
    STDMETHOD( ExtractThumbnail )( THIS_ IStorage *, ULONG, ULONG, ULONG *, ULONG *, HBITMAP * ) PURE;
    STDMETHOD( OnFileUpdated )( THIS_ IStorage * ) PURE;
};

/* IDummyHICONIncluder interface */
#undef INTERFACE
#define INTERFACE   IDummyHICONIncluder
DECLARE_INTERFACE_( IDummyHICONIncluder, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IDummyHICONIncluder methods */
    STDMETHOD( Dummy )( THIS_ HICON, HDC ) PURE;
};

/* IProcessLock interface */
#undef INTERFACE
#define INTERFACE   IProcessLock
DECLARE_INTERFACE_( IProcessLock, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IProcessLock methods */
    STDMETHOD_( ULONG, AddRefOnProcess )( THIS ) PURE;
    STDMETHOD_( ULONG, ReleaseOnProcess )( THIS ) PURE;
};

/* ISurrogateService interface */
#undef INTERFACE
#define INTERFACE   ISurrogateService
DECLARE_INTERFACE_( ISurrogateService, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* ISurrogateService methods */
    STDMETHOD( Init )( THIS_ REFGUID, IProcessLock *, BOOL * ) PURE;
    STDMETHOD( ApplicationLaunch )( THIS_ REFGUID, ApplicationType ) PURE;
    STDMETHOD( ApplicationFree )( THIS_ REFGUID ) PURE;
    STDMETHOD( CatalogRefresh )( THIS_ ULONG ) PURE;
    STDMETHOD( ProcessShutdown )( THIS_ ShutdownType ) PURE;
};

/* IComThreadingInfo interface */
#undef INTERFACE
#define INTERFACE   IComThreadingInfo
DECLARE_INTERFACE_( IComThreadingInfo, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IComThreadingInfo methods */
    STDMETHOD( GetCurrentApartmentType )( THIS_ APTTYPE * ) PURE;
    STDMETHOD( GetCurrentThreadType )( THIS_ THDTYPE * ) PURE;
    STDMETHOD( GetCurrentLogicalThreadId )( THIS_ GUID * ) PURE;
    STDMETHOD( SetCurrentLogicalThreadId )( THIS_ REFGUID ) PURE;
};

/* IProcessInitControl interface */
#undef INTERFACE
#define INTERFACE   IProcessInitControl
DECLARE_INTERFACE_( IProcessInitControl, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IProcessInitControl methods */
    STDMETHOD( ResetInitializerTimeout )( THIS_ DWORD ) PURE;
};

/* IInitializeSpy interface */
#if (_WIN32_WINNT >= 0x0501)
#undef INTERFACE
#define INTERFACE   IInitializeSpy
DECLARE_INTERFACE_( IInitializeSpy, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;
    
    /* IInitializeSpy methods */
    STDMETHOD( PreInitialize )( THIS_ DWORD, DWORD ) PURE;
    STDMETHOD( PostInitialize )( THIS_ HRESULT, DWORD, DWORD ) PURE;
    STDMETHOD( PreUninitialize )( THIS_ DWORD ) PURE;
    STDMETHOD( PostUninitialize )( THIS_ DWORD ) PURE;
};
typedef IInitializeSpy  *LPINITIALIZESPY;
#endif

/* C object macros */
#if (!defined( __cplusplus ) || defined( CINTERFACE )) && defined( COBJMACROS )
    #define IMarshal_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IMarshal_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IMarshal_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IMarshal_GetUnmarshalClass( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->GetUnmarshalClass( x, p1, p2, p3, p4, p5, p6 )
    #define IMarshal_GetMarshalSizeMax( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->GetMarshalSizeMax( x, p1, p2, p3, p4, p5, p6 )
    #define IMarshal_MarshalInterface( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->MarshalInterface( x, p1, p2, p3, p4, p5, p6 )
    #define IMarshal_UnmarshalInterface( x, p1, p2, p3 ) \
        (x)->lpVtbl->UnmarshalInterface( x, p1, p2, p3 )
    #define IMarshal_ReleaseMarshalData( x, p ) \
        (x)->lpVtbl->ReleaseMarshalData( x, p )
    #define IMarshal_DisconnectObject( x, p ) \
        (x)->lpVtbl->DisconnectObject( x, p )
    #define IMarshal2_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IMarshal2_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IMarshal2_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IMarshal2_GetUnmarshalClass( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->GetUnmarshalClass( x, p1, p2, p3, p4, p5, p6 )
    #define IMarshal2_GetMarshalSizeMax( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->GetMarshalSizeMax( x, p1, p2, p3, p4, p5, p6 )
    #define IMarshal2_MarshalInterface( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->MarshalInterface( x, p1, p2, p3, p4, p5, p6 )
    #define IMarshal2_UnmarshalInterface( x, p1, p2, p3 ) \
        (x)->lpVtbl->UnmarshalInterface( x, p1, p2, p3 )
    #define IMarshal2_ReleaseMarshalData( x, p ) \
        (x)->lpVtbl->ReleaseMarshalData( x, p )
    #define IMarshal2_DisconnectObject( x, p ) \
        (x)->lpVtbl->DisconnectObject( x, p )
    #define IMalloc_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IMalloc_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IMalloc_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IMalloc_Alloc( x, p ) \
        (x)->lpVtbl->Alloc( x, p )
    #define IMalloc_Realloc( x, p1, p2 ) \
        (x)->lpVtbl->Realloc( x, p1, p2 )
    #define IMalloc_Free( x, p ) \
        (x)->lpVtbl->Free( x, p )
    #define IMalloc_GetSize( x, p ) \
        (x)->lpVtbl->GetSize( x, p )
    #define IMalloc_DidAlloc( x, p ) \
        (x)->lpVtbl->DidAlloc( x, p )
    #define IMalloc_HeapMinimize( x ) \
        (x)->lpVtbl->HeapMinimize( x )
    #define IMallocSpy_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IMallocSpy_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IMallocSpy_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IMallocSpy_PreAlloc( x, p ) \
        (x)->lpVtbl->PreAlloc( x, p )
    #define IMallocSpy_PostAlloc( x, p ) \
        (x)->lpVtbl->PostAlloc( x, p )
    #define IMallocSpy_PreFree( x, p1, p2 ) \
        (x)->lpVtbl->PreFree( x, p1, p2 )
    #define IMallocSpy_PostFree( x, p ) \
        (x)->lpVtbl->PostFree( x, p )
    #define IMallocSpy_PreRealloc( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->PreRealloc( x, p1, p2, p3, p4 )
    #define IMallocSpy_PostRealloc( x, p1, p2 ) \
        (x)->lpVtbl->PostRealloc( x, p1, p2 )
    #define IMallocSpy_PreGetSize( x, p1, p2 ) \
        (x)->lpVtbl->PreGetSize( x, p1, p2 )
    #define IMallocSpy_PostGetSize( x, p1, p2 ) \
        (x)->lpVtbl->PostGetSize( x, p1, p2 )
    #define IMallocSpy_PreDidAlloc( x, p1, p2 ) \
        (x)->lpVtbl->PreDidAlloc( x, p1, p2 )
    #define IMallocSpy_PostDidAlloc( x, p1, p2, p3 ) \
        (x)->lpVtbl->PostDidAlloc( x, p1, p2, p3 )
    #define IMallocSpy_PreHeapMinimize( x ) \
        (x)->lpVtbl->PreHeapMinimize( x )
    #define IMallocSpy_PostHeapMinimize( x ) \
        (x)->lpVtbl->PostHeapMinimize( x )
    #define IStdMarshalInfo_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IStdMarshalInfo_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IStdMarshalInfo_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IStdMarshalInfo_GetClassForHandler( x, p1, p2, p3 ) \
        (x)->lpVtbl->GetClassForHandler( x, p1, p2, p3 )
    #define IExternalConnection_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IExternalConnection_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IExternalConnection_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IExternalConnection_AddConnection( x, p1, p2 ) \
        (x)->lpVtbl->AddConnection( x, p1, p2 )
    #define IExternalConnection_ReleaseConnection( x, p1, p2, p3 ) \
        (x)->lpVtbl->ReleaseConnection( x, p1, p2, p3 )
    #define IMultiQI_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IMultiQI_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IMultiQI_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IMultiQI_QueryMultipleInterfaces( x, p1, p2 ) \
        (x)->lpVtbl->QueryMultipleInterfaces( x, p1, p2 )
    #define IInternalUnknown_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IInternalUnknown_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IInternalUnknown_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IInternalUnknown_QueryInternalInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInternalInterface( x, p1, p2 )
    #define IEnumUnknown_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IEnumUnknown_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IEnumUnknown_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IEnumUnknown_Next( x, p1, p2, p3 ) \
        (x)->lpVtbl->Next( x, p1, p2, p3 )
    #define IEnumUnknown_Skip( x, p ) \
        (x)->lpVtbl->Skip( x, p )
    #define IEnumUnknown_Reset( x ) \
        (x)->lpVtbl->Reset( x )
    #define IEnumUnknown_Clone( x, p ) \
        (x)->lpVtbl->Clone( x, p )
    #define IBindCtx_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IBindCtx_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IBindCtx_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IBindCtx_RegisterObjectBound( x, p ) \
        (x)->lpVtbl->RegisterObjectBound( x, p )
    #define IBindCtx_RevokeObjectBound( x, p ) \
        (x)->lpVtbl->RevokeObjectBound( x, p )
    #define IBindCtx_ReleaseBoundObjects( x ) \
        (x)->lpVtbl->ReleaseBoundObjects( x )
    #define IBindCtx_SetBindOptions( x, p ) \
        (x)->lpVtbl->SetBindOptions( x, p )
    #define IBindCtx_GetBindOptions( x, p ) \
        (x)->lpVtbl->GetBindOptions( x, p )
    #define IBindCtx_GetRunningObjectTable( x, p ) \
        (x)->lpVtbl->GetRunningObjectTable( x, p )
    #define IBindCtx_RegisterObjectParam( x, p1, p2 ) \
        (x)->lpVtbl->RegisterObjectParam( x, p1, p2 )
    #define IBindCtx_GetObjectParam( x, p1, p2 ) \
        (x)->lpVtbl->GetObjectParam( x, p1, p2 )
    #define IBindCtx_EnumObjectParam( x, p ) \
        (x)->lpVtbl->EnumObjectParam( x, p )
    #define IBindCtx_RevokeObjectParam( x, p ) \
        (x)->lpVtbl->RevokeObjectParam( x, p )
    #define IEnumMoniker_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IEnumMoniker_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IEnumMoniker_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IEnumMoniker_Next( x, p1, p2, p3 ) \
        (x)->lpVtbl->Next( x, p1, p2, p3 )
    #define IEnumMoniker_Skip( x, p ) \
        (x)->lpVtbl->Skip( x, p )
    #define IEnumMoniker_Reset( x ) \
        (x)->lpVtbl->Reset( x )
    #define IEnumMoniker_Clone( x, p ) \
        (x)->lpVtbl->Clone( x, p )
    #define IRunnableObject_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRunnableObject_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRunnableObject_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IRunnableObject_GetRunningClass( x, p ) \
        (x)->lpVtbl->GetRunningClass( x, p )
    #define IRunnableObject_Run( x, p ) \
        (x)->lpVtbl->Run( x, p )
    #define IRunnableObject_IsRunning( x ) \
        (x)->lpVtbl->IsRunning( x )
    #define IRunnableObject_LockRunning( x, p1, p2 ) \
        (x)->lpVtbl->LockRunning( x, p1, p2 )
    #define IRunnableObject_SetContainedObject( x, p ) \
        (x)->lpVtbl->SetContainedObject( x, p )
    #define IRunningObjectTable_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRunningObjectTable_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRunningObjectTable_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IRunningObjectTable_Register( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->Register( x, p1, p2, p3, p4 )
    #define IRunningObjectTable_Revoke( x, p ) \
        (x)->lpVtbl->Revoke( x, p )
    #define IRunningObjectTable_IsRunning( x, p ) \
        (x)->lpVtbl->IsRunning( x, p )
    #define IRunningObjectTable_GetObject( x, p1, p2 ) \
        (x)->lpVtbl->GetObject( x, p1, p2 )
    #define IRunningObjectTable_NoteChangeTime( x, p1, p2 ) \
        (x)->lpVtbl->NoteChangeTime( x, p1, p2 )
    #define IRunningObjectTable_GetTimeOfLastChange( x, p1, p2 ) \
        (x)->lpVtbl->GetTimeOfLastChange( x, p1, p2 )
    #define IRunningObjectTable_EnumRunning( x, p ) \
        (x)->lpVtbl->EnumRunning( x, p )
    #define IPersist_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IPersist_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IPersist_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IPersist_GetClassID( x, p ) \
        (x)->lpVtbl->GetClassID( x, p )
    #define IPersistStream_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IPersistStream_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IPersistStream_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IPersistStream_GetClassID( x, p ) \
        (x)->lpVtbl->GetClassID( x, p )
    #define IPersistStream_IsDirty( x ) \
        (x)->lpVtbl->IsDirty( x )
    #define IPersistStream_Load( x, p ) \
        (x)->lpVtbl->Load( x, p )
    #define IPersistStream_Save( x, p1, p2 ) \
        (x)->lpVtbl->Save( x, p1, p2 )
    #define IPersistStream_GetSizeMax( x, p ) \
        (x)->lpVtbl->GetSizeMax( x, p )
    #define IMoniker_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IMoniker_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IMoniker_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IMoniker_GetClassID( x, p ) \
        (x)->lpVtbl->GetClassID( x, p )
    #define IMoniker_IsDirty( x ) \
        (x)->lpVtbl->IsDirty( x )
    #define IMoniker_Load( x, p ) \
        (x)->lpVtbl->Load( x, p )
    #define IMoniker_Save( x, p1, p2 ) \
        (x)->lpVtbl->Save( x, p1, p2 )
    #define IMoniker_GetSizeMax( x, p ) \
        (x)->lpVtbl->GetSizeMax( x, p )
    #define IMoniker_BindToObject( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->BindToObject( x, p1, p2, p3, p4 )
    #define IMoniker_BindToStorage( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->BindToStorage( x, p1, p2, p3, p4 )
    #define IMoniker_Reduce( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->Reduce( x, p1, p2, p3, p4 )
    #define IMoniker_ComposeWith( x, p1, p2, p3 ) \
        (x)->lpVtbl->ComposeWith( x, p1, p2, p3 )
    #define IMoniker_Enum( x, p1, p2 ) \
        (x)->lpVtbl->Enum( x, p1, p2 )
    #define IMoniker_IsEqual( x, p ) \
        (x)->lpVtbl->IsEqual( x, p )
    #define IMoniker_Hash( x, p ) \
        (x)->lpVtbl->Hash( x, p )
    #define IMoniker_IsRunning( x, p1, p2, p3 ) \
        (x)->lpVtbl->IsRunning( x, p1, p2, p3 )
    #define IMoniker_GetTimeOfLastChange( x, p1, p2, p3 ) \
        (x)->lpVtbl->GetTimeOfLastChange( x, p1, p2, p3 )
    #define IMoniker_Inverse( x, p ) \
        (x)->lpVtbl->Inverse( x, p )
    #define IMoniker_CommonPrefixWith( x, p1, p2 ) \
        (x)->lpVtbl->CommonPrefixWith( x, p1, p2 )
    #define IMoniker_RelativePathTo( x, p1, p2 ) \
        (x)->lpVtbl->RelativePathTo( x, p1, p2 )
    #define IMoniker_GetDisplayName( x, p1, p2, p3 ) \
        (x)->lpVtbl->GetDisplayName( x, p1, p2, p3 )
    #define IMoniker_ParseDisplayName( x, p1, p2, p3, p4, p5 ) \
        (x)->lpVtbl->ParseDisplayName( x, p1, p2, p3, p4, p5 )
    #define IMoniker_IsSystemMoniker( x, p ) \
        (x)->lpVtbl->IsSystemMoniker( x, p )
    #define IROTData_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IROTData_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IROTData_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IROTData_GetComparisonData( x, p1, p2, p3 ) \
        (x)->lpVtbl->GetComparisonData( x, p1, p2, p3 )
    #define IEnumString_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IEnumString_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IEnumString_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IEnumString_Next( x, p1, p2, p3 ) \
        (x)->lpVtbl->Next( x, p1, p2, p3 )
    #define IEnumString_Skip( x, p ) \
        (x)->lpVtbl->Skip( x, p )
    #define IEnumString_Reset( x ) \
        (x)->lpVtbl->Reset( x )
    #define IEnumString_Clone( x, p ) \
        (x)->lpVtbl->Clone( x, p )
    #define ISequentialStream_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ISequentialStream_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ISequentialStream_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ISequentialStream_Read( x, p1, p2, p3 ) \
        (x)->lpVtbl->Read( x, p1, p2, p3 )
    #define ISequentialStream_Write( x, p1, p2, p3 ) \
        (x)->lpVtbl->Write( x, p1, p2, p3 )
    #define IStream_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IStream_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IStream_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IStream_Read( x, p1, p2, p3 ) \
        (x)->lpVtbl->Read( x, p1, p2, p3 )
    #define IStream_Write( x, p1, p2, p3 ) \
        (x)->lpVtbl->Write( x, p1, p2, p3 )
    #define IStream_Seek( x, p1, p2, p3 ) \
        (x)->lpVtbl->Seek( x, p1, p2, p3 )
    #define IStream_SetSize( x, p ) \
        (x)->lpVtbl->SetSize( x, p )
    #define IStream_CopyTo( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->CopyTo( x, p1, p2, p3, p4 )
    #define IStream_Commit( x, p ) \
        (x)->lpVtbl->Commit( x, p )
    #define IStream_Revert( x ) \
        (x)->lpVtbl->Revert( x )
    #define IStream_LockRegion( x, p1, p2, p3 ) \
        (x)->lpVtbl->LockRegion( x, p1, p2, p3 )
    #define IStream_UnlockRegion( x, p1, p2, p3 ) \
        (x)->lpVtbl->UnlockRegion( x, p1, p2, p3 )
    #define IStream_Stat( x, p1, p2 ) \
        (x)->lpVtbl->Stat( x, p1, p2 )
    #define IStream_Clone( x, p ) \
        (x)->lpVtbl->Clone( x, p )
    #define IEnumSTATSTG_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IEnumSTATSTG_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IEnumSTATSTG_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IEnumSTATSTG_Next( x, p1, p2, p3 ) \
        (x)->lpVtbl->Next( x, p1, p2, p3 )
    #define IEnumSTATSTG_Skip( x, p ) \
        (x)->lpVtbl->Skip( x, p )
    #define IEnumSTATSTG_Reset( x ) \
        (x)->lpVtbl->Reset( x )
    #define IEnumSTATSTG_Clone( x, p ) \
        (x)->lpVtbl->Clone( x, p )
    #define IStorage_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IStorage_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IStorage_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IStorage_CreateStream( x, p1, p2, p3, p4, p5 ) \
        (x)->lpVtbl->CreateStream( x, p1, p2, p3, p4, p5 )
    #define IStorage_OpenStream( x, p1, p2, p3, p4, p5 ) \
        (x)->lpVtbl->OpenStream( x, p1, p2, p3, p4, p5 )
    #define IStorage_CreateStorage( x, p1, p2, p3, p4, p5 ) \
        (x)->lpVtbl->CreateStorage( x, p1, p2, p3, p4, p5 )
    #define IStorage_OpenStorage( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->OpenStorage( x, p1, p2, p3, p4, p5, p6 )
    #define IStorage_CopyTo( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->CopyTo( x, p1, p2, p3, p4 )
    #define IStorage_MoveElementTo( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->MoveElementTo( x, p1, p2, p3, p4 )
    #define IStorage_Commit( x, p ) \
        (x)->lpVtbl->Commit( x, p )
    #define IStorage_Revert( x ) \
        (x)->lpVtbl->Revert( x )
    #define IStorage_EnumElements( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->EnumElements( x, p1, p2, p3, p4 )
    #define IStorage_DestroyElement( x, p ) \
        (x)->lpVtbl->DestroyElement( x, p )
    #define IStorage_RenameElement( x, p1, p2 ) \
        (x)->lpVtbl->RenameElement( x, p1, p2 )
    #define IStorage_SetElementTimes( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->SetElementTimes( x, p1, p2, p3, p4 )
    #define IStorage_SetClass( x, p ) \
        (x)->lpVtbl->SetClass( x, p )
    #define IStorage_SetStateBits( x, p1, p2 ) \
        (x)->lpVtbl->SetStateBits( x, p1, p2 )
    #define IStorage_Stat( x, p1, p2 ) \
        (x)->lpVtbl->Stat( x, p1, p2 )
    #define IPersistFile_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IPersistFile_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IPersistFile_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IPersistFile_GetClassID( x, p ) \
        (x)->lpVtbl->GetClassID( x, p )
    #define IPersistFile_IsDirty( x ) \
        (x)->lpVtbl->IsDirty( x )
    #define IPersistFile_Load( x, p1, p2 ) \
        (x)->lpVtbl->Load( x, p1, p2 )
    #define IPersistFile_Save( x, p1, p2 ) \
        (x)->lpVtbl->Save( x, p1, p2 )
    #define IPersistFile_SaveCompleted( x, p ) \
        (x)->lpVtbl->SaveCompleted( x, p )
    #define IPersistFile_GetCurFile( x, p ) \
        (x)->lpVtbl->GetCurFile( x, p )
    #define IPersistStorage_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IPersistStorage_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IPersistStorage_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IPersistStorage_GetClassID( x, p ) \
        (x)->lpVtbl->GetClassID( x, p )
    #define IPersistStorage_IsDirty( x ) \
        (x)->lpVtbl->IsDirty( x )
    #define IPersistStorage_InitNew( x, p ) \
        (x)->lpVtbl->InitNew( x, p )
    #define IPersistStorage_Load( x, p ) \
        (x)->lpVtbl->Load( x, p )
    #define IPersistStorage_Save( x, p1, p2 ) \
        (x)->lpVtbl->Save( x, p1, p2 )
    #define IPersistStorage_SaveCompleted( x, p ) \
        (x)->lpVtbl->SaveCompleted( x, p )
    #define IPersistStorage_HandsOffStorage( x ) \
        (x)->lpVtbl->HandsOffStorage( x )
    #define ILockBytes_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ILockBytes_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ILockBytes_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ILockBytes_ReadAt( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->ReadAt( x, p1, p2, p3, p4 )
    #define ILockBytes_WriteAt( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->WriteAt( x, p1, p2, p3, p4 )
    #define ILockBytes_Flush( x ) \
        (x)->lpVtbl->Flush( x )
    #define ILockBytes_SetSize( x, p ) \
        (x)->lpVtbl->SetSize( x, p )
    #define ILockBytes_LockRegion( x, p1, p2, p3 ) \
        (x)->lpVtbl->LockRegion( x, p1, p2, p3 )
    #define ILockBytes_UnlockRegion( x, p1, p2, p3 ) \
        (x)->lpVtbl->UnlockRegion( x, p1, p2, p3 )
    #define ILockBytes_Stat( x, p1, p2 ) \
        (x)->lpVtbl->Stat( x, p1, p2 )
    #define IEnumFORMATETC_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IEnumFORMATETC_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IEnumFORMATETC_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IEnumFORMATETC_Next( x, p1, p2, p3 ) \
        (x)->lpVtbl->Next( x, p1, p2, p3 )
    #define IEnumFORMATETC_Skip( x, p ) \
        (x)->lpVtbl->Skip( x, p )
    #define IEnumFORMATETC_Reset( x ) \
        (x)->lpVtbl->Reset( x )
    #define IEnumFORMATETC_Clone( x, p ) \
        (x)->lpVtbl->Clone( x, p )
    #define IEnumSTATDATA_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IEnumSTATDATA_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IEnumSTATDATA_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IEnumSTATDATA_Next( x, p1, p2, p3 ) \
        (x)->lpVtbl->Next( x, p1, p2, p3 )
    #define IEnumSTATDATA_Skip( x, p ) \
        (x)->lpVtbl->Skip( x, p )
    #define IEnumSTATDATA_Reset( x ) \
        (x)->lpVtbl->Reset( x )
    #define IEnumSTATDATA_Clone( x, p ) \
        (x)->lpVtbl->Clone( x, p )
    #define IRootStorage_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRootStorage_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRootStorage_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IAdviseSink_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IAdviseSink_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IAdviseSink_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IAdviseSink_OnDataChange( x, p1, p2 ) \
        (x)->lpVtbl->OnDataChange( x, p1, p2 )
    #define IAdviseSink_OnViewChange( x, p1, p2 ) \
        (x)->lpVtbl->OnViewChange( x, p1, p2 )
    #define IAdviseSink_OnRename( x, p ) \
        (x)->lpVtbl->OnRename( x, p )
    #define IAdviseSink_OnSave( x ) \
        (x)->lpVtbl->OnSave( x )
    #define IAdviseSink_OnClose( x ) \
        (x)->lpVtbl->OnClose( x )
    #define IAdviseSink2_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IAdviseSink2_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IAdviseSink2_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IAdviseSink2_OnDataChange( x, p1, p2 ) \
        (x)->lpVtbl->OnDataChange( x, p1, p2 )
    #define IAdviseSink2_OnViewChange( x, p1, p2 ) \
        (x)->lpVtbl->OnViewChange( x, p1, p2 )
    #define IAdviseSink2_OnRename( x, p ) \
        (x)->lpVtbl->OnRename( x, p )
    #define IAdviseSink2_OnSave( x ) \
        (x)->lpVtbl->OnSave( x )
    #define IAdviseSink2_OnClose( x ) \
        (x)->lpVtbl->OnClose( x )
    #define IAdviseSink2_OnLinkSrcChange( x, p ) \
        (x)->lpVtbl->OnLinkSrcChange( x, p )
    #define IDataObject_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IDataObject_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IDataObject_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IDataObject_GetData( x, p1, p2 ) \
        (x)->lpVtbl->GetData( x, p1, p2 )
    #define IDataObject_GetDataHere( x, p1, p2 ) \
        (x)->lpVtbl->GetDataHere( x, p1, p2 )
    #define IDataObject_QueryGetData( x, p ) \
        (x)->lpVtbl->QueryGetData( x, p )
    #define IDataObject_GetCanonicalFormatEtc( x, p1, p2 ) \
        (x)->lpVtbl->GetCanonicalFormatEtc( x, p1, p2 )
    #define IDataObject_SetData( x, p1, p2, p3 ) \
        (x)->lpVtbl->SetData( x, p1, p2, p3 )
    #define IDataObject_EnumFormatEtc( x, p1, p2 ) \
        (x)->lpVtbl->EnumFormatEtc( x, p1, p2 )
    #define IDataObject_DAdvise( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->DAdvise( x, p1, p2, p3, p4 )
    #define IDataObject_DUnadvise( x, p ) \
        (x)->lpVtbl->DUnadvise( x, p )
    #define IDataObject_EnumDAdvise( x, p ) \
        (x)->lpVtbl->EnumDAdvise( x, p )
    #define IDataAdviseHolder_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IDataAdviseHolder_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IDataAdviseHolder_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IDataAdviseHolder_Advise( x, p1, p2, p3, p4, p5 ) \
        (x)->lpVtbl->Advise( x, p1, p2, p3, p4, p5 )
    #define IDataAdviseHolder_Unadvise( x, p ) \
        (x)->lpVtbl->Unadvise( x, p )
    #define IDataAdviseHolder_EnumAdvise( x, p ) \
        (x)->lpVtbl->EnumAdvise( x, p )
    #define IDataAdviseHolder_SendOnDataChange( x, p1, p2, p3 ) \
        (x)->lpVtbl->SendOnDataChange( x, p1, p2, p3 )
    #define IMessageFilter_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IMessageFilter_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IMessageFilter_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IMessageFilter_HandleInComingCall( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->HandleInComingCall( x, p1, p2, p3, p4 )
    #define IMessageFilter_RetryRejectedCall( x, p1, p2 ) \
        (x)->lpVtbl->RetryRejectedCall( x, p1, p2 )
    #define IMessageFilter_MessagePending( x, p1, p2, p3 ) \
        (x)->lpVtbl->MessagePending( x, p1, p2, p3 )
    #define IRpcChannelBuffer_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRpcChannelBuffer_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRpcChannelBuffer_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IRpcChannelBuffer_GetBuffer( x, p1, p2 ) \
        (x)->lpVtbl->GetBuffer( x, p1, p2 )
    #define IRpcChannelBuffer_SendReceive( x, p1, p2 ) \
        (x)->lpVtbl->SendReceive( x, p1, p2 )
    #define IRpcChannelBuffer_FreeBuffer( x, p ) \
        (x)->lpVtbl->FreeBuffer( x, p )
    #define IRpcChannelBuffer_GetDestCtx( x, p1, p2 ) \
        (x)->lpVtbl->GetDestCtx( x, p1, p2 )
    #define IRpcChannelBuffer_IsConnected( x ) \
        (x)->lpVtbl->IsConnected( x )
    #define IRpcChannelBuffer2_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRpcChannelBuffer2_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRpcChannelBuffer2_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IRpcChannelBuffer2_GetBuffer( x, p1, p2 ) \
        (x)->lpVtbl->GetBuffer( x, p1, p2 )
    #define IRpcChannelBuffer2_SendReceive( x, p1, p2 ) \
        (x)->lpVtbl->SendReceive( x, p1, p2 )
    #define IRpcChannelBuffer2_FreeBuffer( x, p ) \
        (x)->lpVtbl->FreeBuffer( x, p )
    #define IRpcChannelBuffer2_GetDestCtx( x, p1, p2 ) \
        (x)->lpVtbl->GetDestCtx( x, p1, p2 )
    #define IRpcChannelBuffer2_IsConnected( x ) \
        (x)->lpVtbl->IsConnected( x )
    #define IRpcChannelBuffer2_GetProtocolVersion( x, p ) \
        (x)->lpVtbl->GetProtocolVersion( x, p )
    #define IAsyncRpcChannelBuffer_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IAsyncRpcChannelBuffer_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IAsyncRpcChannelBuffer_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IAsyncRpcChannelBuffer_GetBuffer( x, p1, p2 ) \
        (x)->lpVtbl->GetBuffer( x, p1, p2 )
    #define IAsyncRpcChannelBuffer_SendReceive( x, p1, p2 ) \
        (x)->lpVtbl->SendReceive( x, p1, p2 )
    #define IAsyncRpcChannelBuffer_FreeBuffer( x, p ) \
        (x)->lpVtbl->FreeBuffer( x, p )
    #define IAsyncRpcChannelBuffer_GetDestCtx( x, p1, p2 ) \
        (x)->lpVtbl->GetDestCtx( x, p1, p2 )
    #define IAsyncRpcChannelBuffer_IsConnected( x ) \
        (x)->lpVtbl->IsConnected( x )
    #define IAsyncRpcChannelBuffer_GetProtocolVersion( x, p ) \
        (x)->lpVtbl->GetProtocolVersion( x, p )
    #define IAsyncRpcChannelBuffer_Send( x, p1, p2, p3 ) \
        (x)->lpVtbl->Send( x, p1, p2, p3 )
    #define IAsyncRpcChannelBuffer_Receive( x, p1, p2 ) \
        (x)->lpVtbl->Receive( x, p1, p2 )
    #define IAsyncRpcChannelBuffer_GetDestCtxEx( x, p1, p2, p3 ) \
        (x)->lpVtbl->GetDestCtxEx( x, p1, p2, p3 )
    #define IRpcChannelBuffer3_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRpcChannelBuffer3_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRpcChannelBuffer3_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IRpcChannelBuffer3_GetBuffer( x, p1, p2 ) \
        (x)->lpVtbl->GetBuffer( x, p1, p2 )
    #define IRpcChannelBuffer3_SendReceive( x, p1, p2 ) \
        (x)->lpVtbl->SendReceive( x, p1, p2 )
    #define IRpcChannelBuffer3_FreeBuffer( x, p ) \
        (x)->lpVtbl->FreeBuffer( x, p )
    #define IRpcChannelBuffer3_GetDestCtx( x, p1, p2 ) \
        (x)->lpVtbl->GetDestCtx( x, p1, p2 )
    #define IRpcChannelBuffer3_IsConnected( x ) \
        (x)->lpVtbl->IsConnected( x )
    #define IRpcChannelBuffer3_GetProtocolVersion( x, p ) \
        (x)->lpVtbl->GetProtocolVersion( x, p )
    #define IRpcChannelBuffer3_Send( x, p1, p2 ) \
        (x)->lpVtbl->Send( x, p1, p2 )
    #define IRpcChannelBuffer3_Receive( x, p1, p2, p3 ) \
        (x)->lpVtbl->Receive( x, p1, p2, p3 )
    #define IRpcChannelBuffer3_Cancel( x, p ) \
        (x)->lpVtbl->Cancel( x, p )
    #define IRpcChannelBuffer3_GetCallContext( x, p1, p2, p3 ) \
        (x)->lpVtbl->GetCallContext( x, p1, p2, p3 )
    #define IRpcChannelBuffer3_GetDestCtxEx( x, p1, p2, p3 ) \
        (x)->lpVtbl->GetDestCtxEx( x, p1, p2, p3 )
    #define IRpcChannelBuffer3_GetState( x, p1, p2 ) \
        (x)->lpVtbl->GetState( x, p1, p2 )
    #define IRpcChannelBuffer3_RegisterAsync( x, p1, p2 ) \
        (x)->lpVtbl->RegisterAsync( x, p1, p2 )
    #define IRpcSyntaxNegotiate_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRpcSyntaxNegotiate_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRpcSyntaxNegotiate_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IRpcSyntaxNegotiate_NegotiateSyntax( x, p ) \
        (x)->lpVtbl->NegotiateSyntax( x, p )
    #define IRpcProxyBuffer_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRpcProxyBuffer_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRpcProxyBuffer_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IRpcProxyBuffer_Connect( x, p ) \
        (x)->lpVtbl->Connect( x, p )
    #define IRpcProxyBuffer_Disconnect( x ) \
        (x)->lpVtbl->Disconnect( x )
    #define IRpcStubBuffer_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRpcStubBuffer_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRpcStubBuffer_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IRpcStubBuffer_Connect( x, p ) \
        (x)->lpVtbl->Connect( x, p )
    #define IRpcStubBuffer_Disconnect( x ) \
        (x)->lpVtbl->Disconnect( x )
    #define IRpcStubBuffer_Invoke( x, p1, p2 ) \
        (x)->lpVtbl->Invoke( x, p1, p2 )
    #define IRpcStubBuffer_IsIIDSupported( x, p ) \
        (x)->lpVtbl->IsIIDSupported( x, p )
    #define IRpcStubBuffer_CountRefs( x ) \
        (x)->lpVtbl->CountRefs( x )
    #define IRpcStubBuffer_DebugServerQueryInterface( x, p ) \
        (x)->lpVtbl->DebugServerQueryInterface( x, p )
    #define IRpcStubBuffer_DebugServerRelease( x, p ) \
        (x)->lpVtbl->DebugServerRelease( x, p )
    #define IPSFactoryBuffer_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IPSFactoryBuffer_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IPSFactoryBuffer_Release( x ) \
        (x)->lpVtbl->Release( x )
    #if (_WIN32_WINNT >= 0x0400)
        #define IChannelHook_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IChannelHook_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IChannelHook_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IChannelHook_ClientGetSize( x, p1, p2, p3 ) \
            (x)->lpVtbl->ClientGetSize( x, p1, p2, p3 )
        #define IChannelHook_ClientFillBuffer( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->ClientFillBuffer( x, p1, p2, p3, p4 )
        #define IChannelHook_ClientNotify( x, p1, p2, p3, p4, p5, p6 ) \
            (x)->lpVtbl->ClientNotify( x, p1, p2, p3, p4, p5, p6 )
        #define IChannelHook_ServerNotify( x, p1, p2, p3, p4, p5 ) \
            (x)->lpVtbl->ServerNotify( x, p1, p2, p3, p4, p5 )
        #define IChannelHook_ServerGetSize( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->ServerGetSize( x, p1, p2, p3, p4 )
        #define IChannelHook_ServerFillBuffer( x, p1, p2, p3, p4, p5 ) \
            (x)->lpVtbl->ServerFillBuffer( x, p1, p2, p3, p4, p5 )
        #define IClientSecurity_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IClientSecurity_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IClientSecurity_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IClientSecurity_QueryBlanket( x, p1, p2, p3, p4, p5, p6, p7, p8 ) \
            (x)->lpVtbl->QueryBlanket( x, p1, p2, p3, p4, p5, p6, p7, p8 )
        #define IClientSecurity_SetBlanket( x, p1, p2, p3, p4, p5, p6, p7, p8 ) \
            (x)->lpVtbl->SetBlanket( x, p1, p2, p3, p4, p5, p6, p7, p8 )
        #define IClientSecurity_CopyProxy( x, p1, p2 ) \
            (x)->lpVtbl->CopyProxy( x, p1, p2 )
        #define IServerSecurity_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IServerSecurity_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IServerSecurity_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IServerSecurity_QueryBlanket( x, p1, p2, p3, p4, p5, p6, p7 ) \
            (x)->lpVtbl->QueryBlanket( x, p1, p2, p3, p4, p5, p6, p7 )
        #define IServerSecurity_ImpersonateClient( x ) \
            (x)->lpVtbl->ImpersonateClient( x )
        #define IServerSecurity_RevertToSelf( x ) \
            (x)->lpVtbl->RevertToSelf( x )
        #define IServerSecurity_IsImpersonating( x ) \
            (x)->lpVtbl->IsImpersonating( x )
        #define IClassActivator_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IClassActivator_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IClassActivator_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IClassActivator_GetClassObject( x, p1, p2, p3, p4, p5 ) \
            (x)->lpVtbl->GetClassObject( x, p1, p2, p3, p4, p5 )
        #define IRpcOptions_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IRpcOptions_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IRpcOptions_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IRpcOptions_Set( x, p1, p2, p3 ) \
            (x)->lpVtbl->Set( x, p1, p2, p3 )
        #define IRpcOptions_Query( x, p1, p2, p3 ) \
            (x)->lpVtbl->Query( x, p1, p2, p3 )
        #define IGlobalOptions_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IGlobalOptions_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IGlobalOptions_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IGlobalOptions_Set( x, p1, p2 ) \
            (x)->lpVtbl->Set( x, p1, p2 )
        #define IGlobalOptions_Query( x, p1, p2 ) \
            (x)->lpVtbl->Query( x, p1, p2 )
    #endif
    #define IFillLockBytes_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IFillLockBytes_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IFillLockBytes_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IFillLockBytes_FillAppend( x, p1, p2, p3 ) \
        (x)->lpVtbl->FillAppend( x, p1, p2, p3 )
    #define IFillLockBytes_FillAt( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->FillAt( x, p1, p2, p3, p4 )
    #define IFillLockBytes_SetFillSize( x, p ) \
        (x)->lpVtbl->SetFillSize( x, p )
    #define IFillLockBytes_Terminate( x, p ) \
        (x)->lpVtbl->Terminate( x, p )
    #define IProgressNotify_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IProgressNotify_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IProgressNotify_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IProgressNotify_OnProgress( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->OnProgress( x, p1, p2, p3, p4 )
    #define ILayoutStorage_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ILayoutStorage_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ILayoutStorage_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ILayoutStorage_LayoutScript( x, p1, p2, p3 ) \
        (x)->lpVtbl->LayoutScript( x, p1, p2, p3 )
    #define ILayoutStorage_BeginMonitor( x ) \
        (x)->lpVtbl->BeginMonitor( x )
    #define ILayoutStorage_EndMonitor( x ) \
        (x)->lpVtbl->EndMonitor( x )
    #define ILayoutStorage_ReLayoutDocfile( x, p ) \
        (x)->lpVtbl->ReLayoutDocfile( x, p )
    #define ILayoutStorage_ReLayoutDocfileOnILockBytes( x, p ) \
        (x)->lpVtbl->ReLayoutDocfileOnILockBytes( x, p )
    #define IBlockingLock_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IBlockingLock_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IBlockingLock_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IBlockingLock_Lock( x, p ) \
        (x)->lpVtbl->Lock( x, p )
    #define IBlockingLock_Unlock( x ) \
        (x)->lpVtbl->Unlock( x )
    #define ITimeAndNoticeControl_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ITimeAndNoticeControl_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ITimeAndNoticeControl_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ITimeAndNoticeControl_SuppressChanges( x, p1, p2 ) \
        (x)->lpVtbl->SuppressChanges( x, p1, p2 )
    #define IOplockStorage_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IOplockStorage_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IOplockStorage_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IOplockStorage_CreateStorageEx( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->CreateStorageEx( x, p1, p2, p3, p4, p5, p6 )
    #define IOplockStorage_OpenStorageEx( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->OpenStorageEx( x, p1, p2, p3, p4, p5, p6 )
    #define ISurrogate_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ISurrogate_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ISurrogate_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ISurrogate_LoadDllServer( x, p ) \
        (x)->lpVtbl->LoadDllServer( x, p )
    #define ISurrogate_FreeSurrogate( x ) \
        (x)->lpVtbl->FreeSurrogate( x )
    #define IGlobalInterfaceTable_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IGlobalInterfaceTable_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IGlobalInterfaceTable_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IGlobalInterfaceTable_RegisterInterfaceInGlobal( x, p1, p2, p3 ) \
        (x)->lpVtbl->RegisterInterfaceInGlobal( x, p1, p2, p3 )
    #define IGlobalInterfaceTable_RevokeInterfaceFromGlobal( x, p ) \
        (x)->lpVtbl->RevokeInterfaceFromGlobal( x, p )
    #define IGlobalInterfaceTable_GetInterfaceFromGlobal( x, p1, p2, p3 ) \
        (x)->lpVtbl->GetInterfaceFromGlobal( x, p1, p2, p3 )
    #define IDirectWriterLock_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IDirectWriterLock_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IDirectWriterLock_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IDirectWriterLock_WaitForWriteAccess( x, p ) \
        (x)->lpVtbl->WaitForWriteAccess( x, p )
    #define IDirectWriterLock_ReleaseWriteAccess( x ) \
        (x)->lpVtbl->ReleaseWriteAccess( x )
    #define IDirectWriterLock_HaveWriteAccess( x ) \
        (x)->lpVtbl->HaveWriteAccess( x )
    #define ISynchronize_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ISynchronize_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ISynchronize_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ISynchronize_Wait( x, p1, p2 ) \
        (x)->lpVtbl->Wait( x, p1, p2 )
    #define ISynchronize_Signal( x ) \
        (x)->lpVtbl->Signal( x )
    #define ISynchronize_Reset( x ) \
        (x)->lpVtbl->Reset( x )
    #define ISynchronizeHandle_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ISynchronizeHandle_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ISynchronizeHandle_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ISynchronizeHandle_GetHandle( x, p ) \
        (x)->lpVtbl->GetHandle( x, p )
    #define ISynchronizeEvent_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ISynchronizeEvent_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ISynchronizeEvent_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ISynchronizeEvent_GetHandle( x, p ) \
        (x)->lpVtbl->GetHandle( x, p )
    #define ISynchronizeEvent_SetEventHandle( x, p ) \
        (x)->lpVtbl->SetEventHandle( x, p )
    #define ISynchronizeContainer_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ISynchronizeContainer_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ISynchronizeContainer_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ISynchronizeContainer_AddSynchronize( x, p ) \
        (x)->lpVtbl->AddSynchronize( x, p )
    #define ISynchronizeContainer_WaitMultiple( x, p1, p2, p3 ) \
        (x)->lpVtbl->WaitMultiple( x, p1, p2, p3 )
    #define ISynchronizeMutex_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ISynchronizeMutex_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ISynchronizeMutex_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ISynchronizeMutex_ReleaseMutex( x ) \
        (x)->lpVtbl->ReleaseMutex( x )
    #define ICancelMethodCalls_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ICancelMethodCalls_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ICancelMethodCalls_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ICancelMethodCalls_Cancel( x, p ) \
        (x)->lpVtbl->Cancel( x, p )
    #define ICancelMethodCalls_TestCancel( x ) \
        (x)->lpVtbl->TestCancel( x )
    #define IAsyncManager_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IAsyncManager_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IAsyncManager_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IAsyncManager_CompleteCall( x, p ) \
        (x)->lpVtbl->CompleteCall( x, p )
    #define IAsyncManager_GetCallContext( x, p1, p2 ) \
        (x)->lpVtbl->GetCallContext( x, p1, p2 )
    #define IAsyncManager_GetState( x, p ) \
        (x)->lpVtbl->GetState( x, p )
    #define ICallFactory_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define ICallFactory_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define ICallFactory_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define ICallFactory_CreateCall( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->CreateCall( x, p1, p2, p3, p4 )
    #define IRpcHelper_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IRpcHelper_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IRpcHelper_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IRpcHelper_GetDCOMProtocolVersion( x, p ) \
        (x)->lpVtbl->GetDCOMProtocolVersion( x, p )
    #define IRpcHelper_GetIIDFromOBJREF( x, p1, p2 ) \
        (x)->lpVtbl->GetIIDFromOBJREF( x, p1, p2 )
    #define IReleaseMarshalBuffers_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IReleaseMarshalBuffers_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IReleaseMarshalBuffers_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IReleaseMarshalBuffers_ReleaseMarshalBuffers( x, p1, p2, p3 ) \
        (x)->lpVtbl->ReleaseMarshalBuffers( x, p1, p2, p3 )
    #define IWaitMultiple_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IWaitMultiple_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IWaitMultiple_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IWaitMultiple_WaitMultiple( x, p1, p2 ) \
        (x)->lpVtbl->WaitMultiple( x, p1, p2 )
    #define IWaitMultiple_AddSynchronize( x, p ) \
        (x)->lpVtbl->AddSynchronize( x, p )
    #define IUrlMon_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IUrlMon_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IUrlMon_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IUrlMon_AsyncGetClassBits( x, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ) \
        (x)->lpVtbl->AsyncGetClassBits( x, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 )
    #define IForegroundTransfer_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IForegroundTransfer_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IForegroundTransfer_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IForegroundTransfer_AllowForegroundTransfer( x, p ) \
        (x)->lpVtbl->AllowForegroundTransfer( x, p )
    #define IAddrTrackingControl_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IAddrTrackingControl_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IAddrTrackingControl_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IAddrTrackingControl_EnableCOMDynamicAddrTracking( x ) \
        (x)->lpVtbl->EnableCOMDynamicAddrTracking( x )
    #define IAddrTrackingControl_DisableCOMDynamicAddrTracking( x ) \
        (x)->lpVtbl->DisableCOMDynamicAddrTracking( x )
    #define IAddrExclusionControl_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IAddrExclusionControl_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IAddrExclusionControl_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IAddrExclusionControl_GetCurrentAddrExclusionList( x, p1, p2 ) \
        (x)->lpVtbl->GetCurrentAddrExclusionList( x, p1, p2 )
    #define IAddrExclusionControl_UpdateAddrExclusionList( x, p ) \
        (x)->lpVtbl->UpdateAddrExclusionList( x, p )
    #define IPipeByte_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IPipeByte_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IPipeByte_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IPipeByte_Pull( x, p1, p2, p3 ) \
        (x)->lpVtbl->Pull( x, p1, p2, p3 )
    #define IPipeByte_Push( x, p1, p2 ) \
        (x)->lpVtbl->Push( x, p1, p2 )
    #define IPipeLong_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IPipeLong_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IPipeLong_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IPipeLong_Pull( x, p1, p2, p3 ) \
        (x)->lpVtbl->Pull( x, p1, p2, p3 )
    #define IPipeLong_Push( x, p1, p2 ) \
        (x)->lpVtbl->Push( x, p1, p2 )
    #define IPipeDouble_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IPipeDouble_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IPipeDouble_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IPipeDouble_Pull( x, p1, p2, p3 ) \
        (x)->lpVtbl->Pull( x, p1, p2, p3 )
    #define IPipeDouble_Push( x, p1, p2 ) \
        (x)->lpVtbl->Push( x, p1, p2 )
    #define IThumbnailExtractor_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IThumbnailExtractor_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IThumbnailExtractor_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IThumbnailExtractor_ExtractThumbnail( x, p1, p2, p3, p4, p5, p6 ) \
        (x)->lpVtbl->ExtractThumbnail( x, p1, p2, p3, p4, p5, p6 )
    #define IThumbnailExtractor_OnFileUpdated( x, p ) \
        (x)->lpVtbl->OnFileUpdated( x, p )
    #define IDummyHICONIncluder_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IDummyHICONIncluder_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IDummyHICONIncluder_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IDummyHICONIncluder_Dummy( x, p1, p2 ) \
        (x)->lpVtbl->Dummy( x, p1, p2 )
    #define IProcessLock_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IProcessLock_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IProcessLock_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IProcessLock_AddRefOnProcess( x ) \
        (x)->lpVtbl->AddRefOnProcess( x )
    #define IProcessLock_ReleaseOnProcess( x ) \
        (x)->lpVtbl->ReleaseOnProcess( x )
    #define IComThreadingInfo_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IComThreadingInfo_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IComThreadingInfo_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IComThreadingInfo_GetCurrentApartmentType( x, p ) \
        (x)->lpVtbl->GetCurrentApartmentType( x, p )
    #define IComThreadingInfo_GetCurrentThreadType( x, p ) \
        (x)->lpVtbl->GetCurrentThreadType( x, p )
    #define IComThreadingInfo_GetCurrentLogicalThreadId( x, p ) \
        (x)->lpVtbl->GetCurrentLogicalThreadId( x, p )
    #define IComThreadingInfo_SetCurrentLogicalThreadId( x, p ) \
        (x)->lpVtbl->SetCurrentLogicalThreadId( x, p )
    #define IProcessInitControl_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IProcessInitControl_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IProcessInitControl_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IProcessInitControl_ResetInitializerTimeout( x, p ) \
        (x)->lpVtbl->ResetInitializerTimeout( x, p )
    #if (_WIN32_WINNT >= 0x0501)
        #define IInitializeSpy_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IInitializeSpy_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IInitializeSpy_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IInitializeSpy_PreInitialize( x, p1, p2 ) \
            (x)->lpVtbl->PreInitialize( x, p1, p2 )
        #define IInitializeSpy_PostInitialize( x, p1, p2, p3 ) \
            (x)->lpVtbl->PostInitialize( x, p1, p2, p3 )
        #define IInitializeSpy_PreUninitialize( x, p ) \
            (x)->lpVtbl->PreUninitialize( x, p )
        #define IInitializeSpy_PostUninitialize( x, p ) \
            (x)->lpVtbl->PostUninitialize( x, p )
    #endif
#endif

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* __objidl_h__ */
