/*** Autogenerated by WIDL 1.5.25 from include/ocidl.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

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

#ifndef __ocidl_h__
#define __ocidl_h__

/* Forward declarations */

#ifndef __IPropertyBag2_FWD_DEFINED__
#define __IPropertyBag2_FWD_DEFINED__
typedef interface IPropertyBag2 IPropertyBag2;
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <oleidl.h>
#include <urlmon.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __IEnumConnections_FWD_DEFINED__
#define __IEnumConnections_FWD_DEFINED__
typedef struct IEnumConnections IEnumConnections;
#endif

#ifndef __IConnectionPoint_FWD_DEFINED__
#define __IConnectionPoint_FWD_DEFINED__
typedef struct IConnectionPoint IConnectionPoint;
#endif

#ifndef __IEnumConnectionPoints_FWD_DEFINED__
#define __IEnumConnectionPoints_FWD_DEFINED__
typedef struct IEnumConnectionPoints IEnumConnectionPoints;
#endif

#ifndef __IConnectionPointContainer_FWD_DEFINED__
#define __IConnectionPointContainer_FWD_DEFINED__
typedef struct IConnectionPointContainer IConnectionPointContainer;
#endif

#ifndef __IClassFactory2_FWD_DEFINED__
#define __IClassFactory2_FWD_DEFINED__
typedef struct IClassFactory2 IClassFactory2;
#endif

#ifndef __IProvideClassInfo_FWD_DEFINED__
#define __IProvideClassInfo_FWD_DEFINED__
typedef struct IProvideClassInfo IProvideClassInfo;
#endif

#ifndef __IProvideClassInfo2_FWD_DEFINED__
#define __IProvideClassInfo2_FWD_DEFINED__
typedef struct IProvideClassInfo2 IProvideClassInfo2;
#endif

#ifndef __IProvideMultipleClassInfo_FWD_DEFINED__
#define __IProvideMultipleClassInfo_FWD_DEFINED__
typedef struct IProvideMultipleClassInfo IProvideMultipleClassInfo;
#endif

#ifndef __IOleControl_FWD_DEFINED__
#define __IOleControl_FWD_DEFINED__
typedef struct IOleControl IOleControl;
#endif

#ifndef __IOleControlSite_FWD_DEFINED__
#define __IOleControlSite_FWD_DEFINED__
typedef struct IOleControlSite IOleControlSite;
#endif

#ifndef __IPropertyPage_FWD_DEFINED__
#define __IPropertyPage_FWD_DEFINED__
typedef struct IPropertyPage IPropertyPage;
#endif

#ifndef __IPropertyPage2_FWD_DEFINED__
#define __IPropertyPage2_FWD_DEFINED__
typedef struct IPropertyPage2 IPropertyPage2;
#endif

#ifndef __IPropertyPageSite_FWD_DEFINED__
#define __IPropertyPageSite_FWD_DEFINED__
typedef struct IPropertyPageSite IPropertyPageSite;
#endif

#ifndef __IPropertyNotifySink_FWD_DEFINED__
#define __IPropertyNotifySink_FWD_DEFINED__
typedef struct IPropertyNotifySink IPropertyNotifySink;
#endif

#ifndef __ISpecifyPropertyPages_FWD_DEFINED__
#define __ISpecifyPropertyPages_FWD_DEFINED__
typedef struct ISpecifyPropertyPages ISpecifyPropertyPages;
#endif

#ifndef __IPersistMemory_FWD_DEFINED__
#define __IPersistMemory_FWD_DEFINED__
typedef struct IPersistMemory IPersistMemory;
#endif

#ifndef __IPersistStreamInit_FWD_DEFINED__
#define __IPersistStreamInit_FWD_DEFINED__
typedef struct IPersistStreamInit IPersistStreamInit;
#endif

#ifndef __IPersistPropertyBag_FWD_DEFINED__
#define __IPersistPropertyBag_FWD_DEFINED__
typedef struct IPersistPropertyBag IPersistPropertyBag;
#endif

#ifndef __ISimpleFrameSite_FWD_DEFINED__
#define __ISimpleFrameSite_FWD_DEFINED__
typedef struct ISimpleFrameSite ISimpleFrameSite;
#endif

#ifndef __IFont_FWD_DEFINED__
#define __IFont_FWD_DEFINED__
typedef struct IFont IFont;
#endif

#ifndef __IPicture_FWD_DEFINED__
#define __IPicture_FWD_DEFINED__
typedef struct IPicture IPicture;
#endif

#ifndef __IFontEventsDisp_FWD_DEFINED__
#define __IFontEventsDisp_FWD_DEFINED__
typedef struct IFontEventsDisp IFontEventsDisp;
#endif

#ifndef __IFontDisp_FWD_DEFINED__
#define __IFontDisp_FWD_DEFINED__
typedef struct IFontDisp IFontDisp;
#endif

#ifndef __IPictureDisp_FWD_DEFINED__
#define __IPictureDisp_FWD_DEFINED__
typedef struct IPictureDisp IPictureDisp;
#endif

#ifndef __IOleInPlaceObjectWindowless_FWD_DEFINED__
#define __IOleInPlaceObjectWindowless_FWD_DEFINED__
typedef struct IOleInPlaceObjectWindowless IOleInPlaceObjectWindowless;
#endif

#ifndef __IOleInPlaceSiteEx_FWD_DEFINED__
#define __IOleInPlaceSiteEx_FWD_DEFINED__
typedef struct IOleInPlaceSiteEx IOleInPlaceSiteEx;
#endif

#ifndef __IOleInPlaceSiteWindowless_FWD_DEFINED__
#define __IOleInPlaceSiteWindowless_FWD_DEFINED__
typedef struct IOleInPlaceSiteWindowless IOleInPlaceSiteWindowless;
#endif

#ifndef __IViewObjectEx_FWD_DEFINED__
#define __IViewObjectEx_FWD_DEFINED__
typedef struct IViewObjectEx IViewObjectEx;
#endif

#ifndef __IOleUndoUnit_FWD_DEFINED__
#define __IOleUndoUnit_FWD_DEFINED__
typedef struct IOleUndoUnit IOleUndoUnit;
#endif

#ifndef __IOleParentUndoUnit_FWD_DEFINED__
#define __IOleParentUndoUnit_FWD_DEFINED__
typedef struct IOleParentUndoUnit IOleParentUndoUnit;
#endif

#ifndef __IEnumOleUndoUnits_FWD_DEFINED__
#define __IEnumOleUndoUnits_FWD_DEFINED__
typedef struct IEnumOleUndoUnits IEnumOleUndoUnits;
#endif

#ifndef __IOleUndoManager_FWD_DEFINED__
#define __IOleUndoManager_FWD_DEFINED__
typedef struct IOleUndoManager IOleUndoManager;
#endif

#ifndef __IPointerInactive_FWD_DEFINED__
#define __IPointerInactive_FWD_DEFINED__
typedef struct IPointerInactive IPointerInactive;
#endif

#ifndef __IObjectWithSite_FWD_DEFINED__
#define __IObjectWithSite_FWD_DEFINED__
typedef struct IObjectWithSite IObjectWithSite;
#endif

#ifndef __IPerPropertyBrowsing_FWD_DEFINED__
#define __IPerPropertyBrowsing_FWD_DEFINED__
typedef struct IPerPropertyBrowsing IPerPropertyBrowsing;
#endif

#ifndef __IPersistPropertyBag2_FWD_DEFINED__
#define __IPersistPropertyBag2_FWD_DEFINED__
typedef struct IPersistPropertyBag2 IPersistPropertyBag2;
#endif

#ifndef __IAdviseSinkEx_FWD_DEFINED__
#define __IAdviseSinkEx_FWD_DEFINED__
typedef struct IAdviseSinkEx IAdviseSinkEx;
#endif

#ifndef __IQuickActivate_FWD_DEFINED__
#define __IQuickActivate_FWD_DEFINED__
typedef struct IQuickActivate IQuickActivate;
#endif

#include "servprov.h"

  extern RPC_IF_HANDLE __MIDL_itf_ocidl_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_ocidl_0000_v0_0_s_ifspec;
#ifndef __IOleControlTypes_INTERFACE_DEFINED__
#define __IOleControlTypes_INTERFACE_DEFINED__
  typedef enum tagUASFLAGS {
    UAS_NORMAL = 0,UAS_BLOCKED = 0x1,UAS_NOPARENTENABLE = 0x2,UAS_MASK = 0x3
  } UASFLAGS;

  typedef enum tagREADYSTATE {
    READYSTATE_UNINITIALIZED = 0,READYSTATE_LOADING = 1,READYSTATE_LOADED = 2,READYSTATE_INTERACTIVE = 3,READYSTATE_COMPLETE = 4
  } READYSTATE;

  extern RPC_IF_HANDLE IOleControlTypes_v1_0_c_ifspec;
  extern RPC_IF_HANDLE IOleControlTypes_v1_0_s_ifspec;
#endif

#ifndef __IEnumConnections_INTERFACE_DEFINED__
#define __IEnumConnections_INTERFACE_DEFINED__
  typedef IEnumConnections *PENUMCONNECTIONS;
  typedef IEnumConnections *LPENUMCONNECTIONS;

  typedef struct tagCONNECTDATA {
    IUnknown *pUnk;
    DWORD dwCookie;
  } CONNECTDATA;

  typedef struct tagCONNECTDATA *PCONNECTDATA;
  typedef struct tagCONNECTDATA *LPCONNECTDATA;

  EXTERN_C const IID IID_IEnumConnections;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumConnections : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(ULONG cConnections,LPCONNECTDATA rgcd,ULONG *pcFetched) = 0;
    virtual HRESULT WINAPI Skip(ULONG cConnections) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Clone(IEnumConnections **ppEnum) = 0;
  };
#else
  typedef struct IEnumConnectionsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumConnections *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumConnections *This);
      ULONG (WINAPI *Release)(IEnumConnections *This);
      HRESULT (WINAPI *Next)(IEnumConnections *This,ULONG cConnections,LPCONNECTDATA rgcd,ULONG *pcFetched);
      HRESULT (WINAPI *Skip)(IEnumConnections *This,ULONG cConnections);
      HRESULT (WINAPI *Reset)(IEnumConnections *This);
      HRESULT (WINAPI *Clone)(IEnumConnections *This,IEnumConnections **ppEnum);
    END_INTERFACE
  } IEnumConnectionsVtbl;
  struct IEnumConnections {
    CONST_VTBL struct IEnumConnectionsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumConnections_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumConnections_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumConnections_Release(This) (This)->lpVtbl->Release(This)
#define IEnumConnections_Next(This,cConnections,rgcd,pcFetched) (This)->lpVtbl->Next(This,cConnections,rgcd,pcFetched)
#define IEnumConnections_Skip(This,cConnections) (This)->lpVtbl->Skip(This,cConnections)
#define IEnumConnections_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumConnections_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#endif
#endif
  HRESULT WINAPI IEnumConnections_RemoteNext_Proxy(IEnumConnections *This,ULONG cConnections,LPCONNECTDATA rgcd,ULONG *pcFetched);
  void __RPC_STUB IEnumConnections_RemoteNext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumConnections_Skip_Proxy(IEnumConnections *This,ULONG cConnections);
  void __RPC_STUB IEnumConnections_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumConnections_Reset_Proxy(IEnumConnections *This);
  void __RPC_STUB IEnumConnections_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumConnections_Clone_Proxy(IEnumConnections *This,IEnumConnections **ppEnum);
  void __RPC_STUB IEnumConnections_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IConnectionPoint_INTERFACE_DEFINED__
#define __IConnectionPoint_INTERFACE_DEFINED__
  typedef IConnectionPoint *PCONNECTIONPOINT;
  typedef IConnectionPoint *LPCONNECTIONPOINT;

  EXTERN_C const IID IID_IConnectionPoint;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IConnectionPoint : public IUnknown {
  public:
    virtual HRESULT WINAPI GetConnectionInterface(IID *pIID) = 0;
    virtual HRESULT WINAPI GetConnectionPointContainer(IConnectionPointContainer **ppCPC) = 0;
    virtual HRESULT WINAPI Advise(IUnknown *pUnkSink,DWORD *pdwCookie) = 0;
    virtual HRESULT WINAPI Unadvise(DWORD dwCookie) = 0;
    virtual HRESULT WINAPI EnumConnections(IEnumConnections **ppEnum) = 0;
  };
#else
  typedef struct IConnectionPointVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IConnectionPoint *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IConnectionPoint *This);
      ULONG (WINAPI *Release)(IConnectionPoint *This);
      HRESULT (WINAPI *GetConnectionInterface)(IConnectionPoint *This,IID *pIID);
      HRESULT (WINAPI *GetConnectionPointContainer)(IConnectionPoint *This,IConnectionPointContainer **ppCPC);
      HRESULT (WINAPI *Advise)(IConnectionPoint *This,IUnknown *pUnkSink,DWORD *pdwCookie);
      HRESULT (WINAPI *Unadvise)(IConnectionPoint *This,DWORD dwCookie);
      HRESULT (WINAPI *EnumConnections)(IConnectionPoint *This,IEnumConnections **ppEnum);
    END_INTERFACE
  } IConnectionPointVtbl;
  struct IConnectionPoint {
    CONST_VTBL struct IConnectionPointVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IConnectionPoint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IConnectionPoint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IConnectionPoint_Release(This) (This)->lpVtbl->Release(This)
#define IConnectionPoint_GetConnectionInterface(This,pIID) (This)->lpVtbl->GetConnectionInterface(This,pIID)
#define IConnectionPoint_GetConnectionPointContainer(This,ppCPC) (This)->lpVtbl->GetConnectionPointContainer(This,ppCPC)
#define IConnectionPoint_Advise(This,pUnkSink,pdwCookie) (This)->lpVtbl->Advise(This,pUnkSink,pdwCookie)
#define IConnectionPoint_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define IConnectionPoint_EnumConnections(This,ppEnum) (This)->lpVtbl->EnumConnections(This,ppEnum)
#endif
#endif
  HRESULT WINAPI IConnectionPoint_GetConnectionInterface_Proxy(IConnectionPoint *This,IID *pIID);
  void __RPC_STUB IConnectionPoint_GetConnectionInterface_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IConnectionPoint_GetConnectionPointContainer_Proxy(IConnectionPoint *This,IConnectionPointContainer **ppCPC);
  void __RPC_STUB IConnectionPoint_GetConnectionPointContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IConnectionPoint_Advise_Proxy(IConnectionPoint *This,IUnknown *pUnkSink,DWORD *pdwCookie);
  void __RPC_STUB IConnectionPoint_Advise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IConnectionPoint_Unadvise_Proxy(IConnectionPoint *This,DWORD dwCookie);
  void __RPC_STUB IConnectionPoint_Unadvise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IConnectionPoint_EnumConnections_Proxy(IConnectionPoint *This,IEnumConnections **ppEnum);
  void __RPC_STUB IConnectionPoint_EnumConnections_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumConnectionPoints_INTERFACE_DEFINED__
#define __IEnumConnectionPoints_INTERFACE_DEFINED__
  typedef IEnumConnectionPoints *PENUMCONNECTIONPOINTS;
  typedef IEnumConnectionPoints *LPENUMCONNECTIONPOINTS;

  EXTERN_C const IID IID_IEnumConnectionPoints;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumConnectionPoints : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(ULONG cConnections,LPCONNECTIONPOINT *ppCP,ULONG *pcFetched) = 0;
    virtual HRESULT WINAPI Skip(ULONG cConnections) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Clone(IEnumConnectionPoints **ppEnum) = 0;
  };
#else
  typedef struct IEnumConnectionPointsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumConnectionPoints *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumConnectionPoints *This);
      ULONG (WINAPI *Release)(IEnumConnectionPoints *This);
      HRESULT (WINAPI *Next)(IEnumConnectionPoints *This,ULONG cConnections,LPCONNECTIONPOINT *ppCP,ULONG *pcFetched);
      HRESULT (WINAPI *Skip)(IEnumConnectionPoints *This,ULONG cConnections);
      HRESULT (WINAPI *Reset)(IEnumConnectionPoints *This);
      HRESULT (WINAPI *Clone)(IEnumConnectionPoints *This,IEnumConnectionPoints **ppEnum);
    END_INTERFACE
  } IEnumConnectionPointsVtbl;
  struct IEnumConnectionPoints {
    CONST_VTBL struct IEnumConnectionPointsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumConnectionPoints_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumConnectionPoints_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumConnectionPoints_Release(This) (This)->lpVtbl->Release(This)
#define IEnumConnectionPoints_Next(This,cConnections,ppCP,pcFetched) (This)->lpVtbl->Next(This,cConnections,ppCP,pcFetched)
#define IEnumConnectionPoints_Skip(This,cConnections) (This)->lpVtbl->Skip(This,cConnections)
#define IEnumConnectionPoints_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumConnectionPoints_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#endif
#endif
  HRESULT WINAPI IEnumConnectionPoints_RemoteNext_Proxy(IEnumConnectionPoints *This,ULONG cConnections,LPCONNECTIONPOINT *ppCP,ULONG *pcFetched);
  void __RPC_STUB IEnumConnectionPoints_RemoteNext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumConnectionPoints_Skip_Proxy(IEnumConnectionPoints *This,ULONG cConnections);
  void __RPC_STUB IEnumConnectionPoints_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumConnectionPoints_Reset_Proxy(IEnumConnectionPoints *This);
  void __RPC_STUB IEnumConnectionPoints_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumConnectionPoints_Clone_Proxy(IEnumConnectionPoints *This,IEnumConnectionPoints **ppEnum);
  void __RPC_STUB IEnumConnectionPoints_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IConnectionPointContainer_INTERFACE_DEFINED__
#define __IConnectionPointContainer_INTERFACE_DEFINED__
  typedef IConnectionPointContainer *PCONNECTIONPOINTCONTAINER;
  typedef IConnectionPointContainer *LPCONNECTIONPOINTCONTAINER;

  EXTERN_C const IID IID_IConnectionPointContainer;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IConnectionPointContainer : public IUnknown {
  public:
    virtual HRESULT WINAPI EnumConnectionPoints(IEnumConnectionPoints **ppEnum) = 0;
    virtual HRESULT WINAPI FindConnectionPoint(REFIID riid,IConnectionPoint **ppCP) = 0;
  };
#else
  typedef struct IConnectionPointContainerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IConnectionPointContainer *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IConnectionPointContainer *This);
      ULONG (WINAPI *Release)(IConnectionPointContainer *This);
      HRESULT (WINAPI *EnumConnectionPoints)(IConnectionPointContainer *This,IEnumConnectionPoints **ppEnum);
      HRESULT (WINAPI *FindConnectionPoint)(IConnectionPointContainer *This,REFIID riid,IConnectionPoint **ppCP);
    END_INTERFACE
  } IConnectionPointContainerVtbl;
  struct IConnectionPointContainer {
    CONST_VTBL struct IConnectionPointContainerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IConnectionPointContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IConnectionPointContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IConnectionPointContainer_Release(This) (This)->lpVtbl->Release(This)
#define IConnectionPointContainer_EnumConnectionPoints(This,ppEnum) (This)->lpVtbl->EnumConnectionPoints(This,ppEnum)
#define IConnectionPointContainer_FindConnectionPoint(This,riid,ppCP) (This)->lpVtbl->FindConnectionPoint(This,riid,ppCP)
#endif
#endif
  HRESULT WINAPI IConnectionPointContainer_EnumConnectionPoints_Proxy(IConnectionPointContainer *This,IEnumConnectionPoints **ppEnum);
  void __RPC_STUB IConnectionPointContainer_EnumConnectionPoints_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IConnectionPointContainer_FindConnectionPoint_Proxy(IConnectionPointContainer *This,REFIID riid,IConnectionPoint **ppCP);
  void __RPC_STUB IConnectionPointContainer_FindConnectionPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClassFactory2_INTERFACE_DEFINED__
#define __IClassFactory2_INTERFACE_DEFINED__
  typedef IClassFactory2 *LPCLASSFACTORY2;

  typedef struct tagLICINFO {
    LONG cbLicInfo;
    WINBOOL fRuntimeKeyAvail;
    WINBOOL fLicVerified;
  } LICINFO;

  typedef struct tagLICINFO *LPLICINFO;

  EXTERN_C const IID IID_IClassFactory2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClassFactory2 : public IClassFactory {
  public:
    virtual HRESULT WINAPI GetLicInfo(LICINFO *pLicInfo) = 0;
    virtual HRESULT WINAPI RequestLicKey(DWORD dwReserved,BSTR *pBstrKey) = 0;
    virtual HRESULT WINAPI CreateInstanceLic(IUnknown *pUnkOuter,IUnknown *pUnkReserved,REFIID riid,BSTR bstrKey,PVOID *ppvObj) = 0;
  };
#else
  typedef struct IClassFactory2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClassFactory2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClassFactory2 *This);
      ULONG (WINAPI *Release)(IClassFactory2 *This);
      HRESULT (WINAPI *CreateInstance)(IClassFactory2 *This,IUnknown *pUnkOuter,REFIID riid,void **ppvObject);
      HRESULT (WINAPI *LockServer)(IClassFactory2 *This,WINBOOL fLock);
      HRESULT (WINAPI *GetLicInfo)(IClassFactory2 *This,LICINFO *pLicInfo);
      HRESULT (WINAPI *RequestLicKey)(IClassFactory2 *This,DWORD dwReserved,BSTR *pBstrKey);
      HRESULT (WINAPI *CreateInstanceLic)(IClassFactory2 *This,IUnknown *pUnkOuter,IUnknown *pUnkReserved,REFIID riid,BSTR bstrKey,PVOID *ppvObj);
    END_INTERFACE
  } IClassFactory2Vtbl;
  struct IClassFactory2 {
    CONST_VTBL struct IClassFactory2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClassFactory2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClassFactory2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClassFactory2_Release(This) (This)->lpVtbl->Release(This)
#define IClassFactory2_CreateInstance(This,pUnkOuter,riid,ppvObject) (This)->lpVtbl->CreateInstance(This,pUnkOuter,riid,ppvObject)
#define IClassFactory2_LockServer(This,fLock) (This)->lpVtbl->LockServer(This,fLock)
#define IClassFactory2_GetLicInfo(This,pLicInfo) (This)->lpVtbl->GetLicInfo(This,pLicInfo)
#define IClassFactory2_RequestLicKey(This,dwReserved,pBstrKey) (This)->lpVtbl->RequestLicKey(This,dwReserved,pBstrKey)
#define IClassFactory2_CreateInstanceLic(This,pUnkOuter,pUnkReserved,riid,bstrKey,ppvObj) (This)->lpVtbl->CreateInstanceLic(This,pUnkOuter,pUnkReserved,riid,bstrKey,ppvObj)
#endif
#endif
  HRESULT WINAPI IClassFactory2_GetLicInfo_Proxy(IClassFactory2 *This,LICINFO *pLicInfo);
  void __RPC_STUB IClassFactory2_GetLicInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClassFactory2_RequestLicKey_Proxy(IClassFactory2 *This,DWORD dwReserved,BSTR *pBstrKey);
  void __RPC_STUB IClassFactory2_RequestLicKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClassFactory2_RemoteCreateInstanceLic_Proxy(IClassFactory2 *This,REFIID riid,BSTR bstrKey,IUnknown **ppvObj);
  void __RPC_STUB IClassFactory2_RemoteCreateInstanceLic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IProvideClassInfo_INTERFACE_DEFINED__
#define __IProvideClassInfo_INTERFACE_DEFINED__
  typedef IProvideClassInfo *LPPROVIDECLASSINFO;

  EXTERN_C const IID IID_IProvideClassInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IProvideClassInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI GetClassInfo(ITypeInfo **ppTI) = 0;
  };
#else
  typedef struct IProvideClassInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IProvideClassInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IProvideClassInfo *This);
      ULONG (WINAPI *Release)(IProvideClassInfo *This);
      HRESULT (WINAPI *GetClassInfo)(IProvideClassInfo *This,ITypeInfo **ppTI);
    END_INTERFACE
  } IProvideClassInfoVtbl;
  struct IProvideClassInfo {
    CONST_VTBL struct IProvideClassInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IProvideClassInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProvideClassInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProvideClassInfo_Release(This) (This)->lpVtbl->Release(This)
#define IProvideClassInfo_GetClassInfo(This,ppTI) (This)->lpVtbl->GetClassInfo(This,ppTI)
#endif
#endif
  HRESULT WINAPI IProvideClassInfo_GetClassInfo_Proxy(IProvideClassInfo *This,ITypeInfo **ppTI);
  void __RPC_STUB IProvideClassInfo_GetClassInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IProvideClassInfo2_INTERFACE_DEFINED__
#define __IProvideClassInfo2_INTERFACE_DEFINED__
  typedef IProvideClassInfo2 *LPPROVIDECLASSINFO2;

  typedef enum tagGUIDKIND {
    GUIDKIND_DEFAULT_SOURCE_DISP_IID = 1
  } GUIDKIND;

  EXTERN_C const IID IID_IProvideClassInfo2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IProvideClassInfo2 : public IProvideClassInfo {
  public:
    virtual HRESULT WINAPI GetGUID(DWORD dwGuidKind,GUID *pGUID) = 0;
  };
#else
  typedef struct IProvideClassInfo2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IProvideClassInfo2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IProvideClassInfo2 *This);
      ULONG (WINAPI *Release)(IProvideClassInfo2 *This);
      HRESULT (WINAPI *GetClassInfo)(IProvideClassInfo2 *This,ITypeInfo **ppTI);
      HRESULT (WINAPI *GetGUID)(IProvideClassInfo2 *This,DWORD dwGuidKind,GUID *pGUID);
    END_INTERFACE
  } IProvideClassInfo2Vtbl;
  struct IProvideClassInfo2 {
    CONST_VTBL struct IProvideClassInfo2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IProvideClassInfo2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProvideClassInfo2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProvideClassInfo2_Release(This) (This)->lpVtbl->Release(This)
#define IProvideClassInfo2_GetClassInfo(This,ppTI) (This)->lpVtbl->GetClassInfo(This,ppTI)
#define IProvideClassInfo2_GetGUID(This,dwGuidKind,pGUID) (This)->lpVtbl->GetGUID(This,dwGuidKind,pGUID)
#endif
#endif
  HRESULT WINAPI IProvideClassInfo2_GetGUID_Proxy(IProvideClassInfo2 *This,DWORD dwGuidKind,GUID *pGUID);
  void __RPC_STUB IProvideClassInfo2_GetGUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IProvideMultipleClassInfo_INTERFACE_DEFINED__
#define __IProvideMultipleClassInfo_INTERFACE_DEFINED__

#define MULTICLASSINFO_GETTYPEINFO 0x00000001
#define MULTICLASSINFO_GETNUMRESERVEDDISPIDS 0x00000002
#define MULTICLASSINFO_GETIIDPRIMARY 0x00000004
#define MULTICLASSINFO_GETIIDSOURCE 0x00000008
#define TIFLAGS_EXTENDDISPATCHONLY 0x00000001
  typedef IProvideMultipleClassInfo *LPPROVIDEMULTIPLECLASSINFO;

  EXTERN_C const IID IID_IProvideMultipleClassInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IProvideMultipleClassInfo : public IProvideClassInfo2 {
  public:
    virtual HRESULT WINAPI GetMultiTypeInfoCount(ULONG *pcti) = 0;
    virtual HRESULT WINAPI GetInfoOfIndex(ULONG iti,DWORD dwFlags,ITypeInfo **pptiCoClass,DWORD *pdwTIFlags,ULONG *pcdispidReserved,IID *piidPrimary,IID *piidSource) = 0;
  };
#else
  typedef struct IProvideMultipleClassInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IProvideMultipleClassInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IProvideMultipleClassInfo *This);
      ULONG (WINAPI *Release)(IProvideMultipleClassInfo *This);
      HRESULT (WINAPI *GetClassInfo)(IProvideMultipleClassInfo *This,ITypeInfo **ppTI);
      HRESULT (WINAPI *GetGUID)(IProvideMultipleClassInfo *This,DWORD dwGuidKind,GUID *pGUID);
      HRESULT (WINAPI *GetMultiTypeInfoCount)(IProvideMultipleClassInfo *This,ULONG *pcti);
      HRESULT (WINAPI *GetInfoOfIndex)(IProvideMultipleClassInfo *This,ULONG iti,DWORD dwFlags,ITypeInfo **pptiCoClass,DWORD *pdwTIFlags,ULONG *pcdispidReserved,IID *piidPrimary,IID *piidSource);
    END_INTERFACE
  } IProvideMultipleClassInfoVtbl;
  struct IProvideMultipleClassInfo {
    CONST_VTBL struct IProvideMultipleClassInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IProvideMultipleClassInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProvideMultipleClassInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProvideMultipleClassInfo_Release(This) (This)->lpVtbl->Release(This)
#define IProvideMultipleClassInfo_GetClassInfo(This,ppTI) (This)->lpVtbl->GetClassInfo(This,ppTI)
#define IProvideMultipleClassInfo_GetGUID(This,dwGuidKind,pGUID) (This)->lpVtbl->GetGUID(This,dwGuidKind,pGUID)
#define IProvideMultipleClassInfo_GetMultiTypeInfoCount(This,pcti) (This)->lpVtbl->GetMultiTypeInfoCount(This,pcti)
#define IProvideMultipleClassInfo_GetInfoOfIndex(This,iti,dwFlags,pptiCoClass,pdwTIFlags,pcdispidReserved,piidPrimary,piidSource) (This)->lpVtbl->GetInfoOfIndex(This,iti,dwFlags,pptiCoClass,pdwTIFlags,pcdispidReserved,piidPrimary,piidSource)
#endif
#endif
  HRESULT WINAPI IProvideMultipleClassInfo_GetMultiTypeInfoCount_Proxy(IProvideMultipleClassInfo *This,ULONG *pcti);
  void __RPC_STUB IProvideMultipleClassInfo_GetMultiTypeInfoCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IProvideMultipleClassInfo_GetInfoOfIndex_Proxy(IProvideMultipleClassInfo *This,ULONG iti,DWORD dwFlags,ITypeInfo **pptiCoClass,DWORD *pdwTIFlags,ULONG *pcdispidReserved,IID *piidPrimary,IID *piidSource);
  void __RPC_STUB IProvideMultipleClassInfo_GetInfoOfIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleControl_INTERFACE_DEFINED__
#define __IOleControl_INTERFACE_DEFINED__
  typedef IOleControl *LPOLECONTROL;

  typedef struct tagCONTROLINFO {
    ULONG cb;
    HACCEL hAccel;
    USHORT cAccel;
    DWORD dwFlags;
  } CONTROLINFO;

  typedef struct tagCONTROLINFO *LPCONTROLINFO;
  typedef enum tagCTRLINFO {
    CTRLINFO_EATS_RETURN = 1,CTRLINFO_EATS_ESCAPE = 2
  } CTRLINFO;

  EXTERN_C const IID IID_IOleControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleControl : public IUnknown {
  public:
    virtual HRESULT WINAPI GetControlInfo(CONTROLINFO *pCI) = 0;
    virtual HRESULT WINAPI OnMnemonic(MSG *pMsg) = 0;
    virtual HRESULT WINAPI OnAmbientPropertyChange(DISPID dispID) = 0;
    virtual HRESULT WINAPI FreezeEvents(WINBOOL bFreeze) = 0;
  };
#else
  typedef struct IOleControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleControl *This);
      ULONG (WINAPI *Release)(IOleControl *This);
      HRESULT (WINAPI *GetControlInfo)(IOleControl *This,CONTROLINFO *pCI);
      HRESULT (WINAPI *OnMnemonic)(IOleControl *This,MSG *pMsg);
      HRESULT (WINAPI *OnAmbientPropertyChange)(IOleControl *This,DISPID dispID);
      HRESULT (WINAPI *FreezeEvents)(IOleControl *This,WINBOOL bFreeze);
    END_INTERFACE
  } IOleControlVtbl;
  struct IOleControl {
    CONST_VTBL struct IOleControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleControl_Release(This) (This)->lpVtbl->Release(This)
#define IOleControl_GetControlInfo(This,pCI) (This)->lpVtbl->GetControlInfo(This,pCI)
#define IOleControl_OnMnemonic(This,pMsg) (This)->lpVtbl->OnMnemonic(This,pMsg)
#define IOleControl_OnAmbientPropertyChange(This,dispID) (This)->lpVtbl->OnAmbientPropertyChange(This,dispID)
#define IOleControl_FreezeEvents(This,bFreeze) (This)->lpVtbl->FreezeEvents(This,bFreeze)
#endif
#endif
  HRESULT WINAPI IOleControl_GetControlInfo_Proxy(IOleControl *This,CONTROLINFO *pCI);
  void __RPC_STUB IOleControl_GetControlInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleControl_OnMnemonic_Proxy(IOleControl *This,MSG *pMsg);
  void __RPC_STUB IOleControl_OnMnemonic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleControl_OnAmbientPropertyChange_Proxy(IOleControl *This,DISPID dispID);
  void __RPC_STUB IOleControl_OnAmbientPropertyChange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleControl_FreezeEvents_Proxy(IOleControl *This,WINBOOL bFreeze);
  void __RPC_STUB IOleControl_FreezeEvents_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleControlSite_INTERFACE_DEFINED__
#define __IOleControlSite_INTERFACE_DEFINED__
  typedef IOleControlSite *LPOLECONTROLSITE;

  typedef struct tagPOINTF {
    FLOAT x;
    FLOAT y;
  } POINTF;

  typedef struct tagPOINTF *LPPOINTF;

  typedef enum tagXFORMCOORDS {
    XFORMCOORDS_POSITION = 0x1,XFORMCOORDS_SIZE = 0x2,XFORMCOORDS_HIMETRICTOCONTAINER = 0x4,XFORMCOORDS_CONTAINERTOHIMETRIC = 0x8,
    XFORMCOORDS_EVENTCOMPAT = 0x10
  } XFORMCOORDS;

  EXTERN_C const IID IID_IOleControlSite;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleControlSite : public IUnknown {
  public:
    virtual HRESULT WINAPI OnControlInfoChanged(void) = 0;
    virtual HRESULT WINAPI LockInPlaceActive(WINBOOL fLock) = 0;
    virtual HRESULT WINAPI GetExtendedControl(IDispatch **ppDisp) = 0;
    virtual HRESULT WINAPI TransformCoords(POINTL *pPtlHimetric,POINTF *pPtfContainer,DWORD dwFlags) = 0;
    virtual HRESULT WINAPI TranslateAccelerator(MSG *pMsg,DWORD grfModifiers) = 0;
    virtual HRESULT WINAPI OnFocus(WINBOOL fGotFocus) = 0;
    virtual HRESULT WINAPI ShowPropertyFrame(void) = 0;
  };
#else
  typedef struct IOleControlSiteVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleControlSite *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleControlSite *This);
      ULONG (WINAPI *Release)(IOleControlSite *This);
      HRESULT (WINAPI *OnControlInfoChanged)(IOleControlSite *This);
      HRESULT (WINAPI *LockInPlaceActive)(IOleControlSite *This,WINBOOL fLock);
      HRESULT (WINAPI *GetExtendedControl)(IOleControlSite *This,IDispatch **ppDisp);
      HRESULT (WINAPI *TransformCoords)(IOleControlSite *This,POINTL *pPtlHimetric,POINTF *pPtfContainer,DWORD dwFlags);
      HRESULT (WINAPI *TranslateAccelerator)(IOleControlSite *This,MSG *pMsg,DWORD grfModifiers);
      HRESULT (WINAPI *OnFocus)(IOleControlSite *This,WINBOOL fGotFocus);
      HRESULT (WINAPI *ShowPropertyFrame)(IOleControlSite *This);
    END_INTERFACE
  } IOleControlSiteVtbl;
  struct IOleControlSite {
    CONST_VTBL struct IOleControlSiteVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleControlSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleControlSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleControlSite_Release(This) (This)->lpVtbl->Release(This)
#define IOleControlSite_OnControlInfoChanged(This) (This)->lpVtbl->OnControlInfoChanged(This)
#define IOleControlSite_LockInPlaceActive(This,fLock) (This)->lpVtbl->LockInPlaceActive(This,fLock)
#define IOleControlSite_GetExtendedControl(This,ppDisp) (This)->lpVtbl->GetExtendedControl(This,ppDisp)
#define IOleControlSite_TransformCoords(This,pPtlHimetric,pPtfContainer,dwFlags) (This)->lpVtbl->TransformCoords(This,pPtlHimetric,pPtfContainer,dwFlags)
#define IOleControlSite_TranslateAccelerator(This,pMsg,grfModifiers) (This)->lpVtbl->TranslateAccelerator(This,pMsg,grfModifiers)
#define IOleControlSite_OnFocus(This,fGotFocus) (This)->lpVtbl->OnFocus(This,fGotFocus)
#define IOleControlSite_ShowPropertyFrame(This) (This)->lpVtbl->ShowPropertyFrame(This)
#endif
#endif
  HRESULT WINAPI IOleControlSite_OnControlInfoChanged_Proxy(IOleControlSite *This);
  void __RPC_STUB IOleControlSite_OnControlInfoChanged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleControlSite_LockInPlaceActive_Proxy(IOleControlSite *This,WINBOOL fLock);
  void __RPC_STUB IOleControlSite_LockInPlaceActive_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleControlSite_GetExtendedControl_Proxy(IOleControlSite *This,IDispatch **ppDisp);
  void __RPC_STUB IOleControlSite_GetExtendedControl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleControlSite_TransformCoords_Proxy(IOleControlSite *This,POINTL *pPtlHimetric,POINTF *pPtfContainer,DWORD dwFlags);
  void __RPC_STUB IOleControlSite_TransformCoords_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleControlSite_TranslateAccelerator_Proxy(IOleControlSite *This,MSG *pMsg,DWORD grfModifiers);
  void __RPC_STUB IOleControlSite_TranslateAccelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleControlSite_OnFocus_Proxy(IOleControlSite *This,WINBOOL fGotFocus);
  void __RPC_STUB IOleControlSite_OnFocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleControlSite_ShowPropertyFrame_Proxy(IOleControlSite *This);
  void __RPC_STUB IOleControlSite_ShowPropertyFrame_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPropertyPage_INTERFACE_DEFINED__
#define __IPropertyPage_INTERFACE_DEFINED__
  typedef IPropertyPage *LPPROPERTYPAGE;

  typedef struct tagPROPPAGEINFO {
    ULONG cb;
    LPOLESTR pszTitle;
    SIZE size;
    LPOLESTR pszDocString;
    LPOLESTR pszHelpFile;
    DWORD dwHelpContext;
  } PROPPAGEINFO;

  typedef struct tagPROPPAGEINFO *LPPROPPAGEINFO;

  EXTERN_C const IID IID_IPropertyPage;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPropertyPage : public IUnknown {
  public:
    virtual HRESULT WINAPI SetPageSite(IPropertyPageSite *pPageSite) = 0;
    virtual HRESULT WINAPI Activate(HWND hWndParent,LPCRECT pRect,WINBOOL bModal) = 0;
    virtual HRESULT WINAPI Deactivate(void) = 0;
    virtual HRESULT WINAPI GetPageInfo(PROPPAGEINFO *pPageInfo) = 0;
    virtual HRESULT WINAPI SetObjects(ULONG cObjects,IUnknown **ppUnk) = 0;
    virtual HRESULT WINAPI Show(UINT nCmdShow) = 0;
    virtual HRESULT WINAPI Move(LPCRECT pRect) = 0;
    virtual HRESULT WINAPI IsPageDirty(void) = 0;
    virtual HRESULT WINAPI Apply(void) = 0;
    virtual HRESULT WINAPI Help(LPCOLESTR pszHelpDir) = 0;
    virtual HRESULT WINAPI TranslateAccelerator(MSG *pMsg) = 0;
  };
#else
  typedef struct IPropertyPageVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPropertyPage *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPropertyPage *This);
      ULONG (WINAPI *Release)(IPropertyPage *This);
      HRESULT (WINAPI *SetPageSite)(IPropertyPage *This,IPropertyPageSite *pPageSite);
      HRESULT (WINAPI *Activate)(IPropertyPage *This,HWND hWndParent,LPCRECT pRect,WINBOOL bModal);
      HRESULT (WINAPI *Deactivate)(IPropertyPage *This);
      HRESULT (WINAPI *GetPageInfo)(IPropertyPage *This,PROPPAGEINFO *pPageInfo);
      HRESULT (WINAPI *SetObjects)(IPropertyPage *This,ULONG cObjects,IUnknown **ppUnk);
      HRESULT (WINAPI *Show)(IPropertyPage *This,UINT nCmdShow);
      HRESULT (WINAPI *Move)(IPropertyPage *This,LPCRECT pRect);
      HRESULT (WINAPI *IsPageDirty)(IPropertyPage *This);
      HRESULT (WINAPI *Apply)(IPropertyPage *This);
      HRESULT (WINAPI *Help)(IPropertyPage *This,LPCOLESTR pszHelpDir);
      HRESULT (WINAPI *TranslateAccelerator)(IPropertyPage *This,MSG *pMsg);
    END_INTERFACE
  } IPropertyPageVtbl;
  struct IPropertyPage {
    CONST_VTBL struct IPropertyPageVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPropertyPage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPropertyPage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPropertyPage_Release(This) (This)->lpVtbl->Release(This)
#define IPropertyPage_SetPageSite(This,pPageSite) (This)->lpVtbl->SetPageSite(This,pPageSite)
#define IPropertyPage_Activate(This,hWndParent,pRect,bModal) (This)->lpVtbl->Activate(This,hWndParent,pRect,bModal)
#define IPropertyPage_Deactivate(This) (This)->lpVtbl->Deactivate(This)
#define IPropertyPage_GetPageInfo(This,pPageInfo) (This)->lpVtbl->GetPageInfo(This,pPageInfo)
#define IPropertyPage_SetObjects(This,cObjects,ppUnk) (This)->lpVtbl->SetObjects(This,cObjects,ppUnk)
#define IPropertyPage_Show(This,nCmdShow) (This)->lpVtbl->Show(This,nCmdShow)
#define IPropertyPage_Move(This,pRect) (This)->lpVtbl->Move(This,pRect)
#define IPropertyPage_IsPageDirty(This) (This)->lpVtbl->IsPageDirty(This)
#define IPropertyPage_Apply(This) (This)->lpVtbl->Apply(This)
#define IPropertyPage_Help(This,pszHelpDir) (This)->lpVtbl->Help(This,pszHelpDir)
#define IPropertyPage_TranslateAccelerator(This,pMsg) (This)->lpVtbl->TranslateAccelerator(This,pMsg)
#endif
#endif
  HRESULT WINAPI IPropertyPage_SetPageSite_Proxy(IPropertyPage *This,IPropertyPageSite *pPageSite);
  void __RPC_STUB IPropertyPage_SetPageSite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_Activate_Proxy(IPropertyPage *This,HWND hWndParent,LPCRECT pRect,WINBOOL bModal);
  void __RPC_STUB IPropertyPage_Activate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_Deactivate_Proxy(IPropertyPage *This);
  void __RPC_STUB IPropertyPage_Deactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_GetPageInfo_Proxy(IPropertyPage *This,PROPPAGEINFO *pPageInfo);
  void __RPC_STUB IPropertyPage_GetPageInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_SetObjects_Proxy(IPropertyPage *This,ULONG cObjects,IUnknown **ppUnk);
  void __RPC_STUB IPropertyPage_SetObjects_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_Show_Proxy(IPropertyPage *This,UINT nCmdShow);
  void __RPC_STUB IPropertyPage_Show_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_Move_Proxy(IPropertyPage *This,LPCRECT pRect);
  void __RPC_STUB IPropertyPage_Move_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_IsPageDirty_Proxy(IPropertyPage *This);
  void __RPC_STUB IPropertyPage_IsPageDirty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_Apply_Proxy(IPropertyPage *This);
  void __RPC_STUB IPropertyPage_Apply_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_Help_Proxy(IPropertyPage *This,LPCOLESTR pszHelpDir);
  void __RPC_STUB IPropertyPage_Help_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPage_TranslateAccelerator_Proxy(IPropertyPage *This,MSG *pMsg);
  void __RPC_STUB IPropertyPage_TranslateAccelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPropertyPage2_INTERFACE_DEFINED__
#define __IPropertyPage2_INTERFACE_DEFINED__
  typedef IPropertyPage2 *LPPROPERTYPAGE2;

  EXTERN_C const IID IID_IPropertyPage2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPropertyPage2 : public IPropertyPage {
  public:
    virtual HRESULT WINAPI EditProperty(DISPID dispID) = 0;
  };
#else
  typedef struct IPropertyPage2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPropertyPage2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPropertyPage2 *This);
      ULONG (WINAPI *Release)(IPropertyPage2 *This);
      HRESULT (WINAPI *SetPageSite)(IPropertyPage2 *This,IPropertyPageSite *pPageSite);
      HRESULT (WINAPI *Activate)(IPropertyPage2 *This,HWND hWndParent,LPCRECT pRect,WINBOOL bModal);
      HRESULT (WINAPI *Deactivate)(IPropertyPage2 *This);
      HRESULT (WINAPI *GetPageInfo)(IPropertyPage2 *This,PROPPAGEINFO *pPageInfo);
      HRESULT (WINAPI *SetObjects)(IPropertyPage2 *This,ULONG cObjects,IUnknown **ppUnk);
      HRESULT (WINAPI *Show)(IPropertyPage2 *This,UINT nCmdShow);
      HRESULT (WINAPI *Move)(IPropertyPage2 *This,LPCRECT pRect);
      HRESULT (WINAPI *IsPageDirty)(IPropertyPage2 *This);
      HRESULT (WINAPI *Apply)(IPropertyPage2 *This);
      HRESULT (WINAPI *Help)(IPropertyPage2 *This,LPCOLESTR pszHelpDir);
      HRESULT (WINAPI *TranslateAccelerator)(IPropertyPage2 *This,MSG *pMsg);
      HRESULT (WINAPI *EditProperty)(IPropertyPage2 *This,DISPID dispID);
    END_INTERFACE
  } IPropertyPage2Vtbl;
  struct IPropertyPage2 {
    CONST_VTBL struct IPropertyPage2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPropertyPage2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPropertyPage2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPropertyPage2_Release(This) (This)->lpVtbl->Release(This)
#define IPropertyPage2_SetPageSite(This,pPageSite) (This)->lpVtbl->SetPageSite(This,pPageSite)
#define IPropertyPage2_Activate(This,hWndParent,pRect,bModal) (This)->lpVtbl->Activate(This,hWndParent,pRect,bModal)
#define IPropertyPage2_Deactivate(This) (This)->lpVtbl->Deactivate(This)
#define IPropertyPage2_GetPageInfo(This,pPageInfo) (This)->lpVtbl->GetPageInfo(This,pPageInfo)
#define IPropertyPage2_SetObjects(This,cObjects,ppUnk) (This)->lpVtbl->SetObjects(This,cObjects,ppUnk)
#define IPropertyPage2_Show(This,nCmdShow) (This)->lpVtbl->Show(This,nCmdShow)
#define IPropertyPage2_Move(This,pRect) (This)->lpVtbl->Move(This,pRect)
#define IPropertyPage2_IsPageDirty(This) (This)->lpVtbl->IsPageDirty(This)
#define IPropertyPage2_Apply(This) (This)->lpVtbl->Apply(This)
#define IPropertyPage2_Help(This,pszHelpDir) (This)->lpVtbl->Help(This,pszHelpDir)
#define IPropertyPage2_TranslateAccelerator(This,pMsg) (This)->lpVtbl->TranslateAccelerator(This,pMsg)
#define IPropertyPage2_EditProperty(This,dispID) (This)->lpVtbl->EditProperty(This,dispID)
#endif
#endif
  HRESULT WINAPI IPropertyPage2_EditProperty_Proxy(IPropertyPage2 *This,DISPID dispID);
  void __RPC_STUB IPropertyPage2_EditProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPropertyPageSite_INTERFACE_DEFINED__
#define __IPropertyPageSite_INTERFACE_DEFINED__
  typedef IPropertyPageSite *LPPROPERTYPAGESITE;

  typedef enum tagPROPPAGESTATUS {
    PROPPAGESTATUS_DIRTY = 0x1,PROPPAGESTATUS_VALIDATE = 0x2,PROPPAGESTATUS_CLEAN = 0x4
  } PROPPAGESTATUS;

  EXTERN_C const IID IID_IPropertyPageSite;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPropertyPageSite : public IUnknown {
  public:
    virtual HRESULT WINAPI OnStatusChange(DWORD dwFlags) = 0;
    virtual HRESULT WINAPI GetLocaleID(LCID *pLocaleID) = 0;
    virtual HRESULT WINAPI GetPageContainer(IUnknown **ppUnk) = 0;
    virtual HRESULT WINAPI TranslateAccelerator(MSG *pMsg) = 0;
  };
#else
  typedef struct IPropertyPageSiteVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPropertyPageSite *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPropertyPageSite *This);
      ULONG (WINAPI *Release)(IPropertyPageSite *This);
      HRESULT (WINAPI *OnStatusChange)(IPropertyPageSite *This,DWORD dwFlags);
      HRESULT (WINAPI *GetLocaleID)(IPropertyPageSite *This,LCID *pLocaleID);
      HRESULT (WINAPI *GetPageContainer)(IPropertyPageSite *This,IUnknown **ppUnk);
      HRESULT (WINAPI *TranslateAccelerator)(IPropertyPageSite *This,MSG *pMsg);
    END_INTERFACE
  } IPropertyPageSiteVtbl;
  struct IPropertyPageSite {
    CONST_VTBL struct IPropertyPageSiteVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPropertyPageSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPropertyPageSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPropertyPageSite_Release(This) (This)->lpVtbl->Release(This)
#define IPropertyPageSite_OnStatusChange(This,dwFlags) (This)->lpVtbl->OnStatusChange(This,dwFlags)
#define IPropertyPageSite_GetLocaleID(This,pLocaleID) (This)->lpVtbl->GetLocaleID(This,pLocaleID)
#define IPropertyPageSite_GetPageContainer(This,ppUnk) (This)->lpVtbl->GetPageContainer(This,ppUnk)
#define IPropertyPageSite_TranslateAccelerator(This,pMsg) (This)->lpVtbl->TranslateAccelerator(This,pMsg)
#endif
#endif
  HRESULT WINAPI IPropertyPageSite_OnStatusChange_Proxy(IPropertyPageSite *This,DWORD dwFlags);
  void __RPC_STUB IPropertyPageSite_OnStatusChange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPageSite_GetLocaleID_Proxy(IPropertyPageSite *This,LCID *pLocaleID);
  void __RPC_STUB IPropertyPageSite_GetLocaleID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPageSite_GetPageContainer_Proxy(IPropertyPageSite *This,IUnknown **ppUnk);
  void __RPC_STUB IPropertyPageSite_GetPageContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyPageSite_TranslateAccelerator_Proxy(IPropertyPageSite *This,MSG *pMsg);
  void __RPC_STUB IPropertyPageSite_TranslateAccelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPropertyNotifySink_INTERFACE_DEFINED__
#define __IPropertyNotifySink_INTERFACE_DEFINED__
  typedef IPropertyNotifySink *LPPROPERTYNOTIFYSINK;

  EXTERN_C const IID IID_IPropertyNotifySink;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPropertyNotifySink : public IUnknown {
  public:
    virtual HRESULT WINAPI OnChanged(DISPID dispID) = 0;
    virtual HRESULT WINAPI OnRequestEdit(DISPID dispID) = 0;
  };
#else
  typedef struct IPropertyNotifySinkVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPropertyNotifySink *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPropertyNotifySink *This);
      ULONG (WINAPI *Release)(IPropertyNotifySink *This);
      HRESULT (WINAPI *OnChanged)(IPropertyNotifySink *This,DISPID dispID);
      HRESULT (WINAPI *OnRequestEdit)(IPropertyNotifySink *This,DISPID dispID);
    END_INTERFACE
  } IPropertyNotifySinkVtbl;
  struct IPropertyNotifySink {
    CONST_VTBL struct IPropertyNotifySinkVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPropertyNotifySink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPropertyNotifySink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPropertyNotifySink_Release(This) (This)->lpVtbl->Release(This)
#define IPropertyNotifySink_OnChanged(This,dispID) (This)->lpVtbl->OnChanged(This,dispID)
#define IPropertyNotifySink_OnRequestEdit(This,dispID) (This)->lpVtbl->OnRequestEdit(This,dispID)
#endif
#endif
  HRESULT WINAPI IPropertyNotifySink_OnChanged_Proxy(IPropertyNotifySink *This,DISPID dispID);
  void __RPC_STUB IPropertyNotifySink_OnChanged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPropertyNotifySink_OnRequestEdit_Proxy(IPropertyNotifySink *This,DISPID dispID);
  void __RPC_STUB IPropertyNotifySink_OnRequestEdit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISpecifyPropertyPages_INTERFACE_DEFINED__
#define __ISpecifyPropertyPages_INTERFACE_DEFINED__
  typedef ISpecifyPropertyPages *LPSPECIFYPROPERTYPAGES;

  typedef struct tagCAUUID {
    ULONG cElems;
    GUID *pElems;
  } CAUUID;

  typedef struct tagCAUUID *LPCAUUID;

  EXTERN_C const IID IID_ISpecifyPropertyPages;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISpecifyPropertyPages : public IUnknown {
  public:
    virtual HRESULT WINAPI GetPages(CAUUID *pPages) = 0;
  };
#else
  typedef struct ISpecifyPropertyPagesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISpecifyPropertyPages *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISpecifyPropertyPages *This);
      ULONG (WINAPI *Release)(ISpecifyPropertyPages *This);
      HRESULT (WINAPI *GetPages)(ISpecifyPropertyPages *This,CAUUID *pPages);
    END_INTERFACE
  } ISpecifyPropertyPagesVtbl;
  struct ISpecifyPropertyPages {
    CONST_VTBL struct ISpecifyPropertyPagesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISpecifyPropertyPages_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISpecifyPropertyPages_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISpecifyPropertyPages_Release(This) (This)->lpVtbl->Release(This)
#define ISpecifyPropertyPages_GetPages(This,pPages) (This)->lpVtbl->GetPages(This,pPages)
#endif
#endif
  HRESULT WINAPI ISpecifyPropertyPages_GetPages_Proxy(ISpecifyPropertyPages *This,CAUUID *pPages);
  void __RPC_STUB ISpecifyPropertyPages_GetPages_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPersistMemory_INTERFACE_DEFINED__
#define __IPersistMemory_INTERFACE_DEFINED__
  typedef IPersistMemory *LPPERSISTMEMORY;

  EXTERN_C const IID IID_IPersistMemory;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPersistMemory : public IPersist {
  public:
    virtual HRESULT WINAPI IsDirty(void) = 0;
    virtual HRESULT WINAPI Load(LPVOID pMem,ULONG cbSize) = 0;
    virtual HRESULT WINAPI Save(LPVOID pMem,WINBOOL fClearDirty,ULONG cbSize) = 0;
    virtual HRESULT WINAPI GetSizeMax(ULONG *pCbSize) = 0;
    virtual HRESULT WINAPI InitNew(void) = 0;
  };
#else
  typedef struct IPersistMemoryVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPersistMemory *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPersistMemory *This);
      ULONG (WINAPI *Release)(IPersistMemory *This);
      HRESULT (WINAPI *GetClassID)(IPersistMemory *This,CLSID *pClassID);
      HRESULT (WINAPI *IsDirty)(IPersistMemory *This);
      HRESULT (WINAPI *Load)(IPersistMemory *This,LPVOID pMem,ULONG cbSize);
      HRESULT (WINAPI *Save)(IPersistMemory *This,LPVOID pMem,WINBOOL fClearDirty,ULONG cbSize);
      HRESULT (WINAPI *GetSizeMax)(IPersistMemory *This,ULONG *pCbSize);
      HRESULT (WINAPI *InitNew)(IPersistMemory *This);
    END_INTERFACE
  } IPersistMemoryVtbl;
  struct IPersistMemory {
    CONST_VTBL struct IPersistMemoryVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPersistMemory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistMemory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistMemory_Release(This) (This)->lpVtbl->Release(This)
#define IPersistMemory_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
#define IPersistMemory_IsDirty(This) (This)->lpVtbl->IsDirty(This)
#define IPersistMemory_Load(This,pMem,cbSize) (This)->lpVtbl->Load(This,pMem,cbSize)
#define IPersistMemory_Save(This,pMem,fClearDirty,cbSize) (This)->lpVtbl->Save(This,pMem,fClearDirty,cbSize)
#define IPersistMemory_GetSizeMax(This,pCbSize) (This)->lpVtbl->GetSizeMax(This,pCbSize)
#define IPersistMemory_InitNew(This) (This)->lpVtbl->InitNew(This)
#endif
#endif
  HRESULT WINAPI IPersistMemory_IsDirty_Proxy(IPersistMemory *This);
  void __RPC_STUB IPersistMemory_IsDirty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistMemory_RemoteLoad_Proxy(IPersistMemory *This,BYTE *pMem,ULONG cbSize);
  void __RPC_STUB IPersistMemory_RemoteLoad_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistMemory_RemoteSave_Proxy(IPersistMemory *This,BYTE *pMem,WINBOOL fClearDirty,ULONG cbSize);
  void __RPC_STUB IPersistMemory_RemoteSave_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistMemory_GetSizeMax_Proxy(IPersistMemory *This,ULONG *pCbSize);
  void __RPC_STUB IPersistMemory_GetSizeMax_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistMemory_InitNew_Proxy(IPersistMemory *This);
  void __RPC_STUB IPersistMemory_InitNew_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPersistStreamInit_INTERFACE_DEFINED__
#define __IPersistStreamInit_INTERFACE_DEFINED__
  typedef IPersistStreamInit *LPPERSISTSTREAMINIT;

  EXTERN_C const IID IID_IPersistStreamInit;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPersistStreamInit : public IPersist {
  public:
    virtual HRESULT WINAPI IsDirty(void) = 0;
    virtual HRESULT WINAPI Load(LPSTREAM pStm) = 0;
    virtual HRESULT WINAPI Save(LPSTREAM pStm,WINBOOL fClearDirty) = 0;
    virtual HRESULT WINAPI GetSizeMax(ULARGE_INTEGER *pCbSize) = 0;
    virtual HRESULT WINAPI InitNew(void) = 0;
  };
#else
  typedef struct IPersistStreamInitVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPersistStreamInit *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPersistStreamInit *This);
      ULONG (WINAPI *Release)(IPersistStreamInit *This);
      HRESULT (WINAPI *GetClassID)(IPersistStreamInit *This,CLSID *pClassID);
      HRESULT (WINAPI *IsDirty)(IPersistStreamInit *This);
      HRESULT (WINAPI *Load)(IPersistStreamInit *This,LPSTREAM pStm);
      HRESULT (WINAPI *Save)(IPersistStreamInit *This,LPSTREAM pStm,WINBOOL fClearDirty);
      HRESULT (WINAPI *GetSizeMax)(IPersistStreamInit *This,ULARGE_INTEGER *pCbSize);
      HRESULT (WINAPI *InitNew)(IPersistStreamInit *This);
    END_INTERFACE
  } IPersistStreamInitVtbl;
  struct IPersistStreamInit {
    CONST_VTBL struct IPersistStreamInitVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPersistStreamInit_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistStreamInit_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistStreamInit_Release(This) (This)->lpVtbl->Release(This)
#define IPersistStreamInit_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
#define IPersistStreamInit_IsDirty(This) (This)->lpVtbl->IsDirty(This)
#define IPersistStreamInit_Load(This,pStm) (This)->lpVtbl->Load(This,pStm)
#define IPersistStreamInit_Save(This,pStm,fClearDirty) (This)->lpVtbl->Save(This,pStm,fClearDirty)
#define IPersistStreamInit_GetSizeMax(This,pCbSize) (This)->lpVtbl->GetSizeMax(This,pCbSize)
#define IPersistStreamInit_InitNew(This) (This)->lpVtbl->InitNew(This)
#endif
#endif
  HRESULT WINAPI IPersistStreamInit_IsDirty_Proxy(IPersistStreamInit *This);
  void __RPC_STUB IPersistStreamInit_IsDirty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistStreamInit_Load_Proxy(IPersistStreamInit *This,LPSTREAM pStm);
  void __RPC_STUB IPersistStreamInit_Load_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistStreamInit_Save_Proxy(IPersistStreamInit *This,LPSTREAM pStm,WINBOOL fClearDirty);
  void __RPC_STUB IPersistStreamInit_Save_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistStreamInit_GetSizeMax_Proxy(IPersistStreamInit *This,ULARGE_INTEGER *pCbSize);
  void __RPC_STUB IPersistStreamInit_GetSizeMax_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistStreamInit_InitNew_Proxy(IPersistStreamInit *This);
  void __RPC_STUB IPersistStreamInit_InitNew_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPersistPropertyBag_INTERFACE_DEFINED__
#define __IPersistPropertyBag_INTERFACE_DEFINED__
  typedef IPersistPropertyBag *LPPERSISTPROPERTYBAG;

  EXTERN_C const IID IID_IPersistPropertyBag;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPersistPropertyBag : public IPersist {
  public:
    virtual HRESULT WINAPI InitNew(void) = 0;
    virtual HRESULT WINAPI Load(IPropertyBag *pPropBag,IErrorLog *pErrorLog) = 0;
    virtual HRESULT WINAPI Save(IPropertyBag *pPropBag,WINBOOL fClearDirty,WINBOOL fSaveAllProperties) = 0;
  };
#else
  typedef struct IPersistPropertyBagVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPersistPropertyBag *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPersistPropertyBag *This);
      ULONG (WINAPI *Release)(IPersistPropertyBag *This);
      HRESULT (WINAPI *GetClassID)(IPersistPropertyBag *This,CLSID *pClassID);
      HRESULT (WINAPI *InitNew)(IPersistPropertyBag *This);
      HRESULT (WINAPI *Load)(IPersistPropertyBag *This,IPropertyBag *pPropBag,IErrorLog *pErrorLog);
      HRESULT (WINAPI *Save)(IPersistPropertyBag *This,IPropertyBag *pPropBag,WINBOOL fClearDirty,WINBOOL fSaveAllProperties);
    END_INTERFACE
  } IPersistPropertyBagVtbl;
  struct IPersistPropertyBag {
    CONST_VTBL struct IPersistPropertyBagVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPersistPropertyBag_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistPropertyBag_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistPropertyBag_Release(This) (This)->lpVtbl->Release(This)
#define IPersistPropertyBag_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
#define IPersistPropertyBag_InitNew(This) (This)->lpVtbl->InitNew(This)
#define IPersistPropertyBag_Load(This,pPropBag,pErrorLog) (This)->lpVtbl->Load(This,pPropBag,pErrorLog)
#define IPersistPropertyBag_Save(This,pPropBag,fClearDirty,fSaveAllProperties) (This)->lpVtbl->Save(This,pPropBag,fClearDirty,fSaveAllProperties)
#endif
#endif
  HRESULT WINAPI IPersistPropertyBag_InitNew_Proxy(IPersistPropertyBag *This);
  void __RPC_STUB IPersistPropertyBag_InitNew_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistPropertyBag_Load_Proxy(IPersistPropertyBag *This,IPropertyBag *pPropBag,IErrorLog *pErrorLog);
  void __RPC_STUB IPersistPropertyBag_Load_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistPropertyBag_Save_Proxy(IPersistPropertyBag *This,IPropertyBag *pPropBag,WINBOOL fClearDirty,WINBOOL fSaveAllProperties);
  void __RPC_STUB IPersistPropertyBag_Save_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISimpleFrameSite_INTERFACE_DEFINED__
#define __ISimpleFrameSite_INTERFACE_DEFINED__
  typedef ISimpleFrameSite *LPSIMPLEFRAMESITE;

  EXTERN_C const IID IID_ISimpleFrameSite;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISimpleFrameSite : public IUnknown {
  public:
    virtual HRESULT WINAPI PreMessageFilter(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp,LRESULT *plResult,DWORD *pdwCookie) = 0;
    virtual HRESULT WINAPI PostMessageFilter(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp,LRESULT *plResult,DWORD dwCookie) = 0;
  };
#else
  typedef struct ISimpleFrameSiteVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISimpleFrameSite *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISimpleFrameSite *This);
      ULONG (WINAPI *Release)(ISimpleFrameSite *This);
      HRESULT (WINAPI *PreMessageFilter)(ISimpleFrameSite *This,HWND hWnd,UINT msg,WPARAM wp,LPARAM lp,LRESULT *plResult,DWORD *pdwCookie);
      HRESULT (WINAPI *PostMessageFilter)(ISimpleFrameSite *This,HWND hWnd,UINT msg,WPARAM wp,LPARAM lp,LRESULT *plResult,DWORD dwCookie);
    END_INTERFACE
  } ISimpleFrameSiteVtbl;
  struct ISimpleFrameSite {
    CONST_VTBL struct ISimpleFrameSiteVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISimpleFrameSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISimpleFrameSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISimpleFrameSite_Release(This) (This)->lpVtbl->Release(This)
#define ISimpleFrameSite_PreMessageFilter(This,hWnd,msg,wp,lp,plResult,pdwCookie) (This)->lpVtbl->PreMessageFilter(This,hWnd,msg,wp,lp,plResult,pdwCookie)
#define ISimpleFrameSite_PostMessageFilter(This,hWnd,msg,wp,lp,plResult,dwCookie) (This)->lpVtbl->PostMessageFilter(This,hWnd,msg,wp,lp,plResult,dwCookie)
#endif
#endif
  HRESULT WINAPI ISimpleFrameSite_PreMessageFilter_Proxy(ISimpleFrameSite *This,HWND hWnd,UINT msg,WPARAM wp,LPARAM lp,LRESULT *plResult,DWORD *pdwCookie);
  void __RPC_STUB ISimpleFrameSite_PreMessageFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISimpleFrameSite_PostMessageFilter_Proxy(ISimpleFrameSite *This,HWND hWnd,UINT msg,WPARAM wp,LPARAM lp,LRESULT *plResult,DWORD dwCookie);
  void __RPC_STUB ISimpleFrameSite_PostMessageFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IFont_INTERFACE_DEFINED__
#define __IFont_INTERFACE_DEFINED__
  typedef IFont *LPFONT;

#ifndef OLE2ANSI
  typedef TEXTMETRICW TEXTMETRICOLE;
#else
  typedef TEXTMETRIC TEXTMETRICOLE;
#endif
  typedef TEXTMETRICOLE *LPTEXTMETRICOLE;

  EXTERN_C const IID IID_IFont;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IFont : public IUnknown {
  public:
    virtual HRESULT WINAPI get_Name(BSTR *pName) = 0;
    virtual HRESULT WINAPI put_Name(BSTR name) = 0;
    virtual HRESULT WINAPI get_Size(CY *pSize) = 0;
    virtual HRESULT WINAPI put_Size(CY size) = 0;
    virtual HRESULT WINAPI get_Bold(WINBOOL *pBold) = 0;
    virtual HRESULT WINAPI put_Bold(WINBOOL bold) = 0;
    virtual HRESULT WINAPI get_Italic(WINBOOL *pItalic) = 0;
    virtual HRESULT WINAPI put_Italic(WINBOOL italic) = 0;
    virtual HRESULT WINAPI get_Underline(WINBOOL *pUnderline) = 0;
    virtual HRESULT WINAPI put_Underline(WINBOOL underline) = 0;
    virtual HRESULT WINAPI get_Strikethrough(WINBOOL *pStrikethrough) = 0;
    virtual HRESULT WINAPI put_Strikethrough(WINBOOL strikethrough) = 0;
    virtual HRESULT WINAPI get_Weight(SHORT *pWeight) = 0;
    virtual HRESULT WINAPI put_Weight(SHORT weight) = 0;
    virtual HRESULT WINAPI get_Charset(SHORT *pCharset) = 0;
    virtual HRESULT WINAPI put_Charset(SHORT charset) = 0;
    virtual HRESULT WINAPI get_hFont(HFONT *phFont) = 0;
    virtual HRESULT WINAPI Clone(IFont **ppFont) = 0;
    virtual HRESULT WINAPI IsEqual(IFont *pFontOther) = 0;
    virtual HRESULT WINAPI SetRatio(LONG cyLogical,LONG cyHimetric) = 0;
    virtual HRESULT WINAPI QueryTextMetrics(TEXTMETRICOLE *pTM) = 0;
    virtual HRESULT WINAPI AddRefHfont(HFONT hFont) = 0;
    virtual HRESULT WINAPI ReleaseHfont(HFONT hFont) = 0;
    virtual HRESULT WINAPI SetHdc(HDC hDC) = 0;
  };
#else
  typedef struct IFontVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IFont *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IFont *This);
      ULONG (WINAPI *Release)(IFont *This);
      HRESULT (WINAPI *get_Name)(IFont *This,BSTR *pName);
      HRESULT (WINAPI *put_Name)(IFont *This,BSTR name);
      HRESULT (WINAPI *get_Size)(IFont *This,CY *pSize);
      HRESULT (WINAPI *put_Size)(IFont *This,CY size);
      HRESULT (WINAPI *get_Bold)(IFont *This,WINBOOL *pBold);
      HRESULT (WINAPI *put_Bold)(IFont *This,WINBOOL bold);
      HRESULT (WINAPI *get_Italic)(IFont *This,WINBOOL *pItalic);
      HRESULT (WINAPI *put_Italic)(IFont *This,WINBOOL italic);
      HRESULT (WINAPI *get_Underline)(IFont *This,WINBOOL *pUnderline);
      HRESULT (WINAPI *put_Underline)(IFont *This,WINBOOL underline);
      HRESULT (WINAPI *get_Strikethrough)(IFont *This,WINBOOL *pStrikethrough);
      HRESULT (WINAPI *put_Strikethrough)(IFont *This,WINBOOL strikethrough);
      HRESULT (WINAPI *get_Weight)(IFont *This,SHORT *pWeight);
      HRESULT (WINAPI *put_Weight)(IFont *This,SHORT weight);
      HRESULT (WINAPI *get_Charset)(IFont *This,SHORT *pCharset);
      HRESULT (WINAPI *put_Charset)(IFont *This,SHORT charset);
      HRESULT (WINAPI *get_hFont)(IFont *This,HFONT *phFont);
      HRESULT (WINAPI *Clone)(IFont *This,IFont **ppFont);
      HRESULT (WINAPI *IsEqual)(IFont *This,IFont *pFontOther);
      HRESULT (WINAPI *SetRatio)(IFont *This,LONG cyLogical,LONG cyHimetric);
      HRESULT (WINAPI *QueryTextMetrics)(IFont *This,TEXTMETRICOLE *pTM);
      HRESULT (WINAPI *AddRefHfont)(IFont *This,HFONT hFont);
      HRESULT (WINAPI *ReleaseHfont)(IFont *This,HFONT hFont);
      HRESULT (WINAPI *SetHdc)(IFont *This,HDC hDC);
    END_INTERFACE
  } IFontVtbl;
  struct IFont {
    CONST_VTBL struct IFontVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IFont_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFont_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFont_Release(This) (This)->lpVtbl->Release(This)
#define IFont_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
#define IFont_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
#define IFont_get_Size(This,pSize) (This)->lpVtbl->get_Size(This,pSize)
#define IFont_put_Size(This,size) (This)->lpVtbl->put_Size(This,size)
#define IFont_get_Bold(This,pBold) (This)->lpVtbl->get_Bold(This,pBold)
#define IFont_put_Bold(This,bold) (This)->lpVtbl->put_Bold(This,bold)
#define IFont_get_Italic(This,pItalic) (This)->lpVtbl->get_Italic(This,pItalic)
#define IFont_put_Italic(This,italic) (This)->lpVtbl->put_Italic(This,italic)
#define IFont_get_Underline(This,pUnderline) (This)->lpVtbl->get_Underline(This,pUnderline)
#define IFont_put_Underline(This,underline) (This)->lpVtbl->put_Underline(This,underline)
#define IFont_get_Strikethrough(This,pStrikethrough) (This)->lpVtbl->get_Strikethrough(This,pStrikethrough)
#define IFont_put_Strikethrough(This,strikethrough) (This)->lpVtbl->put_Strikethrough(This,strikethrough)
#define IFont_get_Weight(This,pWeight) (This)->lpVtbl->get_Weight(This,pWeight)
#define IFont_put_Weight(This,weight) (This)->lpVtbl->put_Weight(This,weight)
#define IFont_get_Charset(This,pCharset) (This)->lpVtbl->get_Charset(This,pCharset)
#define IFont_put_Charset(This,charset) (This)->lpVtbl->put_Charset(This,charset)
#define IFont_get_hFont(This,phFont) (This)->lpVtbl->get_hFont(This,phFont)
#define IFont_Clone(This,ppFont) (This)->lpVtbl->Clone(This,ppFont)
#define IFont_IsEqual(This,pFontOther) (This)->lpVtbl->IsEqual(This,pFontOther)
#define IFont_SetRatio(This,cyLogical,cyHimetric) (This)->lpVtbl->SetRatio(This,cyLogical,cyHimetric)
#define IFont_QueryTextMetrics(This,pTM) (This)->lpVtbl->QueryTextMetrics(This,pTM)
#define IFont_AddRefHfont(This,hFont) (This)->lpVtbl->AddRefHfont(This,hFont)
#define IFont_ReleaseHfont(This,hFont) (This)->lpVtbl->ReleaseHfont(This,hFont)
#define IFont_SetHdc(This,hDC) (This)->lpVtbl->SetHdc(This,hDC)
#endif
#endif
  HRESULT WINAPI IFont_get_Name_Proxy(IFont *This,BSTR *pName);
  void __RPC_STUB IFont_get_Name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_put_Name_Proxy(IFont *This,BSTR name);
  void __RPC_STUB IFont_put_Name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_get_Size_Proxy(IFont *This,CY *pSize);
  void __RPC_STUB IFont_get_Size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_put_Size_Proxy(IFont *This,CY size);
  void __RPC_STUB IFont_put_Size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_get_Bold_Proxy(IFont *This,WINBOOL *pBold);
  void __RPC_STUB IFont_get_Bold_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_put_Bold_Proxy(IFont *This,WINBOOL bold);
  void __RPC_STUB IFont_put_Bold_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_get_Italic_Proxy(IFont *This,WINBOOL *pItalic);
  void __RPC_STUB IFont_get_Italic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_put_Italic_Proxy(IFont *This,WINBOOL italic);
  void __RPC_STUB IFont_put_Italic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_get_Underline_Proxy(IFont *This,WINBOOL *pUnderline);
  void __RPC_STUB IFont_get_Underline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_put_Underline_Proxy(IFont *This,WINBOOL underline);
  void __RPC_STUB IFont_put_Underline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_get_Strikethrough_Proxy(IFont *This,WINBOOL *pStrikethrough);
  void __RPC_STUB IFont_get_Strikethrough_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_put_Strikethrough_Proxy(IFont *This,WINBOOL strikethrough);
  void __RPC_STUB IFont_put_Strikethrough_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_get_Weight_Proxy(IFont *This,SHORT *pWeight);
  void __RPC_STUB IFont_get_Weight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_put_Weight_Proxy(IFont *This,SHORT weight);
  void __RPC_STUB IFont_put_Weight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_get_Charset_Proxy(IFont *This,SHORT *pCharset);
  void __RPC_STUB IFont_get_Charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_put_Charset_Proxy(IFont *This,SHORT charset);
  void __RPC_STUB IFont_put_Charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_get_hFont_Proxy(IFont *This,HFONT *phFont);
  void __RPC_STUB IFont_get_hFont_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_Clone_Proxy(IFont *This,IFont **ppFont);
  void __RPC_STUB IFont_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_IsEqual_Proxy(IFont *This,IFont *pFontOther);
  void __RPC_STUB IFont_IsEqual_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_SetRatio_Proxy(IFont *This,LONG cyLogical,LONG cyHimetric);
  void __RPC_STUB IFont_SetRatio_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_QueryTextMetrics_Proxy(IFont *This,TEXTMETRICOLE *pTM);
  void __RPC_STUB IFont_QueryTextMetrics_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_AddRefHfont_Proxy(IFont *This,HFONT hFont);
  void __RPC_STUB IFont_AddRefHfont_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_ReleaseHfont_Proxy(IFont *This,HFONT hFont);
  void __RPC_STUB IFont_ReleaseHfont_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IFont_SetHdc_Proxy(IFont *This,HDC hDC);
  void __RPC_STUB IFont_SetHdc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPicture_INTERFACE_DEFINED__
#define __IPicture_INTERFACE_DEFINED__
  typedef IPicture *LPPICTURE;

  typedef enum tagPictureAttributes {
    PICTURE_SCALABLE = 0x1,PICTURE_TRANSPARENT = 0x2
  } PICTUREATTRIBUTES;

  typedef UINT OLE_HANDLE;
  typedef LONG OLE_XPOS_HIMETRIC;
  typedef LONG OLE_YPOS_HIMETRIC;
  typedef LONG OLE_XSIZE_HIMETRIC;
  typedef LONG OLE_YSIZE_HIMETRIC;

  EXTERN_C const IID IID_IPicture;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPicture : public IUnknown {
  public:
    virtual HRESULT WINAPI get_Handle(OLE_HANDLE *pHandle) = 0;
    virtual HRESULT WINAPI get_hPal(OLE_HANDLE *phPal) = 0;
    virtual HRESULT WINAPI get_Type(SHORT *pType) = 0;
    virtual HRESULT WINAPI get_Width(OLE_XSIZE_HIMETRIC *pWidth) = 0;
    virtual HRESULT WINAPI get_Height(OLE_YSIZE_HIMETRIC *pHeight) = 0;
    virtual HRESULT WINAPI Render(HDC hDC,LONG x,LONG y,LONG cx,LONG cy,OLE_XPOS_HIMETRIC xSrc,OLE_YPOS_HIMETRIC ySrc,OLE_XSIZE_HIMETRIC cxSrc,OLE_YSIZE_HIMETRIC cySrc,LPCRECT pRcWBounds) = 0;
    virtual HRESULT WINAPI set_hPal(OLE_HANDLE hPal) = 0;
    virtual HRESULT WINAPI get_CurDC(HDC *phDC) = 0;
    virtual HRESULT WINAPI SelectPicture(HDC hDCIn,HDC *phDCOut,OLE_HANDLE *phBmpOut) = 0;
    virtual HRESULT WINAPI get_KeepOriginalFormat(WINBOOL *pKeep) = 0;
    virtual HRESULT WINAPI put_KeepOriginalFormat(WINBOOL keep) = 0;
    virtual HRESULT WINAPI PictureChanged(void) = 0;
    virtual HRESULT WINAPI SaveAsFile(LPSTREAM pStream,WINBOOL fSaveMemCopy,LONG *pCbSize) = 0;
    virtual HRESULT WINAPI get_Attributes(DWORD *pDwAttr) = 0;
  };
#else
  typedef struct IPictureVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPicture *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPicture *This);
      ULONG (WINAPI *Release)(IPicture *This);
      HRESULT (WINAPI *get_Handle)(IPicture *This,OLE_HANDLE *pHandle);
      HRESULT (WINAPI *get_hPal)(IPicture *This,OLE_HANDLE *phPal);
      HRESULT (WINAPI *get_Type)(IPicture *This,SHORT *pType);
      HRESULT (WINAPI *get_Width)(IPicture *This,OLE_XSIZE_HIMETRIC *pWidth);
      HRESULT (WINAPI *get_Height)(IPicture *This,OLE_YSIZE_HIMETRIC *pHeight);
      HRESULT (WINAPI *Render)(IPicture *This,HDC hDC,LONG x,LONG y,LONG cx,LONG cy,OLE_XPOS_HIMETRIC xSrc,OLE_YPOS_HIMETRIC ySrc,OLE_XSIZE_HIMETRIC cxSrc,OLE_YSIZE_HIMETRIC cySrc,LPCRECT pRcWBounds);
      HRESULT (WINAPI *set_hPal)(IPicture *This,OLE_HANDLE hPal);
      HRESULT (WINAPI *get_CurDC)(IPicture *This,HDC *phDC);
      HRESULT (WINAPI *SelectPicture)(IPicture *This,HDC hDCIn,HDC *phDCOut,OLE_HANDLE *phBmpOut);
      HRESULT (WINAPI *get_KeepOriginalFormat)(IPicture *This,WINBOOL *pKeep);
      HRESULT (WINAPI *put_KeepOriginalFormat)(IPicture *This,WINBOOL keep);
      HRESULT (WINAPI *PictureChanged)(IPicture *This);
      HRESULT (WINAPI *SaveAsFile)(IPicture *This,LPSTREAM pStream,WINBOOL fSaveMemCopy,LONG *pCbSize);
      HRESULT (WINAPI *get_Attributes)(IPicture *This,DWORD *pDwAttr);
    END_INTERFACE
  } IPictureVtbl;
  struct IPicture {
    CONST_VTBL struct IPictureVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPicture_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPicture_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPicture_Release(This) (This)->lpVtbl->Release(This)
#define IPicture_get_Handle(This,pHandle) (This)->lpVtbl->get_Handle(This,pHandle)
#define IPicture_get_hPal(This,phPal) (This)->lpVtbl->get_hPal(This,phPal)
#define IPicture_get_Type(This,pType) (This)->lpVtbl->get_Type(This,pType)
#define IPicture_get_Width(This,pWidth) (This)->lpVtbl->get_Width(This,pWidth)
#define IPicture_get_Height(This,pHeight) (This)->lpVtbl->get_Height(This,pHeight)
#define IPicture_Render(This,hDC,x,y,cx,cy,xSrc,ySrc,cxSrc,cySrc,pRcWBounds) (This)->lpVtbl->Render(This,hDC,x,y,cx,cy,xSrc,ySrc,cxSrc,cySrc,pRcWBounds)
#define IPicture_set_hPal(This,hPal) (This)->lpVtbl->set_hPal(This,hPal)
#define IPicture_get_CurDC(This,phDC) (This)->lpVtbl->get_CurDC(This,phDC)
#define IPicture_SelectPicture(This,hDCIn,phDCOut,phBmpOut) (This)->lpVtbl->SelectPicture(This,hDCIn,phDCOut,phBmpOut)
#define IPicture_get_KeepOriginalFormat(This,pKeep) (This)->lpVtbl->get_KeepOriginalFormat(This,pKeep)
#define IPicture_put_KeepOriginalFormat(This,keep) (This)->lpVtbl->put_KeepOriginalFormat(This,keep)
#define IPicture_PictureChanged(This) (This)->lpVtbl->PictureChanged(This)
#define IPicture_SaveAsFile(This,pStream,fSaveMemCopy,pCbSize) (This)->lpVtbl->SaveAsFile(This,pStream,fSaveMemCopy,pCbSize)
#define IPicture_get_Attributes(This,pDwAttr) (This)->lpVtbl->get_Attributes(This,pDwAttr)
#endif
#endif
  HRESULT WINAPI IPicture_get_Handle_Proxy(IPicture *This,OLE_HANDLE *pHandle);
  void __RPC_STUB IPicture_get_Handle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_get_hPal_Proxy(IPicture *This,OLE_HANDLE *phPal);
  void __RPC_STUB IPicture_get_hPal_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_get_Type_Proxy(IPicture *This,SHORT *pType);
  void __RPC_STUB IPicture_get_Type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_get_Width_Proxy(IPicture *This,OLE_XSIZE_HIMETRIC *pWidth);
  void __RPC_STUB IPicture_get_Width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_get_Height_Proxy(IPicture *This,OLE_YSIZE_HIMETRIC *pHeight);
  void __RPC_STUB IPicture_get_Height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_Render_Proxy(IPicture *This,HDC hDC,LONG x,LONG y,LONG cx,LONG cy,OLE_XPOS_HIMETRIC xSrc,OLE_YPOS_HIMETRIC ySrc,OLE_XSIZE_HIMETRIC cxSrc,OLE_YSIZE_HIMETRIC cySrc,LPCRECT pRcWBounds);
  void __RPC_STUB IPicture_Render_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_set_hPal_Proxy(IPicture *This,OLE_HANDLE hPal);
  void __RPC_STUB IPicture_set_hPal_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_get_CurDC_Proxy(IPicture *This,HDC *phDC);
  void __RPC_STUB IPicture_get_CurDC_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_SelectPicture_Proxy(IPicture *This,HDC hDCIn,HDC *phDCOut,OLE_HANDLE *phBmpOut);
  void __RPC_STUB IPicture_SelectPicture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_get_KeepOriginalFormat_Proxy(IPicture *This,WINBOOL *pKeep);
  void __RPC_STUB IPicture_get_KeepOriginalFormat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_put_KeepOriginalFormat_Proxy(IPicture *This,WINBOOL keep);
  void __RPC_STUB IPicture_put_KeepOriginalFormat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_PictureChanged_Proxy(IPicture *This);
  void __RPC_STUB IPicture_PictureChanged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_SaveAsFile_Proxy(IPicture *This,LPSTREAM pStream,WINBOOL fSaveMemCopy,LONG *pCbSize);
  void __RPC_STUB IPicture_SaveAsFile_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPicture_get_Attributes_Proxy(IPicture *This,DWORD *pDwAttr);
  void __RPC_STUB IPicture_get_Attributes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IFontEventsDisp_INTERFACE_DEFINED__
#define __IFontEventsDisp_INTERFACE_DEFINED__
  typedef IFontEventsDisp *LPFONTEVENTS;

  EXTERN_C const IID IID_IFontEventsDisp;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IFontEventsDisp : public IDispatch {
  };
#else
  typedef struct IFontEventsDispVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IFontEventsDisp *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IFontEventsDisp *This);
      ULONG (WINAPI *Release)(IFontEventsDisp *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IFontEventsDisp *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IFontEventsDisp *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IFontEventsDisp *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IFontEventsDisp *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
    END_INTERFACE
  } IFontEventsDispVtbl;
  struct IFontEventsDisp {
    CONST_VTBL struct IFontEventsDispVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IFontEventsDisp_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFontEventsDisp_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFontEventsDisp_Release(This) (This)->lpVtbl->Release(This)
#define IFontEventsDisp_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFontEventsDisp_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFontEventsDisp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFontEventsDisp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#endif
#endif
#endif

#ifndef __IFontDisp_INTERFACE_DEFINED__
#define __IFontDisp_INTERFACE_DEFINED__
  typedef IFontDisp *LPFONTDISP;

  EXTERN_C const IID IID_IFontDisp;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IFontDisp : public IDispatch {
  };
#else
  typedef struct IFontDispVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IFontDisp *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IFontDisp *This);
      ULONG (WINAPI *Release)(IFontDisp *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IFontDisp *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IFontDisp *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IFontDisp *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IFontDisp *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
    END_INTERFACE
  } IFontDispVtbl;
  struct IFontDisp {
    CONST_VTBL struct IFontDispVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IFontDisp_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFontDisp_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFontDisp_Release(This) (This)->lpVtbl->Release(This)
#define IFontDisp_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFontDisp_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFontDisp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFontDisp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#endif
#endif
#endif

#ifndef __IPictureDisp_INTERFACE_DEFINED__
#define __IPictureDisp_INTERFACE_DEFINED__
  typedef IPictureDisp *LPPICTUREDISP;

  EXTERN_C const IID IID_IPictureDisp;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPictureDisp : public IDispatch {
  };
#else
  typedef struct IPictureDispVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPictureDisp *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPictureDisp *This);
      ULONG (WINAPI *Release)(IPictureDisp *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IPictureDisp *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IPictureDisp *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IPictureDisp *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IPictureDisp *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
    END_INTERFACE
  } IPictureDispVtbl;
  struct IPictureDisp {
    CONST_VTBL struct IPictureDispVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPictureDisp_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPictureDisp_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPictureDisp_Release(This) (This)->lpVtbl->Release(This)
#define IPictureDisp_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IPictureDisp_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IPictureDisp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IPictureDisp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#endif
#endif
#endif

#ifndef __IOleInPlaceObjectWindowless_INTERFACE_DEFINED__
#define __IOleInPlaceObjectWindowless_INTERFACE_DEFINED__
  typedef IOleInPlaceObjectWindowless *LPOLEINPLACEOBJECTWINDOWLESS;

  EXTERN_C const IID IID_IOleInPlaceObjectWindowless;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleInPlaceObjectWindowless : public IOleInPlaceObject {
  public:
    virtual HRESULT WINAPI OnWindowMessage(UINT msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult) = 0;
    virtual HRESULT WINAPI GetDropTarget(IDropTarget **ppDropTarget) = 0;
  };
#else
  typedef struct IOleInPlaceObjectWindowlessVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleInPlaceObjectWindowless *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleInPlaceObjectWindowless *This);
      ULONG (WINAPI *Release)(IOleInPlaceObjectWindowless *This);
      HRESULT (WINAPI *GetWindow)(IOleInPlaceObjectWindowless *This,HWND *phwnd);
      HRESULT (WINAPI *ContextSensitiveHelp)(IOleInPlaceObjectWindowless *This,WINBOOL fEnterMode);
      HRESULT (WINAPI *InPlaceDeactivate)(IOleInPlaceObjectWindowless *This);
      HRESULT (WINAPI *UIDeactivate)(IOleInPlaceObjectWindowless *This);
      HRESULT (WINAPI *SetObjectRects)(IOleInPlaceObjectWindowless *This,LPCRECT lprcPosRect,LPCRECT lprcClipRect);
      HRESULT (WINAPI *ReactivateAndUndo)(IOleInPlaceObjectWindowless *This);
      HRESULT (WINAPI *OnWindowMessage)(IOleInPlaceObjectWindowless *This,UINT msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult);
      HRESULT (WINAPI *GetDropTarget)(IOleInPlaceObjectWindowless *This,IDropTarget **ppDropTarget);
    END_INTERFACE
  } IOleInPlaceObjectWindowlessVtbl;
  struct IOleInPlaceObjectWindowless {
    CONST_VTBL struct IOleInPlaceObjectWindowlessVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleInPlaceObjectWindowless_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleInPlaceObjectWindowless_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleInPlaceObjectWindowless_Release(This) (This)->lpVtbl->Release(This)
#define IOleInPlaceObjectWindowless_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IOleInPlaceObjectWindowless_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
#define IOleInPlaceObjectWindowless_InPlaceDeactivate(This) (This)->lpVtbl->InPlaceDeactivate(This)
#define IOleInPlaceObjectWindowless_UIDeactivate(This) (This)->lpVtbl->UIDeactivate(This)
#define IOleInPlaceObjectWindowless_SetObjectRects(This,lprcPosRect,lprcClipRect) (This)->lpVtbl->SetObjectRects(This,lprcPosRect,lprcClipRect)
#define IOleInPlaceObjectWindowless_ReactivateAndUndo(This) (This)->lpVtbl->ReactivateAndUndo(This)
#define IOleInPlaceObjectWindowless_OnWindowMessage(This,msg,wParam,lParam,plResult) (This)->lpVtbl->OnWindowMessage(This,msg,wParam,lParam,plResult)
#define IOleInPlaceObjectWindowless_GetDropTarget(This,ppDropTarget) (This)->lpVtbl->GetDropTarget(This,ppDropTarget)
#endif
#endif
  HRESULT WINAPI IOleInPlaceObjectWindowless_OnWindowMessage_Proxy(IOleInPlaceObjectWindowless *This,UINT msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult);
  void __RPC_STUB IOleInPlaceObjectWindowless_OnWindowMessage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceObjectWindowless_GetDropTarget_Proxy(IOleInPlaceObjectWindowless *This,IDropTarget **ppDropTarget);
  void __RPC_STUB IOleInPlaceObjectWindowless_GetDropTarget_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleInPlaceSiteEx_INTERFACE_DEFINED__
#define __IOleInPlaceSiteEx_INTERFACE_DEFINED__
  typedef IOleInPlaceSiteEx *LPOLEINPLACESITEEX;

  typedef enum tagACTIVATEFLAGS {
    ACTIVATE_WINDOWLESS = 1
  } ACTIVATEFLAGS;

  EXTERN_C const IID IID_IOleInPlaceSiteEx;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleInPlaceSiteEx : public IOleInPlaceSite {
  public:
    virtual HRESULT WINAPI OnInPlaceActivateEx(WINBOOL *pfNoRedraw,DWORD dwFlags) = 0;
    virtual HRESULT WINAPI OnInPlaceDeactivateEx(WINBOOL fNoRedraw) = 0;
    virtual HRESULT WINAPI RequestUIActivate(void) = 0;
  };
#else
  typedef struct IOleInPlaceSiteExVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleInPlaceSiteEx *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleInPlaceSiteEx *This);
      ULONG (WINAPI *Release)(IOleInPlaceSiteEx *This);
      HRESULT (WINAPI *GetWindow)(IOleInPlaceSiteEx *This,HWND *phwnd);
      HRESULT (WINAPI *ContextSensitiveHelp)(IOleInPlaceSiteEx *This,WINBOOL fEnterMode);
      HRESULT (WINAPI *CanInPlaceActivate)(IOleInPlaceSiteEx *This);
      HRESULT (WINAPI *OnInPlaceActivate)(IOleInPlaceSiteEx *This);
      HRESULT (WINAPI *OnUIActivate)(IOleInPlaceSiteEx *This);
      HRESULT (WINAPI *GetWindowContext)(IOleInPlaceSiteEx *This,IOleInPlaceFrame **ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT lprcPosRect,LPRECT lprcClipRect,LPOLEINPLACEFRAMEINFO lpFrameInfo);
      HRESULT (WINAPI *Scroll)(IOleInPlaceSiteEx *This,SIZE scrollExtant);
      HRESULT (WINAPI *OnUIDeactivate)(IOleInPlaceSiteEx *This,WINBOOL fUndoable);
      HRESULT (WINAPI *OnInPlaceDeactivate)(IOleInPlaceSiteEx *This);
      HRESULT (WINAPI *DiscardUndoState)(IOleInPlaceSiteEx *This);
      HRESULT (WINAPI *DeactivateAndUndo)(IOleInPlaceSiteEx *This);
      HRESULT (WINAPI *OnPosRectChange)(IOleInPlaceSiteEx *This,LPCRECT lprcPosRect);
      HRESULT (WINAPI *OnInPlaceActivateEx)(IOleInPlaceSiteEx *This,WINBOOL *pfNoRedraw,DWORD dwFlags);
      HRESULT (WINAPI *OnInPlaceDeactivateEx)(IOleInPlaceSiteEx *This,WINBOOL fNoRedraw);
      HRESULT (WINAPI *RequestUIActivate)(IOleInPlaceSiteEx *This);
    END_INTERFACE
  } IOleInPlaceSiteExVtbl;
  struct IOleInPlaceSiteEx {
    CONST_VTBL struct IOleInPlaceSiteExVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleInPlaceSiteEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleInPlaceSiteEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleInPlaceSiteEx_Release(This) (This)->lpVtbl->Release(This)
#define IOleInPlaceSiteEx_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IOleInPlaceSiteEx_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
#define IOleInPlaceSiteEx_CanInPlaceActivate(This) (This)->lpVtbl->CanInPlaceActivate(This)
#define IOleInPlaceSiteEx_OnInPlaceActivate(This) (This)->lpVtbl->OnInPlaceActivate(This)
#define IOleInPlaceSiteEx_OnUIActivate(This) (This)->lpVtbl->OnUIActivate(This)
#define IOleInPlaceSiteEx_GetWindowContext(This,ppFrame,ppDoc,lprcPosRect,lprcClipRect,lpFrameInfo) (This)->lpVtbl->GetWindowContext(This,ppFrame,ppDoc,lprcPosRect,lprcClipRect,lpFrameInfo)
#define IOleInPlaceSiteEx_Scroll(This,scrollExtant) (This)->lpVtbl->Scroll(This,scrollExtant)
#define IOleInPlaceSiteEx_OnUIDeactivate(This,fUndoable) (This)->lpVtbl->OnUIDeactivate(This,fUndoable)
#define IOleInPlaceSiteEx_OnInPlaceDeactivate(This) (This)->lpVtbl->OnInPlaceDeactivate(This)
#define IOleInPlaceSiteEx_DiscardUndoState(This) (This)->lpVtbl->DiscardUndoState(This)
#define IOleInPlaceSiteEx_DeactivateAndUndo(This) (This)->lpVtbl->DeactivateAndUndo(This)
#define IOleInPlaceSiteEx_OnPosRectChange(This,lprcPosRect) (This)->lpVtbl->OnPosRectChange(This,lprcPosRect)
#define IOleInPlaceSiteEx_OnInPlaceActivateEx(This,pfNoRedraw,dwFlags) (This)->lpVtbl->OnInPlaceActivateEx(This,pfNoRedraw,dwFlags)
#define IOleInPlaceSiteEx_OnInPlaceDeactivateEx(This,fNoRedraw) (This)->lpVtbl->OnInPlaceDeactivateEx(This,fNoRedraw)
#define IOleInPlaceSiteEx_RequestUIActivate(This) (This)->lpVtbl->RequestUIActivate(This)
#endif
#endif
  HRESULT WINAPI IOleInPlaceSiteEx_OnInPlaceActivateEx_Proxy(IOleInPlaceSiteEx *This,WINBOOL *pfNoRedraw,DWORD dwFlags);
  void __RPC_STUB IOleInPlaceSiteEx_OnInPlaceActivateEx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteEx_OnInPlaceDeactivateEx_Proxy(IOleInPlaceSiteEx *This,WINBOOL fNoRedraw);
  void __RPC_STUB IOleInPlaceSiteEx_OnInPlaceDeactivateEx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteEx_RequestUIActivate_Proxy(IOleInPlaceSiteEx *This);
  void __RPC_STUB IOleInPlaceSiteEx_RequestUIActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleInPlaceSiteWindowless_INTERFACE_DEFINED__
#define __IOleInPlaceSiteWindowless_INTERFACE_DEFINED__
  typedef IOleInPlaceSiteWindowless *LPOLEINPLACESITEWINDOWLESS;

  typedef enum tagOLEDCFLAGS {
    OLEDC_NODRAW = 0x1,OLEDC_PAINTBKGND = 0x2,OLEDC_OFFSCREEN = 0x4
  } OLEDCFLAGS;

  EXTERN_C const IID IID_IOleInPlaceSiteWindowless;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleInPlaceSiteWindowless : public IOleInPlaceSiteEx {
  public:
    virtual HRESULT WINAPI CanWindowlessActivate(void) = 0;
    virtual HRESULT WINAPI GetCapture(void) = 0;
    virtual HRESULT WINAPI SetCapture(WINBOOL fCapture) = 0;
    virtual HRESULT WINAPI GetFocus(void) = 0;
    virtual HRESULT WINAPI SetFocus(WINBOOL fFocus) = 0;
    virtual HRESULT WINAPI GetDC(LPCRECT pRect,DWORD grfFlags,HDC *phDC) = 0;
    virtual HRESULT WINAPI ReleaseDC(HDC hDC) = 0;
    virtual HRESULT WINAPI InvalidateRect(LPCRECT pRect,WINBOOL fErase) = 0;
    virtual HRESULT WINAPI InvalidateRgn(HRGN hRGN,WINBOOL fErase) = 0;
    virtual HRESULT WINAPI ScrollRect(INT dx,INT dy,LPCRECT pRectScroll,LPCRECT pRectClip) = 0;
    virtual HRESULT WINAPI AdjustRect(LPRECT prc) = 0;
    virtual HRESULT WINAPI OnDefWindowMessage(UINT msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult) = 0;
  };
#else
  typedef struct IOleInPlaceSiteWindowlessVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleInPlaceSiteWindowless *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleInPlaceSiteWindowless *This);
      ULONG (WINAPI *Release)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *GetWindow)(IOleInPlaceSiteWindowless *This,HWND *phwnd);
      HRESULT (WINAPI *ContextSensitiveHelp)(IOleInPlaceSiteWindowless *This,WINBOOL fEnterMode);
      HRESULT (WINAPI *CanInPlaceActivate)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *OnInPlaceActivate)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *OnUIActivate)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *GetWindowContext)(IOleInPlaceSiteWindowless *This,IOleInPlaceFrame **ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT lprcPosRect,LPRECT lprcClipRect,LPOLEINPLACEFRAMEINFO lpFrameInfo);
      HRESULT (WINAPI *Scroll)(IOleInPlaceSiteWindowless *This,SIZE scrollExtant);
      HRESULT (WINAPI *OnUIDeactivate)(IOleInPlaceSiteWindowless *This,WINBOOL fUndoable);
      HRESULT (WINAPI *OnInPlaceDeactivate)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *DiscardUndoState)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *DeactivateAndUndo)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *OnPosRectChange)(IOleInPlaceSiteWindowless *This,LPCRECT lprcPosRect);
      HRESULT (WINAPI *OnInPlaceActivateEx)(IOleInPlaceSiteWindowless *This,WINBOOL *pfNoRedraw,DWORD dwFlags);
      HRESULT (WINAPI *OnInPlaceDeactivateEx)(IOleInPlaceSiteWindowless *This,WINBOOL fNoRedraw);
      HRESULT (WINAPI *RequestUIActivate)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *CanWindowlessActivate)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *GetCapture)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *SetCapture)(IOleInPlaceSiteWindowless *This,WINBOOL fCapture);
      HRESULT (WINAPI *GetFocus)(IOleInPlaceSiteWindowless *This);
      HRESULT (WINAPI *SetFocus)(IOleInPlaceSiteWindowless *This,WINBOOL fFocus);
      HRESULT (WINAPI *GetDC)(IOleInPlaceSiteWindowless *This,LPCRECT pRect,DWORD grfFlags,HDC *phDC);
      HRESULT (WINAPI *ReleaseDC)(IOleInPlaceSiteWindowless *This,HDC hDC);
      HRESULT (WINAPI *InvalidateRect)(IOleInPlaceSiteWindowless *This,LPCRECT pRect,WINBOOL fErase);
      HRESULT (WINAPI *InvalidateRgn)(IOleInPlaceSiteWindowless *This,HRGN hRGN,WINBOOL fErase);
      HRESULT (WINAPI *ScrollRect)(IOleInPlaceSiteWindowless *This,INT dx,INT dy,LPCRECT pRectScroll,LPCRECT pRectClip);
      HRESULT (WINAPI *AdjustRect)(IOleInPlaceSiteWindowless *This,LPRECT prc);
      HRESULT (WINAPI *OnDefWindowMessage)(IOleInPlaceSiteWindowless *This,UINT msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult);
    END_INTERFACE
  } IOleInPlaceSiteWindowlessVtbl;
  struct IOleInPlaceSiteWindowless {
    CONST_VTBL struct IOleInPlaceSiteWindowlessVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleInPlaceSiteWindowless_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleInPlaceSiteWindowless_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleInPlaceSiteWindowless_Release(This) (This)->lpVtbl->Release(This)
#define IOleInPlaceSiteWindowless_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IOleInPlaceSiteWindowless_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
#define IOleInPlaceSiteWindowless_CanInPlaceActivate(This) (This)->lpVtbl->CanInPlaceActivate(This)
#define IOleInPlaceSiteWindowless_OnInPlaceActivate(This) (This)->lpVtbl->OnInPlaceActivate(This)
#define IOleInPlaceSiteWindowless_OnUIActivate(This) (This)->lpVtbl->OnUIActivate(This)
#define IOleInPlaceSiteWindowless_GetWindowContext(This,ppFrame,ppDoc,lprcPosRect,lprcClipRect,lpFrameInfo) (This)->lpVtbl->GetWindowContext(This,ppFrame,ppDoc,lprcPosRect,lprcClipRect,lpFrameInfo)
#define IOleInPlaceSiteWindowless_Scroll(This,scrollExtant) (This)->lpVtbl->Scroll(This,scrollExtant)
#define IOleInPlaceSiteWindowless_OnUIDeactivate(This,fUndoable) (This)->lpVtbl->OnUIDeactivate(This,fUndoable)
#define IOleInPlaceSiteWindowless_OnInPlaceDeactivate(This) (This)->lpVtbl->OnInPlaceDeactivate(This)
#define IOleInPlaceSiteWindowless_DiscardUndoState(This) (This)->lpVtbl->DiscardUndoState(This)
#define IOleInPlaceSiteWindowless_DeactivateAndUndo(This) (This)->lpVtbl->DeactivateAndUndo(This)
#define IOleInPlaceSiteWindowless_OnPosRectChange(This,lprcPosRect) (This)->lpVtbl->OnPosRectChange(This,lprcPosRect)
#define IOleInPlaceSiteWindowless_OnInPlaceActivateEx(This,pfNoRedraw,dwFlags) (This)->lpVtbl->OnInPlaceActivateEx(This,pfNoRedraw,dwFlags)
#define IOleInPlaceSiteWindowless_OnInPlaceDeactivateEx(This,fNoRedraw) (This)->lpVtbl->OnInPlaceDeactivateEx(This,fNoRedraw)
#define IOleInPlaceSiteWindowless_RequestUIActivate(This) (This)->lpVtbl->RequestUIActivate(This)
#define IOleInPlaceSiteWindowless_CanWindowlessActivate(This) (This)->lpVtbl->CanWindowlessActivate(This)
#define IOleInPlaceSiteWindowless_GetCapture(This) (This)->lpVtbl->GetCapture(This)
#define IOleInPlaceSiteWindowless_SetCapture(This,fCapture) (This)->lpVtbl->SetCapture(This,fCapture)
#define IOleInPlaceSiteWindowless_GetFocus(This) (This)->lpVtbl->GetFocus(This)
#define IOleInPlaceSiteWindowless_SetFocus(This,fFocus) (This)->lpVtbl->SetFocus(This,fFocus)
#define IOleInPlaceSiteWindowless_GetDC(This,pRect,grfFlags,phDC) (This)->lpVtbl->GetDC(This,pRect,grfFlags,phDC)
#define IOleInPlaceSiteWindowless_ReleaseDC(This,hDC) (This)->lpVtbl->ReleaseDC(This,hDC)
#define IOleInPlaceSiteWindowless_InvalidateRect(This,pRect,fErase) (This)->lpVtbl->InvalidateRect(This,pRect,fErase)
#define IOleInPlaceSiteWindowless_InvalidateRgn(This,hRGN,fErase) (This)->lpVtbl->InvalidateRgn(This,hRGN,fErase)
#define IOleInPlaceSiteWindowless_ScrollRect(This,dx,dy,pRectScroll,pRectClip) (This)->lpVtbl->ScrollRect(This,dx,dy,pRectScroll,pRectClip)
#define IOleInPlaceSiteWindowless_AdjustRect(This,prc) (This)->lpVtbl->AdjustRect(This,prc)
#define IOleInPlaceSiteWindowless_OnDefWindowMessage(This,msg,wParam,lParam,plResult) (This)->lpVtbl->OnDefWindowMessage(This,msg,wParam,lParam,plResult)
#endif
#endif
  HRESULT WINAPI IOleInPlaceSiteWindowless_CanWindowlessActivate_Proxy(IOleInPlaceSiteWindowless *This);
  void __RPC_STUB IOleInPlaceSiteWindowless_CanWindowlessActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_GetCapture_Proxy(IOleInPlaceSiteWindowless *This);
  void __RPC_STUB IOleInPlaceSiteWindowless_GetCapture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_SetCapture_Proxy(IOleInPlaceSiteWindowless *This,WINBOOL fCapture);
  void __RPC_STUB IOleInPlaceSiteWindowless_SetCapture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_GetFocus_Proxy(IOleInPlaceSiteWindowless *This);
  void __RPC_STUB IOleInPlaceSiteWindowless_GetFocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_SetFocus_Proxy(IOleInPlaceSiteWindowless *This,WINBOOL fFocus);
  void __RPC_STUB IOleInPlaceSiteWindowless_SetFocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_GetDC_Proxy(IOleInPlaceSiteWindowless *This,LPCRECT pRect,DWORD grfFlags,HDC *phDC);
  void __RPC_STUB IOleInPlaceSiteWindowless_GetDC_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_ReleaseDC_Proxy(IOleInPlaceSiteWindowless *This,HDC hDC);
  void __RPC_STUB IOleInPlaceSiteWindowless_ReleaseDC_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_InvalidateRect_Proxy(IOleInPlaceSiteWindowless *This,LPCRECT pRect,WINBOOL fErase);
  void __RPC_STUB IOleInPlaceSiteWindowless_InvalidateRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_InvalidateRgn_Proxy(IOleInPlaceSiteWindowless *This,HRGN hRGN,WINBOOL fErase);
  void __RPC_STUB IOleInPlaceSiteWindowless_InvalidateRgn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_ScrollRect_Proxy(IOleInPlaceSiteWindowless *This,INT dx,INT dy,LPCRECT pRectScroll,LPCRECT pRectClip);
  void __RPC_STUB IOleInPlaceSiteWindowless_ScrollRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_AdjustRect_Proxy(IOleInPlaceSiteWindowless *This,LPRECT prc);
  void __RPC_STUB IOleInPlaceSiteWindowless_AdjustRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSiteWindowless_OnDefWindowMessage_Proxy(IOleInPlaceSiteWindowless *This,UINT msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult);
  void __RPC_STUB IOleInPlaceSiteWindowless_OnDefWindowMessage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IViewObjectEx_INTERFACE_DEFINED__
#define __IViewObjectEx_INTERFACE_DEFINED__
  typedef IViewObjectEx *LPVIEWOBJECTEX;

  typedef enum tagVIEWSTATUS {
    VIEWSTATUS_OPAQUE = 1,VIEWSTATUS_SOLIDBKGND = 2,VIEWSTATUS_DVASPECTOPAQUE = 4,VIEWSTATUS_DVASPECTTRANSPARENT = 8,VIEWSTATUS_SURFACE = 16,
    VIEWSTATUS_3DSURFACE = 32
  } VIEWSTATUS;

  typedef enum tagHITRESULT {
    HITRESULT_OUTSIDE = 0,HITRESULT_TRANSPARENT = 1,HITRESULT_CLOSE = 2,HITRESULT_HIT = 3
  } HITRESULT;

  typedef enum tagDVASPECT2 {
    DVASPECT_OPAQUE = 16,DVASPECT_TRANSPARENT = 32
  } DVASPECT2;

  typedef struct tagExtentInfo {
    ULONG cb;
    DWORD dwExtentMode;
    SIZEL sizelProposed;
  } DVEXTENTINFO;

  typedef enum tagExtentMode {
    DVEXTENT_CONTENT = 0,DVEXTENT_INTEGRAL = DVEXTENT_CONTENT + 1
  } DVEXTENTMODE;

  typedef enum tagAspectInfoFlag {
    DVASPECTINFOFLAG_CANOPTIMIZE = 1
  } DVASPECTINFOFLAG;

  typedef struct tagAspectInfo {
    ULONG cb;
    DWORD dwFlags;
  } DVASPECTINFO;

  EXTERN_C const IID IID_IViewObjectEx;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IViewObjectEx : public IViewObject2 {
  public:
    virtual HRESULT WINAPI GetRect(DWORD dwAspect,LPRECTL pRect) = 0;
    virtual HRESULT WINAPI GetViewStatus(DWORD *pdwStatus) = 0;
    virtual HRESULT WINAPI QueryHitPoint(DWORD dwAspect,LPCRECT pRectBounds,POINT ptlLoc,LONG lCloseHint,DWORD *pHitResult) = 0;
    virtual HRESULT WINAPI QueryHitRect(DWORD dwAspect,LPCRECT pRectBounds,LPCRECT pRectLoc,LONG lCloseHint,DWORD *pHitResult) = 0;
    virtual HRESULT WINAPI GetNaturalExtent(DWORD dwAspect,LONG lindex,DVTARGETDEVICE *ptd,HDC hicTargetDev,DVEXTENTINFO *pExtentInfo,LPSIZEL pSizel) = 0;
  };
#else
  typedef struct IViewObjectExVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IViewObjectEx *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IViewObjectEx *This);
      ULONG (WINAPI *Release)(IViewObjectEx *This);
      HRESULT (WINAPI *Draw)(IViewObjectEx *This,DWORD dwDrawAspect,LONG lindex,void *pvAspect,DVTARGETDEVICE *ptd,HDC hdcTargetDev,HDC hdcDraw,LPCRECTL lprcBounds,LPCRECTL lprcWBounds,WINBOOL (WINAPI *pfnContinue)(ULONG_PTR dwContinue),ULONG_PTR dwContinue);
      HRESULT (WINAPI *GetColorSet)(IViewObjectEx *This,DWORD dwDrawAspect,LONG lindex,void *pvAspect,DVTARGETDEVICE *ptd,HDC hicTargetDev,LOGPALETTE **ppColorSet);
      HRESULT (WINAPI *Freeze)(IViewObjectEx *This,DWORD dwDrawAspect,LONG lindex,void *pvAspect,DWORD *pdwFreeze);
      HRESULT (WINAPI *Unfreeze)(IViewObjectEx *This,DWORD dwFreeze);
      HRESULT (WINAPI *SetAdvise)(IViewObjectEx *This,DWORD aspects,DWORD advf,IAdviseSink *pAdvSink);
      HRESULT (WINAPI *GetAdvise)(IViewObjectEx *This,DWORD *pAspects,DWORD *pAdvf,IAdviseSink **ppAdvSink);
      HRESULT (WINAPI *GetExtent)(IViewObjectEx *This,DWORD dwDrawAspect,LONG lindex,DVTARGETDEVICE *ptd,LPSIZEL lpsizel);
      HRESULT (WINAPI *GetRect)(IViewObjectEx *This,DWORD dwAspect,LPRECTL pRect);
      HRESULT (WINAPI *GetViewStatus)(IViewObjectEx *This,DWORD *pdwStatus);
      HRESULT (WINAPI *QueryHitPoint)(IViewObjectEx *This,DWORD dwAspect,LPCRECT pRectBounds,POINT ptlLoc,LONG lCloseHint,DWORD *pHitResult);
      HRESULT (WINAPI *QueryHitRect)(IViewObjectEx *This,DWORD dwAspect,LPCRECT pRectBounds,LPCRECT pRectLoc,LONG lCloseHint,DWORD *pHitResult);
      HRESULT (WINAPI *GetNaturalExtent)(IViewObjectEx *This,DWORD dwAspect,LONG lindex,DVTARGETDEVICE *ptd,HDC hicTargetDev,DVEXTENTINFO *pExtentInfo,LPSIZEL pSizel);
    END_INTERFACE
  } IViewObjectExVtbl;
  struct IViewObjectEx {
    CONST_VTBL struct IViewObjectExVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IViewObjectEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IViewObjectEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IViewObjectEx_Release(This) (This)->lpVtbl->Release(This)
#define IViewObjectEx_Draw(This,dwDrawAspect,lindex,pvAspect,ptd,hdcTargetDev,hdcDraw,lprcBounds,lprcWBounds,pfnContinue,dwContinue) (This)->lpVtbl->Draw(This,dwDrawAspect,lindex,pvAspect,ptd,hdcTargetDev,hdcDraw,lprcBounds,lprcWBounds,pfnContinue,dwContinue)
#define IViewObjectEx_GetColorSet(This,dwDrawAspect,lindex,pvAspect,ptd,hicTargetDev,ppColorSet) (This)->lpVtbl->GetColorSet(This,dwDrawAspect,lindex,pvAspect,ptd,hicTargetDev,ppColorSet)
#define IViewObjectEx_Freeze(This,dwDrawAspect,lindex,pvAspect,pdwFreeze) (This)->lpVtbl->Freeze(This,dwDrawAspect,lindex,pvAspect,pdwFreeze)
#define IViewObjectEx_Unfreeze(This,dwFreeze) (This)->lpVtbl->Unfreeze(This,dwFreeze)
#define IViewObjectEx_SetAdvise(This,aspects,advf,pAdvSink) (This)->lpVtbl->SetAdvise(This,aspects,advf,pAdvSink)
#define IViewObjectEx_GetAdvise(This,pAspects,pAdvf,ppAdvSink) (This)->lpVtbl->GetAdvise(This,pAspects,pAdvf,ppAdvSink)
#define IViewObjectEx_GetExtent(This,dwDrawAspect,lindex,ptd,lpsizel) (This)->lpVtbl->GetExtent(This,dwDrawAspect,lindex,ptd,lpsizel)
#define IViewObjectEx_GetRect(This,dwAspect,pRect) (This)->lpVtbl->GetRect(This,dwAspect,pRect)
#define IViewObjectEx_GetViewStatus(This,pdwStatus) (This)->lpVtbl->GetViewStatus(This,pdwStatus)
#define IViewObjectEx_QueryHitPoint(This,dwAspect,pRectBounds,ptlLoc,lCloseHint,pHitResult) (This)->lpVtbl->QueryHitPoint(This,dwAspect,pRectBounds,ptlLoc,lCloseHint,pHitResult)
#define IViewObjectEx_QueryHitRect(This,dwAspect,pRectBounds,pRectLoc,lCloseHint,pHitResult) (This)->lpVtbl->QueryHitRect(This,dwAspect,pRectBounds,pRectLoc,lCloseHint,pHitResult)
#define IViewObjectEx_GetNaturalExtent(This,dwAspect,lindex,ptd,hicTargetDev,pExtentInfo,pSizel) (This)->lpVtbl->GetNaturalExtent(This,dwAspect,lindex,ptd,hicTargetDev,pExtentInfo,pSizel)
#endif
#endif
  HRESULT WINAPI IViewObjectEx_GetRect_Proxy(IViewObjectEx *This,DWORD dwAspect,LPRECTL pRect);
  void __RPC_STUB IViewObjectEx_GetRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IViewObjectEx_GetViewStatus_Proxy(IViewObjectEx *This,DWORD *pdwStatus);
  void __RPC_STUB IViewObjectEx_GetViewStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IViewObjectEx_QueryHitPoint_Proxy(IViewObjectEx *This,DWORD dwAspect,LPCRECT pRectBounds,POINT ptlLoc,LONG lCloseHint,DWORD *pHitResult);
  void __RPC_STUB IViewObjectEx_QueryHitPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IViewObjectEx_QueryHitRect_Proxy(IViewObjectEx *This,DWORD dwAspect,LPCRECT pRectBounds,LPCRECT pRectLoc,LONG lCloseHint,DWORD *pHitResult);
  void __RPC_STUB IViewObjectEx_QueryHitRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IViewObjectEx_GetNaturalExtent_Proxy(IViewObjectEx *This,DWORD dwAspect,LONG lindex,DVTARGETDEVICE *ptd,HDC hicTargetDev,DVEXTENTINFO *pExtentInfo,LPSIZEL pSizel);
  void __RPC_STUB IViewObjectEx_GetNaturalExtent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleUndoUnit_INTERFACE_DEFINED__
#define __IOleUndoUnit_INTERFACE_DEFINED__
  typedef IOleUndoUnit *LPOLEUNDOUNIT;

  EXTERN_C const IID IID_IOleUndoUnit;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleUndoUnit : public IUnknown {
  public:
    virtual HRESULT WINAPI Do(IOleUndoManager *pUndoManager) = 0;
    virtual HRESULT WINAPI GetDescription(BSTR *pBstr) = 0;
    virtual HRESULT WINAPI GetUnitType(CLSID *pClsid,LONG *plID) = 0;
    virtual HRESULT WINAPI OnNextAdd(void) = 0;
  };
#else
  typedef struct IOleUndoUnitVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleUndoUnit *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleUndoUnit *This);
      ULONG (WINAPI *Release)(IOleUndoUnit *This);
      HRESULT (WINAPI *Do)(IOleUndoUnit *This,IOleUndoManager *pUndoManager);
      HRESULT (WINAPI *GetDescription)(IOleUndoUnit *This,BSTR *pBstr);
      HRESULT (WINAPI *GetUnitType)(IOleUndoUnit *This,CLSID *pClsid,LONG *plID);
      HRESULT (WINAPI *OnNextAdd)(IOleUndoUnit *This);
    END_INTERFACE
  } IOleUndoUnitVtbl;
  struct IOleUndoUnit {
    CONST_VTBL struct IOleUndoUnitVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleUndoUnit_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleUndoUnit_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleUndoUnit_Release(This) (This)->lpVtbl->Release(This)
#define IOleUndoUnit_Do(This,pUndoManager) (This)->lpVtbl->Do(This,pUndoManager)
#define IOleUndoUnit_GetDescription(This,pBstr) (This)->lpVtbl->GetDescription(This,pBstr)
#define IOleUndoUnit_GetUnitType(This,pClsid,plID) (This)->lpVtbl->GetUnitType(This,pClsid,plID)
#define IOleUndoUnit_OnNextAdd(This) (This)->lpVtbl->OnNextAdd(This)
#endif
#endif
  HRESULT WINAPI IOleUndoUnit_Do_Proxy(IOleUndoUnit *This,IOleUndoManager *pUndoManager);
  void __RPC_STUB IOleUndoUnit_Do_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoUnit_GetDescription_Proxy(IOleUndoUnit *This,BSTR *pBstr);
  void __RPC_STUB IOleUndoUnit_GetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoUnit_GetUnitType_Proxy(IOleUndoUnit *This,CLSID *pClsid,LONG *plID);
  void __RPC_STUB IOleUndoUnit_GetUnitType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoUnit_OnNextAdd_Proxy(IOleUndoUnit *This);
  void __RPC_STUB IOleUndoUnit_OnNextAdd_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleParentUndoUnit_INTERFACE_DEFINED__
#define __IOleParentUndoUnit_INTERFACE_DEFINED__
  typedef IOleParentUndoUnit *LPOLEPARENTUNDOUNIT;

  EXTERN_C const IID IID_IOleParentUndoUnit;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleParentUndoUnit : public IOleUndoUnit {
  public:
    virtual HRESULT WINAPI Open(IOleParentUndoUnit *pPUU) = 0;
    virtual HRESULT WINAPI Close(IOleParentUndoUnit *pPUU,WINBOOL fCommit) = 0;
    virtual HRESULT WINAPI Add(IOleUndoUnit *pUU) = 0;
    virtual HRESULT WINAPI FindUnit(IOleUndoUnit *pUU) = 0;
    virtual HRESULT WINAPI GetParentState(DWORD *pdwState) = 0;
  };
#else
  typedef struct IOleParentUndoUnitVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleParentUndoUnit *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleParentUndoUnit *This);
      ULONG (WINAPI *Release)(IOleParentUndoUnit *This);
      HRESULT (WINAPI *Do)(IOleParentUndoUnit *This,IOleUndoManager *pUndoManager);
      HRESULT (WINAPI *GetDescription)(IOleParentUndoUnit *This,BSTR *pBstr);
      HRESULT (WINAPI *GetUnitType)(IOleParentUndoUnit *This,CLSID *pClsid,LONG *plID);
      HRESULT (WINAPI *OnNextAdd)(IOleParentUndoUnit *This);
      HRESULT (WINAPI *Open)(IOleParentUndoUnit *This,IOleParentUndoUnit *pPUU);
      HRESULT (WINAPI *Close)(IOleParentUndoUnit *This,IOleParentUndoUnit *pPUU,WINBOOL fCommit);
      HRESULT (WINAPI *Add)(IOleParentUndoUnit *This,IOleUndoUnit *pUU);
      HRESULT (WINAPI *FindUnit)(IOleParentUndoUnit *This,IOleUndoUnit *pUU);
      HRESULT (WINAPI *GetParentState)(IOleParentUndoUnit *This,DWORD *pdwState);
    END_INTERFACE
  } IOleParentUndoUnitVtbl;
  struct IOleParentUndoUnit {
    CONST_VTBL struct IOleParentUndoUnitVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleParentUndoUnit_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleParentUndoUnit_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleParentUndoUnit_Release(This) (This)->lpVtbl->Release(This)
#define IOleParentUndoUnit_Do(This,pUndoManager) (This)->lpVtbl->Do(This,pUndoManager)
#define IOleParentUndoUnit_GetDescription(This,pBstr) (This)->lpVtbl->GetDescription(This,pBstr)
#define IOleParentUndoUnit_GetUnitType(This,pClsid,plID) (This)->lpVtbl->GetUnitType(This,pClsid,plID)
#define IOleParentUndoUnit_OnNextAdd(This) (This)->lpVtbl->OnNextAdd(This)
#define IOleParentUndoUnit_Open(This,pPUU) (This)->lpVtbl->Open(This,pPUU)
#define IOleParentUndoUnit_Close(This,pPUU,fCommit) (This)->lpVtbl->Close(This,pPUU,fCommit)
#define IOleParentUndoUnit_Add(This,pUU) (This)->lpVtbl->Add(This,pUU)
#define IOleParentUndoUnit_FindUnit(This,pUU) (This)->lpVtbl->FindUnit(This,pUU)
#define IOleParentUndoUnit_GetParentState(This,pdwState) (This)->lpVtbl->GetParentState(This,pdwState)
#endif
#endif
  HRESULT WINAPI IOleParentUndoUnit_Open_Proxy(IOleParentUndoUnit *This,IOleParentUndoUnit *pPUU);
  void __RPC_STUB IOleParentUndoUnit_Open_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleParentUndoUnit_Close_Proxy(IOleParentUndoUnit *This,IOleParentUndoUnit *pPUU,WINBOOL fCommit);
  void __RPC_STUB IOleParentUndoUnit_Close_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleParentUndoUnit_Add_Proxy(IOleParentUndoUnit *This,IOleUndoUnit *pUU);
  void __RPC_STUB IOleParentUndoUnit_Add_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleParentUndoUnit_FindUnit_Proxy(IOleParentUndoUnit *This,IOleUndoUnit *pUU);
  void __RPC_STUB IOleParentUndoUnit_FindUnit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleParentUndoUnit_GetParentState_Proxy(IOleParentUndoUnit *This,DWORD *pdwState);
  void __RPC_STUB IOleParentUndoUnit_GetParentState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumOleUndoUnits_INTERFACE_DEFINED__
#define __IEnumOleUndoUnits_INTERFACE_DEFINED__
  typedef IEnumOleUndoUnits *LPENUMOLEUNDOUNITS;

  EXTERN_C const IID IID_IEnumOleUndoUnits;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumOleUndoUnits : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(ULONG cElt,IOleUndoUnit **rgElt,ULONG *pcEltFetched) = 0;
    virtual HRESULT WINAPI Skip(ULONG cElt) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Clone(IEnumOleUndoUnits **ppEnum) = 0;
  };
#else
  typedef struct IEnumOleUndoUnitsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumOleUndoUnits *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumOleUndoUnits *This);
      ULONG (WINAPI *Release)(IEnumOleUndoUnits *This);
      HRESULT (WINAPI *Next)(IEnumOleUndoUnits *This,ULONG cElt,IOleUndoUnit **rgElt,ULONG *pcEltFetched);
      HRESULT (WINAPI *Skip)(IEnumOleUndoUnits *This,ULONG cElt);
      HRESULT (WINAPI *Reset)(IEnumOleUndoUnits *This);
      HRESULT (WINAPI *Clone)(IEnumOleUndoUnits *This,IEnumOleUndoUnits **ppEnum);
    END_INTERFACE
  } IEnumOleUndoUnitsVtbl;
  struct IEnumOleUndoUnits {
    CONST_VTBL struct IEnumOleUndoUnitsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumOleUndoUnits_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumOleUndoUnits_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumOleUndoUnits_Release(This) (This)->lpVtbl->Release(This)
#define IEnumOleUndoUnits_Next(This,cElt,rgElt,pcEltFetched) (This)->lpVtbl->Next(This,cElt,rgElt,pcEltFetched)
#define IEnumOleUndoUnits_Skip(This,cElt) (This)->lpVtbl->Skip(This,cElt)
#define IEnumOleUndoUnits_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumOleUndoUnits_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#endif
#endif
  HRESULT WINAPI IEnumOleUndoUnits_RemoteNext_Proxy(IEnumOleUndoUnits *This,ULONG cElt,IOleUndoUnit **rgElt,ULONG *pcEltFetched);
  void __RPC_STUB IEnumOleUndoUnits_RemoteNext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumOleUndoUnits_Skip_Proxy(IEnumOleUndoUnits *This,ULONG cElt);
  void __RPC_STUB IEnumOleUndoUnits_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumOleUndoUnits_Reset_Proxy(IEnumOleUndoUnits *This);
  void __RPC_STUB IEnumOleUndoUnits_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumOleUndoUnits_Clone_Proxy(IEnumOleUndoUnits *This,IEnumOleUndoUnits **ppEnum);
  void __RPC_STUB IEnumOleUndoUnits_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleUndoManager_INTERFACE_DEFINED__
#define __IOleUndoManager_INTERFACE_DEFINED__
#define SID_SOleUndoManager IID_IOleUndoManager
  typedef IOleUndoManager *LPOLEUNDOMANAGER;

  EXTERN_C const IID IID_IOleUndoManager;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleUndoManager : public IUnknown {
  public:
    virtual HRESULT WINAPI Open(IOleParentUndoUnit *pPUU) = 0;
    virtual HRESULT WINAPI Close(IOleParentUndoUnit *pPUU,WINBOOL fCommit) = 0;
    virtual HRESULT WINAPI Add(IOleUndoUnit *pUU) = 0;
    virtual HRESULT WINAPI GetOpenParentState(DWORD *pdwState) = 0;
    virtual HRESULT WINAPI DiscardFrom(IOleUndoUnit *pUU) = 0;
    virtual HRESULT WINAPI UndoTo(IOleUndoUnit *pUU) = 0;
    virtual HRESULT WINAPI RedoTo(IOleUndoUnit *pUU) = 0;
    virtual HRESULT WINAPI EnumUndoable(IEnumOleUndoUnits **ppEnum) = 0;
    virtual HRESULT WINAPI EnumRedoable(IEnumOleUndoUnits **ppEnum) = 0;
    virtual HRESULT WINAPI GetLastUndoDescription(BSTR *pBstr) = 0;
    virtual HRESULT WINAPI GetLastRedoDescription(BSTR *pBstr) = 0;
    virtual HRESULT WINAPI Enable(WINBOOL fEnable) = 0;
  };
#else
  typedef struct IOleUndoManagerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleUndoManager *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleUndoManager *This);
      ULONG (WINAPI *Release)(IOleUndoManager *This);
      HRESULT (WINAPI *Open)(IOleUndoManager *This,IOleParentUndoUnit *pPUU);
      HRESULT (WINAPI *Close)(IOleUndoManager *This,IOleParentUndoUnit *pPUU,WINBOOL fCommit);
      HRESULT (WINAPI *Add)(IOleUndoManager *This,IOleUndoUnit *pUU);
      HRESULT (WINAPI *GetOpenParentState)(IOleUndoManager *This,DWORD *pdwState);
      HRESULT (WINAPI *DiscardFrom)(IOleUndoManager *This,IOleUndoUnit *pUU);
      HRESULT (WINAPI *UndoTo)(IOleUndoManager *This,IOleUndoUnit *pUU);
      HRESULT (WINAPI *RedoTo)(IOleUndoManager *This,IOleUndoUnit *pUU);
      HRESULT (WINAPI *EnumUndoable)(IOleUndoManager *This,IEnumOleUndoUnits **ppEnum);
      HRESULT (WINAPI *EnumRedoable)(IOleUndoManager *This,IEnumOleUndoUnits **ppEnum);
      HRESULT (WINAPI *GetLastUndoDescription)(IOleUndoManager *This,BSTR *pBstr);
      HRESULT (WINAPI *GetLastRedoDescription)(IOleUndoManager *This,BSTR *pBstr);
      HRESULT (WINAPI *Enable)(IOleUndoManager *This,WINBOOL fEnable);
    END_INTERFACE
  } IOleUndoManagerVtbl;
  struct IOleUndoManager {
    CONST_VTBL struct IOleUndoManagerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleUndoManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleUndoManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleUndoManager_Release(This) (This)->lpVtbl->Release(This)
#define IOleUndoManager_Open(This,pPUU) (This)->lpVtbl->Open(This,pPUU)
#define IOleUndoManager_Close(This,pPUU,fCommit) (This)->lpVtbl->Close(This,pPUU,fCommit)
#define IOleUndoManager_Add(This,pUU) (This)->lpVtbl->Add(This,pUU)
#define IOleUndoManager_GetOpenParentState(This,pdwState) (This)->lpVtbl->GetOpenParentState(This,pdwState)
#define IOleUndoManager_DiscardFrom(This,pUU) (This)->lpVtbl->DiscardFrom(This,pUU)
#define IOleUndoManager_UndoTo(This,pUU) (This)->lpVtbl->UndoTo(This,pUU)
#define IOleUndoManager_RedoTo(This,pUU) (This)->lpVtbl->RedoTo(This,pUU)
#define IOleUndoManager_EnumUndoable(This,ppEnum) (This)->lpVtbl->EnumUndoable(This,ppEnum)
#define IOleUndoManager_EnumRedoable(This,ppEnum) (This)->lpVtbl->EnumRedoable(This,ppEnum)
#define IOleUndoManager_GetLastUndoDescription(This,pBstr) (This)->lpVtbl->GetLastUndoDescription(This,pBstr)
#define IOleUndoManager_GetLastRedoDescription(This,pBstr) (This)->lpVtbl->GetLastRedoDescription(This,pBstr)
#define IOleUndoManager_Enable(This,fEnable) (This)->lpVtbl->Enable(This,fEnable)
#endif
#endif
  HRESULT WINAPI IOleUndoManager_Open_Proxy(IOleUndoManager *This,IOleParentUndoUnit *pPUU);
  void __RPC_STUB IOleUndoManager_Open_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_Close_Proxy(IOleUndoManager *This,IOleParentUndoUnit *pPUU,WINBOOL fCommit);
  void __RPC_STUB IOleUndoManager_Close_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_Add_Proxy(IOleUndoManager *This,IOleUndoUnit *pUU);
  void __RPC_STUB IOleUndoManager_Add_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_GetOpenParentState_Proxy(IOleUndoManager *This,DWORD *pdwState);
  void __RPC_STUB IOleUndoManager_GetOpenParentState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_DiscardFrom_Proxy(IOleUndoManager *This,IOleUndoUnit *pUU);
  void __RPC_STUB IOleUndoManager_DiscardFrom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_UndoTo_Proxy(IOleUndoManager *This,IOleUndoUnit *pUU);
  void __RPC_STUB IOleUndoManager_UndoTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_RedoTo_Proxy(IOleUndoManager *This,IOleUndoUnit *pUU);
  void __RPC_STUB IOleUndoManager_RedoTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_EnumUndoable_Proxy(IOleUndoManager *This,IEnumOleUndoUnits **ppEnum);
  void __RPC_STUB IOleUndoManager_EnumUndoable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_EnumRedoable_Proxy(IOleUndoManager *This,IEnumOleUndoUnits **ppEnum);
  void __RPC_STUB IOleUndoManager_EnumRedoable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_GetLastUndoDescription_Proxy(IOleUndoManager *This,BSTR *pBstr);
  void __RPC_STUB IOleUndoManager_GetLastUndoDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_GetLastRedoDescription_Proxy(IOleUndoManager *This,BSTR *pBstr);
  void __RPC_STUB IOleUndoManager_GetLastRedoDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleUndoManager_Enable_Proxy(IOleUndoManager *This,WINBOOL fEnable);
  void __RPC_STUB IOleUndoManager_Enable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPointerInactive_INTERFACE_DEFINED__
#define __IPointerInactive_INTERFACE_DEFINED__
  typedef IPointerInactive *LPPOINTERINACTIVE;

  typedef enum tagPOINTERINACTIVE {
    POINTERINACTIVE_ACTIVATEONENTRY = 1,POINTERINACTIVE_DEACTIVATEONLEAVE = 2,POINTERINACTIVE_ACTIVATEONDRAG = 4
  } POINTERINACTIVE;

  EXTERN_C const IID IID_IPointerInactive;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPointerInactive : public IUnknown {
  public:
    virtual HRESULT WINAPI GetActivationPolicy(DWORD *pdwPolicy) = 0;
    virtual HRESULT WINAPI OnInactiveMouseMove(LPCRECT pRectBounds,LONG x,LONG y,DWORD grfKeyState) = 0;
    virtual HRESULT WINAPI OnInactiveSetCursor(LPCRECT pRectBounds,LONG x,LONG y,DWORD dwMouseMsg,WINBOOL fSetAlways) = 0;
  };
#else
  typedef struct IPointerInactiveVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPointerInactive *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPointerInactive *This);
      ULONG (WINAPI *Release)(IPointerInactive *This);
      HRESULT (WINAPI *GetActivationPolicy)(IPointerInactive *This,DWORD *pdwPolicy);
      HRESULT (WINAPI *OnInactiveMouseMove)(IPointerInactive *This,LPCRECT pRectBounds,LONG x,LONG y,DWORD grfKeyState);
      HRESULT (WINAPI *OnInactiveSetCursor)(IPointerInactive *This,LPCRECT pRectBounds,LONG x,LONG y,DWORD dwMouseMsg,WINBOOL fSetAlways);
    END_INTERFACE
  } IPointerInactiveVtbl;
  struct IPointerInactive {
    CONST_VTBL struct IPointerInactiveVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPointerInactive_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPointerInactive_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPointerInactive_Release(This) (This)->lpVtbl->Release(This)
#define IPointerInactive_GetActivationPolicy(This,pdwPolicy) (This)->lpVtbl->GetActivationPolicy(This,pdwPolicy)
#define IPointerInactive_OnInactiveMouseMove(This,pRectBounds,x,y,grfKeyState) (This)->lpVtbl->OnInactiveMouseMove(This,pRectBounds,x,y,grfKeyState)
#define IPointerInactive_OnInactiveSetCursor(This,pRectBounds,x,y,dwMouseMsg,fSetAlways) (This)->lpVtbl->OnInactiveSetCursor(This,pRectBounds,x,y,dwMouseMsg,fSetAlways)
#endif
#endif
  HRESULT WINAPI IPointerInactive_GetActivationPolicy_Proxy(IPointerInactive *This,DWORD *pdwPolicy);
  void __RPC_STUB IPointerInactive_GetActivationPolicy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPointerInactive_OnInactiveMouseMove_Proxy(IPointerInactive *This,LPCRECT pRectBounds,LONG x,LONG y,DWORD grfKeyState);
  void __RPC_STUB IPointerInactive_OnInactiveMouseMove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPointerInactive_OnInactiveSetCursor_Proxy(IPointerInactive *This,LPCRECT pRectBounds,LONG x,LONG y,DWORD dwMouseMsg,WINBOOL fSetAlways);
  void __RPC_STUB IPointerInactive_OnInactiveSetCursor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IObjectWithSite_INTERFACE_DEFINED__
#define __IObjectWithSite_INTERFACE_DEFINED__
  typedef IObjectWithSite *LPOBJECTWITHSITE;

  EXTERN_C const IID IID_IObjectWithSite;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjectWithSite : public IUnknown {
  public:
    virtual HRESULT WINAPI SetSite(IUnknown *pUnkSite) = 0;
    virtual HRESULT WINAPI GetSite(REFIID riid,void **ppvSite) = 0;
  };
#else
  typedef struct IObjectWithSiteVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjectWithSite *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjectWithSite *This);
      ULONG (WINAPI *Release)(IObjectWithSite *This);
      HRESULT (WINAPI *SetSite)(IObjectWithSite *This,IUnknown *pUnkSite);
      HRESULT (WINAPI *GetSite)(IObjectWithSite *This,REFIID riid,void **ppvSite);
    END_INTERFACE
  } IObjectWithSiteVtbl;
  struct IObjectWithSite {
    CONST_VTBL struct IObjectWithSiteVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjectWithSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectWithSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectWithSite_Release(This) (This)->lpVtbl->Release(This)
#define IObjectWithSite_SetSite(This,pUnkSite) (This)->lpVtbl->SetSite(This,pUnkSite)
#define IObjectWithSite_GetSite(This,riid,ppvSite) (This)->lpVtbl->GetSite(This,riid,ppvSite)
#endif
#endif
  HRESULT WINAPI IObjectWithSite_SetSite_Proxy(IObjectWithSite *This,IUnknown *pUnkSite);
  void __RPC_STUB IObjectWithSite_SetSite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectWithSite_GetSite_Proxy(IObjectWithSite *This,REFIID riid,void **ppvSite);
  void __RPC_STUB IObjectWithSite_GetSite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPerPropertyBrowsing_INTERFACE_DEFINED__
#define __IPerPropertyBrowsing_INTERFACE_DEFINED__
  typedef IPerPropertyBrowsing *LPPERPROPERTYBROWSING;

  typedef struct tagCALPOLESTR {
    ULONG cElems;
    LPOLESTR *pElems;
  } CALPOLESTR;

  typedef struct tagCALPOLESTR *LPCALPOLESTR;

  typedef struct tagCADWORD {
    ULONG cElems;
    DWORD *pElems;
  } CADWORD;

  typedef struct tagCADWORD *LPCADWORD;

  EXTERN_C const IID IID_IPerPropertyBrowsing;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPerPropertyBrowsing : public IUnknown {
  public:
    virtual HRESULT WINAPI GetDisplayString(DISPID dispID,BSTR *pBstr) = 0;
    virtual HRESULT WINAPI MapPropertyToPage(DISPID dispID,CLSID *pClsid) = 0;
    virtual HRESULT WINAPI GetPredefinedStrings(DISPID dispID,CALPOLESTR *pCaStringsOut,CADWORD *pCaCookiesOut) = 0;
    virtual HRESULT WINAPI GetPredefinedValue(DISPID dispID,DWORD dwCookie,VARIANT *pVarOut) = 0;
  };
#else
  typedef struct IPerPropertyBrowsingVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPerPropertyBrowsing *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPerPropertyBrowsing *This);
      ULONG (WINAPI *Release)(IPerPropertyBrowsing *This);
      HRESULT (WINAPI *GetDisplayString)(IPerPropertyBrowsing *This,DISPID dispID,BSTR *pBstr);
      HRESULT (WINAPI *MapPropertyToPage)(IPerPropertyBrowsing *This,DISPID dispID,CLSID *pClsid);
      HRESULT (WINAPI *GetPredefinedStrings)(IPerPropertyBrowsing *This,DISPID dispID,CALPOLESTR *pCaStringsOut,CADWORD *pCaCookiesOut);
      HRESULT (WINAPI *GetPredefinedValue)(IPerPropertyBrowsing *This,DISPID dispID,DWORD dwCookie,VARIANT *pVarOut);
    END_INTERFACE
  } IPerPropertyBrowsingVtbl;
  struct IPerPropertyBrowsing {
    CONST_VTBL struct IPerPropertyBrowsingVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPerPropertyBrowsing_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPerPropertyBrowsing_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPerPropertyBrowsing_Release(This) (This)->lpVtbl->Release(This)
#define IPerPropertyBrowsing_GetDisplayString(This,dispID,pBstr) (This)->lpVtbl->GetDisplayString(This,dispID,pBstr)
#define IPerPropertyBrowsing_MapPropertyToPage(This,dispID,pClsid) (This)->lpVtbl->MapPropertyToPage(This,dispID,pClsid)
#define IPerPropertyBrowsing_GetPredefinedStrings(This,dispID,pCaStringsOut,pCaCookiesOut) (This)->lpVtbl->GetPredefinedStrings(This,dispID,pCaStringsOut,pCaCookiesOut)
#define IPerPropertyBrowsing_GetPredefinedValue(This,dispID,dwCookie,pVarOut) (This)->lpVtbl->GetPredefinedValue(This,dispID,dwCookie,pVarOut)
#endif
#endif
  HRESULT WINAPI IPerPropertyBrowsing_GetDisplayString_Proxy(IPerPropertyBrowsing *This,DISPID dispID,BSTR *pBstr);
  void __RPC_STUB IPerPropertyBrowsing_GetDisplayString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPerPropertyBrowsing_MapPropertyToPage_Proxy(IPerPropertyBrowsing *This,DISPID dispID,CLSID *pClsid);
  void __RPC_STUB IPerPropertyBrowsing_MapPropertyToPage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPerPropertyBrowsing_GetPredefinedStrings_Proxy(IPerPropertyBrowsing *This,DISPID dispID,CALPOLESTR *pCaStringsOut,CADWORD *pCaCookiesOut);
  void __RPC_STUB IPerPropertyBrowsing_GetPredefinedStrings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPerPropertyBrowsing_GetPredefinedValue_Proxy(IPerPropertyBrowsing *This,DISPID dispID,DWORD dwCookie,VARIANT *pVarOut);
  void __RPC_STUB IPerPropertyBrowsing_GetPredefinedValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
/*****************************************************************************
 * IPropertyBag2 interface
 */
#ifndef __IPropertyBag2_INTERFACE_DEFINED__
#define __IPropertyBag2_INTERFACE_DEFINED__

typedef IPropertyBag2 *LPPROPERTYBAG2;
typedef enum tagPROPBAG2_TYPE {
    PROPBAG2_TYPE_UNDEFINED = 0,
    PROPBAG2_TYPE_DATA = 1,
    PROPBAG2_TYPE_URL = 2,
    PROPBAG2_TYPE_OBJECT = 3,
    PROPBAG2_TYPE_STREAM = 4,
    PROPBAG2_TYPE_STORAGE = 5,
    PROPBAG2_TYPE_MONIKER = 6
} PROPBAG2_TYPE;
typedef struct tagPROPBAG2 {
    DWORD dwType;
    VARTYPE vt;
    CLIPFORMAT cfType;
    DWORD dwHint;
    LPOLESTR pstrName;
    CLSID clsid;
} PROPBAG2;
DEFINE_GUID(IID_IPropertyBag2, 0x22f55882, 0x280b, 0x11d0, 0xa8,0xa9, 0x00,0xa0,0xc9,0x0c,0x20,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("22f55882-280b-11d0-a8a9-00a0c90c2004")
IPropertyBag2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Read(
        ULONG cProperties,
        PROPBAG2 *pPropBag,
        IErrorLog *pErrLog,
        VARIANT *pvarValue,
        HRESULT *phrError) = 0;

    virtual HRESULT STDMETHODCALLTYPE Write(
        ULONG cProperties,
        PROPBAG2 *pPropBag,
        VARIANT *pvarValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE CountProperties(
        ULONG *pcProperties) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyInfo(
        ULONG iProperty,
        ULONG cProperties,
        PROPBAG2 *pPropBag,
        ULONG *pcProperties) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadObject(
        LPCOLESTR pstrName,
        DWORD dwHint,
        IUnknown *pUnkObject,
        IErrorLog *pErrLog) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPropertyBag2, 0x22f55882, 0x280b, 0x11d0, 0xa8,0xa9, 0x00,0xa0,0xc9,0x0c,0x20,0x04)
#endif
#else
typedef struct IPropertyBag2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPropertyBag2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPropertyBag2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPropertyBag2* This);

    /*** IPropertyBag2 methods ***/
    HRESULT (STDMETHODCALLTYPE *Read)(
        IPropertyBag2* This,
        ULONG cProperties,
        PROPBAG2 *pPropBag,
        IErrorLog *pErrLog,
        VARIANT *pvarValue,
        HRESULT *phrError);

    HRESULT (STDMETHODCALLTYPE *Write)(
        IPropertyBag2* This,
        ULONG cProperties,
        PROPBAG2 *pPropBag,
        VARIANT *pvarValue);

    HRESULT (STDMETHODCALLTYPE *CountProperties)(
        IPropertyBag2* This,
        ULONG *pcProperties);

    HRESULT (STDMETHODCALLTYPE *GetPropertyInfo)(
        IPropertyBag2* This,
        ULONG iProperty,
        ULONG cProperties,
        PROPBAG2 *pPropBag,
        ULONG *pcProperties);

    HRESULT (STDMETHODCALLTYPE *LoadObject)(
        IPropertyBag2* This,
        LPCOLESTR pstrName,
        DWORD dwHint,
        IUnknown *pUnkObject,
        IErrorLog *pErrLog);

    END_INTERFACE
} IPropertyBag2Vtbl;
interface IPropertyBag2 {
    CONST_VTBL IPropertyBag2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPropertyBag2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPropertyBag2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPropertyBag2_Release(This) (This)->lpVtbl->Release(This)
/*** IPropertyBag2 methods ***/
#define IPropertyBag2_Read(This,cProperties,pPropBag,pErrLog,pvarValue,phrError) (This)->lpVtbl->Read(This,cProperties,pPropBag,pErrLog,pvarValue,phrError)
#define IPropertyBag2_Write(This,cProperties,pPropBag,pvarValue) (This)->lpVtbl->Write(This,cProperties,pPropBag,pvarValue)
#define IPropertyBag2_CountProperties(This,pcProperties) (This)->lpVtbl->CountProperties(This,pcProperties)
#define IPropertyBag2_GetPropertyInfo(This,iProperty,cProperties,pPropBag,pcProperties) (This)->lpVtbl->GetPropertyInfo(This,iProperty,cProperties,pPropBag,pcProperties)
#define IPropertyBag2_LoadObject(This,pstrName,dwHint,pUnkObject,pErrLog) (This)->lpVtbl->LoadObject(This,pstrName,dwHint,pUnkObject,pErrLog)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPropertyBag2_QueryInterface(IPropertyBag2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPropertyBag2_AddRef(IPropertyBag2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPropertyBag2_Release(IPropertyBag2* This) {
    return This->lpVtbl->Release(This);
}
/*** IPropertyBag2 methods ***/
static FORCEINLINE HRESULT IPropertyBag2_Read(IPropertyBag2* This,ULONG cProperties,PROPBAG2 *pPropBag,IErrorLog *pErrLog,VARIANT *pvarValue,HRESULT *phrError) {
    return This->lpVtbl->Read(This,cProperties,pPropBag,pErrLog,pvarValue,phrError);
}
static FORCEINLINE HRESULT IPropertyBag2_Write(IPropertyBag2* This,ULONG cProperties,PROPBAG2 *pPropBag,VARIANT *pvarValue) {
    return This->lpVtbl->Write(This,cProperties,pPropBag,pvarValue);
}
static FORCEINLINE HRESULT IPropertyBag2_CountProperties(IPropertyBag2* This,ULONG *pcProperties) {
    return This->lpVtbl->CountProperties(This,pcProperties);
}
static FORCEINLINE HRESULT IPropertyBag2_GetPropertyInfo(IPropertyBag2* This,ULONG iProperty,ULONG cProperties,PROPBAG2 *pPropBag,ULONG *pcProperties) {
    return This->lpVtbl->GetPropertyInfo(This,iProperty,cProperties,pPropBag,pcProperties);
}
static FORCEINLINE HRESULT IPropertyBag2_LoadObject(IPropertyBag2* This,LPCOLESTR pstrName,DWORD dwHint,IUnknown *pUnkObject,IErrorLog *pErrLog) {
    return This->lpVtbl->LoadObject(This,pstrName,dwHint,pUnkObject,pErrLog);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IPropertyBag2_Read_Proxy(
    IPropertyBag2* This,
    ULONG cProperties,
    PROPBAG2 *pPropBag,
    IErrorLog *pErrLog,
    VARIANT *pvarValue,
    HRESULT *phrError);
void __RPC_STUB IPropertyBag2_Read_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPropertyBag2_Write_Proxy(
    IPropertyBag2* This,
    ULONG cProperties,
    PROPBAG2 *pPropBag,
    VARIANT *pvarValue);
void __RPC_STUB IPropertyBag2_Write_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPropertyBag2_CountProperties_Proxy(
    IPropertyBag2* This,
    ULONG *pcProperties);
void __RPC_STUB IPropertyBag2_CountProperties_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPropertyBag2_GetPropertyInfo_Proxy(
    IPropertyBag2* This,
    ULONG iProperty,
    ULONG cProperties,
    PROPBAG2 *pPropBag,
    ULONG *pcProperties);
void __RPC_STUB IPropertyBag2_GetPropertyInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPropertyBag2_LoadObject_Proxy(
    IPropertyBag2* This,
    LPCOLESTR pstrName,
    DWORD dwHint,
    IUnknown *pUnkObject,
    IErrorLog *pErrLog);
void __RPC_STUB IPropertyBag2_LoadObject_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IPropertyBag2_INTERFACE_DEFINED__ */

#ifndef __IPersistPropertyBag2_INTERFACE_DEFINED__
#define __IPersistPropertyBag2_INTERFACE_DEFINED__
  typedef IPersistPropertyBag2 *LPPERSISTPROPERTYBAG2;

  EXTERN_C const IID IID_IPersistPropertyBag2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPersistPropertyBag2 : public IPersist {
  public:
    virtual HRESULT WINAPI InitNew(void) = 0;
    virtual HRESULT WINAPI Load(IPropertyBag2 *pPropBag,IErrorLog *pErrLog) = 0;
    virtual HRESULT WINAPI Save(IPropertyBag2 *pPropBag,WINBOOL fClearDirty,WINBOOL fSaveAllProperties) = 0;
    virtual HRESULT WINAPI IsDirty(void) = 0;
  };
#else
  typedef struct IPersistPropertyBag2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPersistPropertyBag2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPersistPropertyBag2 *This);
      ULONG (WINAPI *Release)(IPersistPropertyBag2 *This);
      HRESULT (WINAPI *GetClassID)(IPersistPropertyBag2 *This,CLSID *pClassID);
      HRESULT (WINAPI *InitNew)(IPersistPropertyBag2 *This);
      HRESULT (WINAPI *Load)(IPersistPropertyBag2 *This,IPropertyBag2 *pPropBag,IErrorLog *pErrLog);
      HRESULT (WINAPI *Save)(IPersistPropertyBag2 *This,IPropertyBag2 *pPropBag,WINBOOL fClearDirty,WINBOOL fSaveAllProperties);
      HRESULT (WINAPI *IsDirty)(IPersistPropertyBag2 *This);
    END_INTERFACE
  } IPersistPropertyBag2Vtbl;
  struct IPersistPropertyBag2 {
    CONST_VTBL struct IPersistPropertyBag2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPersistPropertyBag2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistPropertyBag2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistPropertyBag2_Release(This) (This)->lpVtbl->Release(This)
#define IPersistPropertyBag2_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
#define IPersistPropertyBag2_InitNew(This) (This)->lpVtbl->InitNew(This)
#define IPersistPropertyBag2_Load(This,pPropBag,pErrLog) (This)->lpVtbl->Load(This,pPropBag,pErrLog)
#define IPersistPropertyBag2_Save(This,pPropBag,fClearDirty,fSaveAllProperties) (This)->lpVtbl->Save(This,pPropBag,fClearDirty,fSaveAllProperties)
#define IPersistPropertyBag2_IsDirty(This) (This)->lpVtbl->IsDirty(This)
#endif
#endif
  HRESULT WINAPI IPersistPropertyBag2_InitNew_Proxy(IPersistPropertyBag2 *This);
  void __RPC_STUB IPersistPropertyBag2_InitNew_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistPropertyBag2_Load_Proxy(IPersistPropertyBag2 *This,IPropertyBag2 *pPropBag,IErrorLog *pErrLog);
  void __RPC_STUB IPersistPropertyBag2_Load_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistPropertyBag2_Save_Proxy(IPersistPropertyBag2 *This,IPropertyBag2 *pPropBag,WINBOOL fClearDirty,WINBOOL fSaveAllProperties);
  void __RPC_STUB IPersistPropertyBag2_Save_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPersistPropertyBag2_IsDirty_Proxy(IPersistPropertyBag2 *This);
  void __RPC_STUB IPersistPropertyBag2_IsDirty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IAdviseSinkEx_INTERFACE_DEFINED__
#define __IAdviseSinkEx_INTERFACE_DEFINED__
  typedef IAdviseSinkEx *LPADVISESINKEX;

  EXTERN_C const IID IID_IAdviseSinkEx;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IAdviseSinkEx : public IAdviseSink {
  public:
    virtual void WINAPI OnViewStatusChange(DWORD dwViewStatus) = 0;
  };
#else
  typedef struct IAdviseSinkExVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IAdviseSinkEx *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IAdviseSinkEx *This);
      ULONG (WINAPI *Release)(IAdviseSinkEx *This);
      void (WINAPI *OnDataChange)(IAdviseSinkEx *This,FORMATETC *pFormatetc,STGMEDIUM *pStgmed);
      void (WINAPI *OnViewChange)(IAdviseSinkEx *This,DWORD dwAspect,LONG lindex);
      void (WINAPI *OnRename)(IAdviseSinkEx *This,IMoniker *pmk);
      void (WINAPI *OnSave)(IAdviseSinkEx *This);
      void (WINAPI *OnClose)(IAdviseSinkEx *This);
      void (WINAPI *OnViewStatusChange)(IAdviseSinkEx *This,DWORD dwViewStatus);
    END_INTERFACE
  } IAdviseSinkExVtbl;
  struct IAdviseSinkEx {
    CONST_VTBL struct IAdviseSinkExVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IAdviseSinkEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAdviseSinkEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAdviseSinkEx_Release(This) (This)->lpVtbl->Release(This)
#define IAdviseSinkEx_OnDataChange(This,pFormatetc,pStgmed) (This)->lpVtbl->OnDataChange(This,pFormatetc,pStgmed)
#define IAdviseSinkEx_OnViewChange(This,dwAspect,lindex) (This)->lpVtbl->OnViewChange(This,dwAspect,lindex)
#define IAdviseSinkEx_OnRename(This,pmk) (This)->lpVtbl->OnRename(This,pmk)
#define IAdviseSinkEx_OnSave(This) (This)->lpVtbl->OnSave(This)
#define IAdviseSinkEx_OnClose(This) (This)->lpVtbl->OnClose(This)
#define IAdviseSinkEx_OnViewStatusChange(This,dwViewStatus) (This)->lpVtbl->OnViewStatusChange(This,dwViewStatus)
#endif
#endif
  HRESULT WINAPI IAdviseSinkEx_RemoteOnViewStatusChange_Proxy(IAdviseSinkEx *This,DWORD dwViewStatus);
  void __RPC_STUB IAdviseSinkEx_RemoteOnViewStatusChange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IQuickActivate_INTERFACE_DEFINED__
#define __IQuickActivate_INTERFACE_DEFINED__
  typedef IQuickActivate *LPQUICKACTIVATE;

  typedef enum tagQACONTAINERFLAGS {
    QACONTAINER_SHOWHATCHING = 0x1,QACONTAINER_SHOWGRABHANDLES = 0x2,QACONTAINER_USERMODE = 0x4,QACONTAINER_DISPLAYASDEFAULT = 0x8,
    QACONTAINER_UIDEAD = 0x10,QACONTAINER_AUTOCLIP = 0x20,QACONTAINER_MESSAGEREFLECT = 0x40,QACONTAINER_SUPPORTSMNEMONICS = 0x80
  } QACONTAINERFLAGS;

  typedef DWORD OLE_COLOR;

  typedef struct tagQACONTAINER {
    ULONG cbSize;
    IOleClientSite *pClientSite;
    IAdviseSinkEx *pAdviseSink;
    IPropertyNotifySink *pPropertyNotifySink;
    IUnknown *pUnkEventSink;
    DWORD dwAmbientFlags;
    OLE_COLOR colorFore;
    OLE_COLOR colorBack;
    IFont *pFont;
    IOleUndoManager *pUndoMgr;
    DWORD dwAppearance;
    LONG lcid;
    HPALETTE hpal;
    IBindHost *pBindHost;
    IOleControlSite *pOleControlSite;
    IServiceProvider *pServiceProvider;
  } QACONTAINER;

  typedef struct tagQACONTROL {
    ULONG cbSize;
    DWORD dwMiscStatus;
    DWORD dwViewStatus;
    DWORD dwEventCookie;
    DWORD dwPropNotifyCookie;
    DWORD dwPointerActivationPolicy;
  } QACONTROL;

  EXTERN_C const IID IID_IQuickActivate;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IQuickActivate : public IUnknown {
  public:
    virtual HRESULT WINAPI QuickActivate(QACONTAINER *pQaContainer,QACONTROL *pQaControl) = 0;
    virtual HRESULT WINAPI SetContentExtent(LPSIZEL pSizel) = 0;
    virtual HRESULT WINAPI GetContentExtent(LPSIZEL pSizel) = 0;
  };
#else
  typedef struct IQuickActivateVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IQuickActivate *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IQuickActivate *This);
      ULONG (WINAPI *Release)(IQuickActivate *This);
      HRESULT (WINAPI *QuickActivate)(IQuickActivate *This,QACONTAINER *pQaContainer,QACONTROL *pQaControl);
      HRESULT (WINAPI *SetContentExtent)(IQuickActivate *This,LPSIZEL pSizel);
      HRESULT (WINAPI *GetContentExtent)(IQuickActivate *This,LPSIZEL pSizel);
    END_INTERFACE
  } IQuickActivateVtbl;
  struct IQuickActivate {
    CONST_VTBL struct IQuickActivateVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IQuickActivate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IQuickActivate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IQuickActivate_Release(This) (This)->lpVtbl->Release(This)
#define IQuickActivate_QuickActivate(This,pQaContainer,pQaControl) (This)->lpVtbl->QuickActivate(This,pQaContainer,pQaControl)
#define IQuickActivate_SetContentExtent(This,pSizel) (This)->lpVtbl->SetContentExtent(This,pSizel)
#define IQuickActivate_GetContentExtent(This,pSizel) (This)->lpVtbl->GetContentExtent(This,pSizel)
#endif
#endif
  HRESULT WINAPI IQuickActivate_RemoteQuickActivate_Proxy(IQuickActivate *This,QACONTAINER *pQaContainer,QACONTROL *pQaControl);
  void __RPC_STUB IQuickActivate_RemoteQuickActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IQuickActivate_SetContentExtent_Proxy(IQuickActivate *This,LPSIZEL pSizel);
  void __RPC_STUB IQuickActivate_SetContentExtent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IQuickActivate_GetContentExtent_Proxy(IQuickActivate *This,LPSIZEL pSizel);
  void __RPC_STUB IQuickActivate_GetContentExtent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  ULONG __RPC_API BSTR_UserSize(ULONG *,ULONG,BSTR *);
  unsigned char *__RPC_API BSTR_UserMarshal(ULONG *,unsigned char *,BSTR *);
  unsigned char *__RPC_API BSTR_UserUnmarshal(ULONG *,unsigned char *,BSTR *);
  void __RPC_API BSTR_UserFree(ULONG *,BSTR *);
  ULONG __RPC_API HACCEL_UserSize(ULONG *,ULONG,HACCEL *);
  unsigned char *__RPC_API HACCEL_UserMarshal(ULONG *,unsigned char *,HACCEL *);
  unsigned char *__RPC_API HACCEL_UserUnmarshal(ULONG *,unsigned char *,HACCEL *);
  void __RPC_API HACCEL_UserFree(ULONG *,HACCEL *);
  ULONG __RPC_API HDC_UserSize(ULONG *,ULONG,HDC *);
  unsigned char *__RPC_API HDC_UserMarshal(ULONG *,unsigned char *,HDC *);
  unsigned char *__RPC_API HDC_UserUnmarshal(ULONG *,unsigned char *,HDC *);
  void __RPC_API HDC_UserFree(ULONG *,HDC *);
  ULONG __RPC_API HFONT_UserSize(ULONG *,ULONG,HFONT *);
  unsigned char *__RPC_API HFONT_UserMarshal(ULONG *,unsigned char *,HFONT *);
  unsigned char *__RPC_API HFONT_UserUnmarshal(ULONG *,unsigned char *,HFONT *);
  void __RPC_API HFONT_UserFree(ULONG *,HFONT *);
  ULONG __RPC_API HPALETTE_UserSize(ULONG *,ULONG,HPALETTE *);
  unsigned char *__RPC_API HPALETTE_UserMarshal(ULONG *,unsigned char *,HPALETTE *);
  unsigned char *__RPC_API HPALETTE_UserUnmarshal(ULONG *,unsigned char *,HPALETTE *);
  void __RPC_API HPALETTE_UserFree(ULONG *,HPALETTE *);
  ULONG __RPC_API HWND_UserSize(ULONG *,ULONG,HWND *);
  unsigned char *__RPC_API HWND_UserMarshal(ULONG *,unsigned char *,HWND *);
  unsigned char *__RPC_API HWND_UserUnmarshal(ULONG *,unsigned char *,HWND *);
  void __RPC_API HWND_UserFree(ULONG *,HWND *);

  HRESULT WINAPI IEnumConnections_Next_Proxy(IEnumConnections *This,ULONG cConnections,LPCONNECTDATA rgcd,ULONG *pcFetched);
  HRESULT WINAPI IEnumConnections_Next_Stub(IEnumConnections *This,ULONG cConnections,LPCONNECTDATA rgcd,ULONG *pcFetched);
  HRESULT WINAPI IEnumConnectionPoints_Next_Proxy(IEnumConnectionPoints *This,ULONG cConnections,LPCONNECTIONPOINT *ppCP,ULONG *pcFetched);
  HRESULT WINAPI IEnumConnectionPoints_Next_Stub(IEnumConnectionPoints *This,ULONG cConnections,LPCONNECTIONPOINT *ppCP,ULONG *pcFetched);
  HRESULT WINAPI IClassFactory2_CreateInstanceLic_Proxy(IClassFactory2 *This,IUnknown *pUnkOuter,IUnknown *pUnkReserved,REFIID riid,BSTR bstrKey,PVOID *ppvObj);
  HRESULT WINAPI IClassFactory2_CreateInstanceLic_Stub(IClassFactory2 *This,REFIID riid,BSTR bstrKey,IUnknown **ppvObj);
  HRESULT WINAPI IPersistMemory_Load_Proxy(IPersistMemory *This,LPVOID pMem,ULONG cbSize);
  HRESULT WINAPI IPersistMemory_Load_Stub(IPersistMemory *This,BYTE *pMem,ULONG cbSize);
  HRESULT WINAPI IPersistMemory_Save_Proxy(IPersistMemory *This,LPVOID pMem,WINBOOL fClearDirty,ULONG cbSize);
  HRESULT WINAPI IPersistMemory_Save_Stub(IPersistMemory *This,BYTE *pMem,WINBOOL fClearDirty,ULONG cbSize);
  HRESULT WINAPI IEnumOleUndoUnits_Next_Proxy(IEnumOleUndoUnits *This,ULONG cElt,IOleUndoUnit **rgElt,ULONG *pcEltFetched);
  HRESULT WINAPI IEnumOleUndoUnits_Next_Stub(IEnumOleUndoUnits *This,ULONG cElt,IOleUndoUnit **rgElt,ULONG *pcEltFetched);
  void WINAPI IAdviseSinkEx_OnViewStatusChange_Proxy(IAdviseSinkEx *This,DWORD dwViewStatus);
  HRESULT WINAPI IAdviseSinkEx_OnViewStatusChange_Stub(IAdviseSinkEx *This,DWORD dwViewStatus);
  HRESULT WINAPI IQuickActivate_QuickActivate_Proxy(IQuickActivate *This,QACONTAINER *pQaContainer,QACONTROL *pQaControl);
  HRESULT WINAPI IQuickActivate_QuickActivate_Stub(IQuickActivate *This,QACONTAINER *pQaContainer,QACONTROL *pQaControl);
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER CLIPFORMAT_UserSize     (ULONG *, ULONG, CLIPFORMAT *);
unsigned char * __RPC_USER CLIPFORMAT_UserMarshal  (ULONG *, unsigned char *, CLIPFORMAT *);
unsigned char * __RPC_USER CLIPFORMAT_UserUnmarshal(ULONG *, unsigned char *, CLIPFORMAT *);
void            __RPC_USER CLIPFORMAT_UserFree     (ULONG *, CLIPFORMAT *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __ocidl_h__ */
