/*** Autogenerated by WIDL 1.0 from include/oleidl.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 __oleidl_h__
#define __oleidl_h__

/* Forward declarations */

/* Headers for imported files */

#include <objidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __IOleAdviseHolder_FWD_DEFINED__
#define __IOleAdviseHolder_FWD_DEFINED__
typedef struct IOleAdviseHolder IOleAdviseHolder;
#endif

#ifndef __IOleCache_FWD_DEFINED__
#define __IOleCache_FWD_DEFINED__
typedef struct IOleCache IOleCache;
#endif

#ifndef __IOleCache2_FWD_DEFINED__
#define __IOleCache2_FWD_DEFINED__
typedef struct IOleCache2 IOleCache2;
#endif

#ifndef __IOleCacheControl_FWD_DEFINED__
#define __IOleCacheControl_FWD_DEFINED__
typedef struct IOleCacheControl IOleCacheControl;
#endif

#ifndef __IParseDisplayName_FWD_DEFINED__
#define __IParseDisplayName_FWD_DEFINED__
typedef struct IParseDisplayName IParseDisplayName;
#endif

#ifndef __IOleContainer_FWD_DEFINED__
#define __IOleContainer_FWD_DEFINED__
typedef struct IOleContainer IOleContainer;
#endif

#ifndef __IOleClientSite_FWD_DEFINED__
#define __IOleClientSite_FWD_DEFINED__
typedef struct IOleClientSite IOleClientSite;
#endif

#ifndef __IOleObject_FWD_DEFINED__
#define __IOleObject_FWD_DEFINED__
typedef struct IOleObject IOleObject;
#endif

#ifndef __IOleWindow_FWD_DEFINED__
#define __IOleWindow_FWD_DEFINED__
typedef struct IOleWindow IOleWindow;
#endif

#ifndef __IOleLink_FWD_DEFINED__
#define __IOleLink_FWD_DEFINED__
typedef struct IOleLink IOleLink;
#endif

#ifndef __IOleItemContainer_FWD_DEFINED__
#define __IOleItemContainer_FWD_DEFINED__
typedef struct IOleItemContainer IOleItemContainer;
#endif

#ifndef __IOleInPlaceUIWindow_FWD_DEFINED__
#define __IOleInPlaceUIWindow_FWD_DEFINED__
typedef struct IOleInPlaceUIWindow IOleInPlaceUIWindow;
#endif

#ifndef __IOleInPlaceActiveObject_FWD_DEFINED__
#define __IOleInPlaceActiveObject_FWD_DEFINED__
typedef struct IOleInPlaceActiveObject IOleInPlaceActiveObject;
#endif

#ifndef __IOleInPlaceFrame_FWD_DEFINED__
#define __IOleInPlaceFrame_FWD_DEFINED__
typedef struct IOleInPlaceFrame IOleInPlaceFrame;
#endif

#ifndef __IOleInPlaceObject_FWD_DEFINED__
#define __IOleInPlaceObject_FWD_DEFINED__
typedef struct IOleInPlaceObject IOleInPlaceObject;
#endif

#ifndef __IOleInPlaceSite_FWD_DEFINED__
#define __IOleInPlaceSite_FWD_DEFINED__
typedef struct IOleInPlaceSite IOleInPlaceSite;
#endif

#ifndef __IContinue_FWD_DEFINED__
#define __IContinue_FWD_DEFINED__
typedef struct IContinue IContinue;
#endif

#ifndef __IViewObject_FWD_DEFINED__
#define __IViewObject_FWD_DEFINED__
typedef struct IViewObject IViewObject;
#endif

#ifndef __IViewObject2_FWD_DEFINED__
#define __IViewObject2_FWD_DEFINED__
typedef struct IViewObject2 IViewObject2;
#endif

#ifndef __IDropSource_FWD_DEFINED__
#define __IDropSource_FWD_DEFINED__
typedef struct IDropSource IDropSource;
#endif

#ifndef __IDropTarget_FWD_DEFINED__
#define __IDropTarget_FWD_DEFINED__
typedef struct IDropTarget IDropTarget;
#endif

#ifndef __IEnumOLEVERB_FWD_DEFINED__
#define __IEnumOLEVERB_FWD_DEFINED__
typedef struct IEnumOLEVERB IEnumOLEVERB;
#endif

  extern RPC_IF_HANDLE __MIDL_itf_oleidl_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_oleidl_0000_v0_0_s_ifspec;

#ifndef __IOleAdviseHolder_INTERFACE_DEFINED__
#define __IOleAdviseHolder_INTERFACE_DEFINED__

  typedef IOleAdviseHolder *LPOLEADVISEHOLDER;
  EXTERN_C const IID IID_IOleAdviseHolder;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleAdviseHolder : public IUnknown {
  public:
    virtual HRESULT WINAPI Advise(IAdviseSink *pAdvise,DWORD *pdwConnection) = 0;
    virtual HRESULT WINAPI Unadvise(DWORD dwConnection) = 0;
    virtual HRESULT WINAPI EnumAdvise(IEnumSTATDATA **ppenumAdvise) = 0;
    virtual HRESULT WINAPI SendOnRename(IMoniker *pmk) = 0;
    virtual HRESULT WINAPI SendOnSave(void) = 0;
    virtual HRESULT WINAPI SendOnClose(void) = 0;
  };
#else
  typedef struct IOleAdviseHolderVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleAdviseHolder *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleAdviseHolder *This);
      ULONG (WINAPI *Release)(IOleAdviseHolder *This);
      HRESULT (WINAPI *Advise)(IOleAdviseHolder *This,IAdviseSink *pAdvise,DWORD *pdwConnection);
      HRESULT (WINAPI *Unadvise)(IOleAdviseHolder *This,DWORD dwConnection);
      HRESULT (WINAPI *EnumAdvise)(IOleAdviseHolder *This,IEnumSTATDATA **ppenumAdvise);
      HRESULT (WINAPI *SendOnRename)(IOleAdviseHolder *This,IMoniker *pmk);
      HRESULT (WINAPI *SendOnSave)(IOleAdviseHolder *This);
      HRESULT (WINAPI *SendOnClose)(IOleAdviseHolder *This);
    END_INTERFACE
  } IOleAdviseHolderVtbl;
  struct IOleAdviseHolder {
    CONST_VTBL struct IOleAdviseHolderVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleAdviseHolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleAdviseHolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleAdviseHolder_Release(This) (This)->lpVtbl->Release(This)
#define IOleAdviseHolder_Advise(This,pAdvise,pdwConnection) (This)->lpVtbl->Advise(This,pAdvise,pdwConnection)
#define IOleAdviseHolder_Unadvise(This,dwConnection) (This)->lpVtbl->Unadvise(This,dwConnection)
#define IOleAdviseHolder_EnumAdvise(This,ppenumAdvise) (This)->lpVtbl->EnumAdvise(This,ppenumAdvise)
#define IOleAdviseHolder_SendOnRename(This,pmk) (This)->lpVtbl->SendOnRename(This,pmk)
#define IOleAdviseHolder_SendOnSave(This) (This)->lpVtbl->SendOnSave(This)
#define IOleAdviseHolder_SendOnClose(This) (This)->lpVtbl->SendOnClose(This)
#endif
#endif
  HRESULT WINAPI IOleAdviseHolder_Advise_Proxy(IOleAdviseHolder *This,IAdviseSink *pAdvise,DWORD *pdwConnection);
  void __RPC_STUB IOleAdviseHolder_Advise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleAdviseHolder_Unadvise_Proxy(IOleAdviseHolder *This,DWORD dwConnection);
  void __RPC_STUB IOleAdviseHolder_Unadvise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleAdviseHolder_EnumAdvise_Proxy(IOleAdviseHolder *This,IEnumSTATDATA **ppenumAdvise);
  void __RPC_STUB IOleAdviseHolder_EnumAdvise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleAdviseHolder_SendOnRename_Proxy(IOleAdviseHolder *This,IMoniker *pmk);
  void __RPC_STUB IOleAdviseHolder_SendOnRename_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleAdviseHolder_SendOnSave_Proxy(IOleAdviseHolder *This);
  void __RPC_STUB IOleAdviseHolder_SendOnSave_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleAdviseHolder_SendOnClose_Proxy(IOleAdviseHolder *This);
  void __RPC_STUB IOleAdviseHolder_SendOnClose_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleCache_INTERFACE_DEFINED__
#define __IOleCache_INTERFACE_DEFINED__
  typedef IOleCache *LPOLECACHE;

  EXTERN_C const IID IID_IOleCache;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleCache : public IUnknown {
  public:
    virtual HRESULT WINAPI Cache(FORMATETC *pformatetc,DWORD advf,DWORD *pdwConnection) = 0;
    virtual HRESULT WINAPI Uncache(DWORD dwConnection) = 0;
    virtual HRESULT WINAPI EnumCache(IEnumSTATDATA **ppenumSTATDATA) = 0;
    virtual HRESULT WINAPI InitCache(IDataObject *pDataObject) = 0;
    virtual HRESULT WINAPI SetData(FORMATETC *pformatetc,STGMEDIUM *pmedium,WINBOOL fRelease) = 0;
  };
#else
  typedef struct IOleCacheVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleCache *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleCache *This);
      ULONG (WINAPI *Release)(IOleCache *This);
      HRESULT (WINAPI *Cache)(IOleCache *This,FORMATETC *pformatetc,DWORD advf,DWORD *pdwConnection);
      HRESULT (WINAPI *Uncache)(IOleCache *This,DWORD dwConnection);
      HRESULT (WINAPI *EnumCache)(IOleCache *This,IEnumSTATDATA **ppenumSTATDATA);
      HRESULT (WINAPI *InitCache)(IOleCache *This,IDataObject *pDataObject);
      HRESULT (WINAPI *SetData)(IOleCache *This,FORMATETC *pformatetc,STGMEDIUM *pmedium,WINBOOL fRelease);
    END_INTERFACE
  } IOleCacheVtbl;
  struct IOleCache {
    CONST_VTBL struct IOleCacheVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleCache_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleCache_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleCache_Release(This) (This)->lpVtbl->Release(This)
#define IOleCache_Cache(This,pformatetc,advf,pdwConnection) (This)->lpVtbl->Cache(This,pformatetc,advf,pdwConnection)
#define IOleCache_Uncache(This,dwConnection) (This)->lpVtbl->Uncache(This,dwConnection)
#define IOleCache_EnumCache(This,ppenumSTATDATA) (This)->lpVtbl->EnumCache(This,ppenumSTATDATA)
#define IOleCache_InitCache(This,pDataObject) (This)->lpVtbl->InitCache(This,pDataObject)
#define IOleCache_SetData(This,pformatetc,pmedium,fRelease) (This)->lpVtbl->SetData(This,pformatetc,pmedium,fRelease)
#endif
#endif
  HRESULT WINAPI IOleCache_Cache_Proxy(IOleCache *This,FORMATETC *pformatetc,DWORD advf,DWORD *pdwConnection);
  void __RPC_STUB IOleCache_Cache_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleCache_Uncache_Proxy(IOleCache *This,DWORD dwConnection);
  void __RPC_STUB IOleCache_Uncache_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleCache_EnumCache_Proxy(IOleCache *This,IEnumSTATDATA **ppenumSTATDATA);
  void __RPC_STUB IOleCache_EnumCache_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleCache_InitCache_Proxy(IOleCache *This,IDataObject *pDataObject);
  void __RPC_STUB IOleCache_InitCache_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleCache_SetData_Proxy(IOleCache *This,FORMATETC *pformatetc,STGMEDIUM *pmedium,WINBOOL fRelease);
  void __RPC_STUB IOleCache_SetData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleCache2_INTERFACE_DEFINED__
#define __IOleCache2_INTERFACE_DEFINED__
  typedef IOleCache2 *LPOLECACHE2;

#define UPDFCACHE_NODATACACHE (0x1)
#define UPDFCACHE_ONSAVECACHE (0x2)
#define UPDFCACHE_ONSTOPCACHE (0x4)
#define UPDFCACHE_NORMALCACHE (0x8)
#define UPDFCACHE_IFBLANK (0x10)
#define UPDFCACHE_ONLYIFBLANK (0x80000000)
#define UPDFCACHE_IFBLANKORONSAVECACHE (UPDFCACHE_IFBLANK | UPDFCACHE_ONSAVECACHE)
#define UPDFCACHE_ALL ((DWORD)~UPDFCACHE_ONLYIFBLANK)
#define UPDFCACHE_ALLBUTNODATACACHE (UPDFCACHE_ALL & (DWORD)~UPDFCACHE_NODATACACHE)

  typedef enum tagDISCARDCACHE {
    DISCARDCACHE_SAVEIFDIRTY = 0,DISCARDCACHE_NOSAVE = 1
  } DISCARDCACHE;

  EXTERN_C const IID IID_IOleCache2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleCache2 : public IOleCache {
  public:
    virtual HRESULT WINAPI UpdateCache(LPDATAOBJECT pDataObject,DWORD grfUpdf,LPVOID pReserved) = 0;
    virtual HRESULT WINAPI DiscardCache(DWORD dwDiscardOptions) = 0;
  };
#else
  typedef struct IOleCache2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleCache2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleCache2 *This);
      ULONG (WINAPI *Release)(IOleCache2 *This);
      HRESULT (WINAPI *Cache)(IOleCache2 *This,FORMATETC *pformatetc,DWORD advf,DWORD *pdwConnection);
      HRESULT (WINAPI *Uncache)(IOleCache2 *This,DWORD dwConnection);
      HRESULT (WINAPI *EnumCache)(IOleCache2 *This,IEnumSTATDATA **ppenumSTATDATA);
      HRESULT (WINAPI *InitCache)(IOleCache2 *This,IDataObject *pDataObject);
      HRESULT (WINAPI *SetData)(IOleCache2 *This,FORMATETC *pformatetc,STGMEDIUM *pmedium,WINBOOL fRelease);
      HRESULT (WINAPI *UpdateCache)(IOleCache2 *This,LPDATAOBJECT pDataObject,DWORD grfUpdf,LPVOID pReserved);
      HRESULT (WINAPI *DiscardCache)(IOleCache2 *This,DWORD dwDiscardOptions);
    END_INTERFACE
  } IOleCache2Vtbl;
  struct IOleCache2 {
    CONST_VTBL struct IOleCache2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleCache2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleCache2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleCache2_Release(This) (This)->lpVtbl->Release(This)
#define IOleCache2_Cache(This,pformatetc,advf,pdwConnection) (This)->lpVtbl->Cache(This,pformatetc,advf,pdwConnection)
#define IOleCache2_Uncache(This,dwConnection) (This)->lpVtbl->Uncache(This,dwConnection)
#define IOleCache2_EnumCache(This,ppenumSTATDATA) (This)->lpVtbl->EnumCache(This,ppenumSTATDATA)
#define IOleCache2_InitCache(This,pDataObject) (This)->lpVtbl->InitCache(This,pDataObject)
#define IOleCache2_SetData(This,pformatetc,pmedium,fRelease) (This)->lpVtbl->SetData(This,pformatetc,pmedium,fRelease)
#define IOleCache2_UpdateCache(This,pDataObject,grfUpdf,pReserved) (This)->lpVtbl->UpdateCache(This,pDataObject,grfUpdf,pReserved)
#define IOleCache2_DiscardCache(This,dwDiscardOptions) (This)->lpVtbl->DiscardCache(This,dwDiscardOptions)
#endif
#endif
  HRESULT WINAPI IOleCache2_RemoteUpdateCache_Proxy(IOleCache2 *This,LPDATAOBJECT pDataObject,DWORD grfUpdf,LONG_PTR pReserved);
  void __RPC_STUB IOleCache2_RemoteUpdateCache_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleCache2_DiscardCache_Proxy(IOleCache2 *This,DWORD dwDiscardOptions);
  void __RPC_STUB IOleCache2_DiscardCache_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleCacheControl_INTERFACE_DEFINED__
#define __IOleCacheControl_INTERFACE_DEFINED__
  typedef IOleCacheControl *LPOLECACHECONTROL;
  EXTERN_C const IID IID_IOleCacheControl;

#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleCacheControl : public IUnknown {
  public:
    virtual HRESULT WINAPI OnRun(LPDATAOBJECT pDataObject) = 0;
    virtual HRESULT WINAPI OnStop(void) = 0;
  };
#else
  typedef struct IOleCacheControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleCacheControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleCacheControl *This);
      ULONG (WINAPI *Release)(IOleCacheControl *This);
      HRESULT (WINAPI *OnRun)(IOleCacheControl *This,LPDATAOBJECT pDataObject);
      HRESULT (WINAPI *OnStop)(IOleCacheControl *This);
    END_INTERFACE
  } IOleCacheControlVtbl;
  struct IOleCacheControl {
    CONST_VTBL struct IOleCacheControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleCacheControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleCacheControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleCacheControl_Release(This) (This)->lpVtbl->Release(This)
#define IOleCacheControl_OnRun(This,pDataObject) (This)->lpVtbl->OnRun(This,pDataObject)
#define IOleCacheControl_OnStop(This) (This)->lpVtbl->OnStop(This)
#endif
#endif
  HRESULT WINAPI IOleCacheControl_OnRun_Proxy(IOleCacheControl *This,LPDATAOBJECT pDataObject);
  void __RPC_STUB IOleCacheControl_OnRun_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleCacheControl_OnStop_Proxy(IOleCacheControl *This);
  void __RPC_STUB IOleCacheControl_OnStop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IParseDisplayName_INTERFACE_DEFINED__
#define __IParseDisplayName_INTERFACE_DEFINED__
  typedef IParseDisplayName *LPPARSEDISPLAYNAME;

  EXTERN_C const IID IID_IParseDisplayName;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IParseDisplayName : public IUnknown {
  public:
    virtual HRESULT WINAPI ParseDisplayName(IBindCtx *pbc,LPOLESTR pszDisplayName,ULONG *pchEaten,IMoniker **ppmkOut) = 0;
  };
#else
  typedef struct IParseDisplayNameVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IParseDisplayName *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IParseDisplayName *This);
      ULONG (WINAPI *Release)(IParseDisplayName *This);
      HRESULT (WINAPI *ParseDisplayName)(IParseDisplayName *This,IBindCtx *pbc,LPOLESTR pszDisplayName,ULONG *pchEaten,IMoniker **ppmkOut);
    END_INTERFACE
  } IParseDisplayNameVtbl;
  struct IParseDisplayName {
    CONST_VTBL struct IParseDisplayNameVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IParseDisplayName_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IParseDisplayName_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IParseDisplayName_Release(This) (This)->lpVtbl->Release(This)
#define IParseDisplayName_ParseDisplayName(This,pbc,pszDisplayName,pchEaten,ppmkOut) (This)->lpVtbl->ParseDisplayName(This,pbc,pszDisplayName,pchEaten,ppmkOut)
#endif
#endif
  HRESULT WINAPI IParseDisplayName_ParseDisplayName_Proxy(IParseDisplayName *This,IBindCtx *pbc,LPOLESTR pszDisplayName,ULONG *pchEaten,IMoniker **ppmkOut);
  void __RPC_STUB IParseDisplayName_ParseDisplayName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleContainer_INTERFACE_DEFINED__
#define __IOleContainer_INTERFACE_DEFINED__
  typedef IOleContainer *LPOLECONTAINER;

  EXTERN_C const IID IID_IOleContainer;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleContainer : public IParseDisplayName {
  public:
    virtual HRESULT WINAPI EnumObjects(DWORD grfFlags,IEnumUnknown **ppenum) = 0;
    virtual HRESULT WINAPI LockContainer(WINBOOL fLock) = 0;
  };
#else
  typedef struct IOleContainerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleContainer *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleContainer *This);
      ULONG (WINAPI *Release)(IOleContainer *This);
      HRESULT (WINAPI *ParseDisplayName)(IOleContainer *This,IBindCtx *pbc,LPOLESTR pszDisplayName,ULONG *pchEaten,IMoniker **ppmkOut);
      HRESULT (WINAPI *EnumObjects)(IOleContainer *This,DWORD grfFlags,IEnumUnknown **ppenum);
      HRESULT (WINAPI *LockContainer)(IOleContainer *This,WINBOOL fLock);
    END_INTERFACE
  } IOleContainerVtbl;
  struct IOleContainer {
    CONST_VTBL struct IOleContainerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleContainer_Release(This) (This)->lpVtbl->Release(This)
#define IOleContainer_ParseDisplayName(This,pbc,pszDisplayName,pchEaten,ppmkOut) (This)->lpVtbl->ParseDisplayName(This,pbc,pszDisplayName,pchEaten,ppmkOut)
#define IOleContainer_EnumObjects(This,grfFlags,ppenum) (This)->lpVtbl->EnumObjects(This,grfFlags,ppenum)
#define IOleContainer_LockContainer(This,fLock) (This)->lpVtbl->LockContainer(This,fLock)
#endif
#endif
  HRESULT WINAPI IOleContainer_EnumObjects_Proxy(IOleContainer *This,DWORD grfFlags,IEnumUnknown **ppenum);
  void __RPC_STUB IOleContainer_EnumObjects_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleContainer_LockContainer_Proxy(IOleContainer *This,WINBOOL fLock);
  void __RPC_STUB IOleContainer_LockContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleClientSite_INTERFACE_DEFINED__
#define __IOleClientSite_INTERFACE_DEFINED__
  typedef IOleClientSite *LPOLECLIENTSITE;

  EXTERN_C const IID IID_IOleClientSite;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleClientSite : public IUnknown {
  public:
    virtual HRESULT WINAPI SaveObject(void) = 0;
    virtual HRESULT WINAPI GetMoniker(DWORD dwAssign,DWORD dwWhichMoniker,IMoniker **ppmk) = 0;
    virtual HRESULT WINAPI GetContainer(IOleContainer **ppContainer) = 0;
    virtual HRESULT WINAPI ShowObject(void) = 0;
    virtual HRESULT WINAPI OnShowWindow(WINBOOL fShow) = 0;
    virtual HRESULT WINAPI RequestNewObjectLayout(void) = 0;
  };
#else
  typedef struct IOleClientSiteVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleClientSite *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleClientSite *This);
      ULONG (WINAPI *Release)(IOleClientSite *This);
      HRESULT (WINAPI *SaveObject)(IOleClientSite *This);
      HRESULT (WINAPI *GetMoniker)(IOleClientSite *This,DWORD dwAssign,DWORD dwWhichMoniker,IMoniker **ppmk);
      HRESULT (WINAPI *GetContainer)(IOleClientSite *This,IOleContainer **ppContainer);
      HRESULT (WINAPI *ShowObject)(IOleClientSite *This);
      HRESULT (WINAPI *OnShowWindow)(IOleClientSite *This,WINBOOL fShow);
      HRESULT (WINAPI *RequestNewObjectLayout)(IOleClientSite *This);
    END_INTERFACE
  } IOleClientSiteVtbl;
  struct IOleClientSite {
    CONST_VTBL struct IOleClientSiteVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleClientSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleClientSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleClientSite_Release(This) (This)->lpVtbl->Release(This)
#define IOleClientSite_SaveObject(This) (This)->lpVtbl->SaveObject(This)
#define IOleClientSite_GetMoniker(This,dwAssign,dwWhichMoniker,ppmk) (This)->lpVtbl->GetMoniker(This,dwAssign,dwWhichMoniker,ppmk)
#define IOleClientSite_GetContainer(This,ppContainer) (This)->lpVtbl->GetContainer(This,ppContainer)
#define IOleClientSite_ShowObject(This) (This)->lpVtbl->ShowObject(This)
#define IOleClientSite_OnShowWindow(This,fShow) (This)->lpVtbl->OnShowWindow(This,fShow)
#define IOleClientSite_RequestNewObjectLayout(This) (This)->lpVtbl->RequestNewObjectLayout(This)
#endif
#endif
  HRESULT WINAPI IOleClientSite_SaveObject_Proxy(IOleClientSite *This);
  void __RPC_STUB IOleClientSite_SaveObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleClientSite_GetMoniker_Proxy(IOleClientSite *This,DWORD dwAssign,DWORD dwWhichMoniker,IMoniker **ppmk);
  void __RPC_STUB IOleClientSite_GetMoniker_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleClientSite_GetContainer_Proxy(IOleClientSite *This,IOleContainer **ppContainer);
  void __RPC_STUB IOleClientSite_GetContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleClientSite_ShowObject_Proxy(IOleClientSite *This);
  void __RPC_STUB IOleClientSite_ShowObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleClientSite_OnShowWindow_Proxy(IOleClientSite *This,WINBOOL fShow);
  void __RPC_STUB IOleClientSite_OnShowWindow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleClientSite_RequestNewObjectLayout_Proxy(IOleClientSite *This);
  void __RPC_STUB IOleClientSite_RequestNewObjectLayout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleObject_INTERFACE_DEFINED__
#define __IOleObject_INTERFACE_DEFINED__
#ifndef _LPOLEOBJECT_DEFINED
#define _LPOLEOBJECT_DEFINED
  typedef IOleObject *LPOLEOBJECT;
#endif

  typedef enum tagOLEGETMONIKER {
    OLEGETMONIKER_ONLYIFTHERE = 1,OLEGETMONIKER_FORCEASSIGN = 2,OLEGETMONIKER_UNASSIGN = 3,OLEGETMONIKER_TEMPFORUSER = 4
  } OLEGETMONIKER;
  typedef enum tagOLEWHICHMK {
    OLEWHICHMK_CONTAINER = 1,OLEWHICHMK_OBJREL = 2,OLEWHICHMK_OBJFULL = 3
  } OLEWHICHMK;

  typedef enum tagUSERCLASSTYPE {
    USERCLASSTYPE_FULL = 1,USERCLASSTYPE_SHORT = 2,USERCLASSTYPE_APPNAME = 3
  } USERCLASSTYPE;

  typedef enum tagOLEMISC {
    OLEMISC_RECOMPOSEONRESIZE = 0x1,OLEMISC_ONLYICONIC = 0x2,OLEMISC_INSERTNOTREPLACE = 0x4,OLEMISC_STATIC = 0x8,OLEMISC_CANTLINKINSIDE = 0x10,
    OLEMISC_CANLINKBYOLE1 = 0x20,OLEMISC_ISLINKOBJECT = 0x40,OLEMISC_INSIDEOUT = 0x80,OLEMISC_ACTIVATEWHENVISIBLE = 0x100,
    OLEMISC_RENDERINGISDEVICEINDEPENDENT = 0x200,OLEMISC_INVISIBLEATRUNTIME = 0x400,OLEMISC_ALWAYSRUN = 0x800,OLEMISC_ACTSLIKEBUTTON = 0x1000,
    OLEMISC_ACTSLIKELABEL = 0x2000,OLEMISC_NOUIACTIVATE = 0x4000,OLEMISC_ALIGNABLE = 0x8000,OLEMISC_SIMPLEFRAME = 0x10000,
    OLEMISC_SETCLIENTSITEFIRST = 0x20000,OLEMISC_IMEMODE = 0x40000,OLEMISC_IGNOREACTIVATEWHENVISIBLE = 0x80000,OLEMISC_WANTSTOMENUMERGE = 0x100000,
    OLEMISC_SUPPORTSMULTILEVELUNDO = 0x200000
  } OLEMISC;
  typedef enum tagOLECLOSE {
    OLECLOSE_SAVEIFDIRTY = 0,OLECLOSE_NOSAVE = 1,OLECLOSE_PROMPTSAVE = 2
  } OLECLOSE;

  EXTERN_C const IID IID_IOleObject;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleObject : public IUnknown {
  public:
    virtual HRESULT WINAPI SetClientSite(IOleClientSite *pClientSite) = 0;
    virtual HRESULT WINAPI GetClientSite(IOleClientSite **ppClientSite) = 0;
    virtual HRESULT WINAPI SetHostNames(LPCOLESTR szContainerApp,LPCOLESTR szContainerObj) = 0;
    virtual HRESULT WINAPI Close(DWORD dwSaveOption) = 0;
    virtual HRESULT WINAPI SetMoniker(DWORD dwWhichMoniker,IMoniker *pmk) = 0;
    virtual HRESULT WINAPI GetMoniker(DWORD dwAssign,DWORD dwWhichMoniker,IMoniker **ppmk) = 0;
    virtual HRESULT WINAPI InitFromData(IDataObject *pDataObject,WINBOOL fCreation,DWORD dwReserved) = 0;
    virtual HRESULT WINAPI GetClipboardData(DWORD dwReserved,IDataObject **ppDataObject) = 0;
    virtual HRESULT WINAPI DoVerb(LONG iVerb,LPMSG lpmsg,IOleClientSite *pActiveSite,LONG lindex,HWND hwndParent,LPCRECT lprcPosRect) = 0;
    virtual HRESULT WINAPI EnumVerbs(IEnumOLEVERB **ppEnumOleVerb) = 0;
    virtual HRESULT WINAPI Update(void) = 0;
    virtual HRESULT WINAPI IsUpToDate(void) = 0;
    virtual HRESULT WINAPI GetUserClassID(CLSID *pClsid) = 0;
    virtual HRESULT WINAPI GetUserType(DWORD dwFormOfType,LPOLESTR *pszUserType) = 0;
    virtual HRESULT WINAPI SetExtent(DWORD dwDrawAspect,SIZEL *psizel) = 0;
    virtual HRESULT WINAPI GetExtent(DWORD dwDrawAspect,SIZEL *psizel) = 0;
    virtual HRESULT WINAPI Advise(IAdviseSink *pAdvSink,DWORD *pdwConnection) = 0;
    virtual HRESULT WINAPI Unadvise(DWORD dwConnection) = 0;
    virtual HRESULT WINAPI EnumAdvise(IEnumSTATDATA **ppenumAdvise) = 0;
    virtual HRESULT WINAPI GetMiscStatus(DWORD dwAspect,DWORD *pdwStatus) = 0;
    virtual HRESULT WINAPI SetColorScheme(LOGPALETTE *pLogpal) = 0;
  };
#else
  typedef struct IOleObjectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleObject *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleObject *This);
      ULONG (WINAPI *Release)(IOleObject *This);
      HRESULT (WINAPI *SetClientSite)(IOleObject *This,IOleClientSite *pClientSite);
      HRESULT (WINAPI *GetClientSite)(IOleObject *This,IOleClientSite **ppClientSite);
      HRESULT (WINAPI *SetHostNames)(IOleObject *This,LPCOLESTR szContainerApp,LPCOLESTR szContainerObj);
      HRESULT (WINAPI *Close)(IOleObject *This,DWORD dwSaveOption);
      HRESULT (WINAPI *SetMoniker)(IOleObject *This,DWORD dwWhichMoniker,IMoniker *pmk);
      HRESULT (WINAPI *GetMoniker)(IOleObject *This,DWORD dwAssign,DWORD dwWhichMoniker,IMoniker **ppmk);
      HRESULT (WINAPI *InitFromData)(IOleObject *This,IDataObject *pDataObject,WINBOOL fCreation,DWORD dwReserved);
      HRESULT (WINAPI *GetClipboardData)(IOleObject *This,DWORD dwReserved,IDataObject **ppDataObject);
      HRESULT (WINAPI *DoVerb)(IOleObject *This,LONG iVerb,LPMSG lpmsg,IOleClientSite *pActiveSite,LONG lindex,HWND hwndParent,LPCRECT lprcPosRect);
      HRESULT (WINAPI *EnumVerbs)(IOleObject *This,IEnumOLEVERB **ppEnumOleVerb);
      HRESULT (WINAPI *Update)(IOleObject *This);
      HRESULT (WINAPI *IsUpToDate)(IOleObject *This);
      HRESULT (WINAPI *GetUserClassID)(IOleObject *This,CLSID *pClsid);
      HRESULT (WINAPI *GetUserType)(IOleObject *This,DWORD dwFormOfType,LPOLESTR *pszUserType);
      HRESULT (WINAPI *SetExtent)(IOleObject *This,DWORD dwDrawAspect,SIZEL *psizel);
      HRESULT (WINAPI *GetExtent)(IOleObject *This,DWORD dwDrawAspect,SIZEL *psizel);
      HRESULT (WINAPI *Advise)(IOleObject *This,IAdviseSink *pAdvSink,DWORD *pdwConnection);
      HRESULT (WINAPI *Unadvise)(IOleObject *This,DWORD dwConnection);
      HRESULT (WINAPI *EnumAdvise)(IOleObject *This,IEnumSTATDATA **ppenumAdvise);
      HRESULT (WINAPI *GetMiscStatus)(IOleObject *This,DWORD dwAspect,DWORD *pdwStatus);
      HRESULT (WINAPI *SetColorScheme)(IOleObject *This,LOGPALETTE *pLogpal);
    END_INTERFACE
  } IOleObjectVtbl;
  struct IOleObject {
    CONST_VTBL struct IOleObjectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleObject_Release(This) (This)->lpVtbl->Release(This)
#define IOleObject_SetClientSite(This,pClientSite) (This)->lpVtbl->SetClientSite(This,pClientSite)
#define IOleObject_GetClientSite(This,ppClientSite) (This)->lpVtbl->GetClientSite(This,ppClientSite)
#define IOleObject_SetHostNames(This,szContainerApp,szContainerObj) (This)->lpVtbl->SetHostNames(This,szContainerApp,szContainerObj)
#define IOleObject_Close(This,dwSaveOption) (This)->lpVtbl->Close(This,dwSaveOption)
#define IOleObject_SetMoniker(This,dwWhichMoniker,pmk) (This)->lpVtbl->SetMoniker(This,dwWhichMoniker,pmk)
#define IOleObject_GetMoniker(This,dwAssign,dwWhichMoniker,ppmk) (This)->lpVtbl->GetMoniker(This,dwAssign,dwWhichMoniker,ppmk)
#define IOleObject_InitFromData(This,pDataObject,fCreation,dwReserved) (This)->lpVtbl->InitFromData(This,pDataObject,fCreation,dwReserved)
#define IOleObject_GetClipboardData(This,dwReserved,ppDataObject) (This)->lpVtbl->GetClipboardData(This,dwReserved,ppDataObject)
#define IOleObject_DoVerb(This,iVerb,lpmsg,pActiveSite,lindex,hwndParent,lprcPosRect) (This)->lpVtbl->DoVerb(This,iVerb,lpmsg,pActiveSite,lindex,hwndParent,lprcPosRect)
#define IOleObject_EnumVerbs(This,ppEnumOleVerb) (This)->lpVtbl->EnumVerbs(This,ppEnumOleVerb)
#define IOleObject_Update(This) (This)->lpVtbl->Update(This)
#define IOleObject_IsUpToDate(This) (This)->lpVtbl->IsUpToDate(This)
#define IOleObject_GetUserClassID(This,pClsid) (This)->lpVtbl->GetUserClassID(This,pClsid)
#define IOleObject_GetUserType(This,dwFormOfType,pszUserType) (This)->lpVtbl->GetUserType(This,dwFormOfType,pszUserType)
#define IOleObject_SetExtent(This,dwDrawAspect,psizel) (This)->lpVtbl->SetExtent(This,dwDrawAspect,psizel)
#define IOleObject_GetExtent(This,dwDrawAspect,psizel) (This)->lpVtbl->GetExtent(This,dwDrawAspect,psizel)
#define IOleObject_Advise(This,pAdvSink,pdwConnection) (This)->lpVtbl->Advise(This,pAdvSink,pdwConnection)
#define IOleObject_Unadvise(This,dwConnection) (This)->lpVtbl->Unadvise(This,dwConnection)
#define IOleObject_EnumAdvise(This,ppenumAdvise) (This)->lpVtbl->EnumAdvise(This,ppenumAdvise)
#define IOleObject_GetMiscStatus(This,dwAspect,pdwStatus) (This)->lpVtbl->GetMiscStatus(This,dwAspect,pdwStatus)
#define IOleObject_SetColorScheme(This,pLogpal) (This)->lpVtbl->SetColorScheme(This,pLogpal)
#endif
#endif
  HRESULT WINAPI IOleObject_SetClientSite_Proxy(IOleObject *This,IOleClientSite *pClientSite);
  void __RPC_STUB IOleObject_SetClientSite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_GetClientSite_Proxy(IOleObject *This,IOleClientSite **ppClientSite);
  void __RPC_STUB IOleObject_GetClientSite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_SetHostNames_Proxy(IOleObject *This,LPCOLESTR szContainerApp,LPCOLESTR szContainerObj);
  void __RPC_STUB IOleObject_SetHostNames_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_Close_Proxy(IOleObject *This,DWORD dwSaveOption);
  void __RPC_STUB IOleObject_Close_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_SetMoniker_Proxy(IOleObject *This,DWORD dwWhichMoniker,IMoniker *pmk);
  void __RPC_STUB IOleObject_SetMoniker_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_GetMoniker_Proxy(IOleObject *This,DWORD dwAssign,DWORD dwWhichMoniker,IMoniker **ppmk);
  void __RPC_STUB IOleObject_GetMoniker_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_InitFromData_Proxy(IOleObject *This,IDataObject *pDataObject,WINBOOL fCreation,DWORD dwReserved);
  void __RPC_STUB IOleObject_InitFromData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_GetClipboardData_Proxy(IOleObject *This,DWORD dwReserved,IDataObject **ppDataObject);
  void __RPC_STUB IOleObject_GetClipboardData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_DoVerb_Proxy(IOleObject *This,LONG iVerb,LPMSG lpmsg,IOleClientSite *pActiveSite,LONG lindex,HWND hwndParent,LPCRECT lprcPosRect);
  void __RPC_STUB IOleObject_DoVerb_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_EnumVerbs_Proxy(IOleObject *This,IEnumOLEVERB **ppEnumOleVerb);
  void __RPC_STUB IOleObject_EnumVerbs_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_Update_Proxy(IOleObject *This);
  void __RPC_STUB IOleObject_Update_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_IsUpToDate_Proxy(IOleObject *This);
  void __RPC_STUB IOleObject_IsUpToDate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_GetUserClassID_Proxy(IOleObject *This,CLSID *pClsid);
  void __RPC_STUB IOleObject_GetUserClassID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_GetUserType_Proxy(IOleObject *This,DWORD dwFormOfType,LPOLESTR *pszUserType);
  void __RPC_STUB IOleObject_GetUserType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_SetExtent_Proxy(IOleObject *This,DWORD dwDrawAspect,SIZEL *psizel);
  void __RPC_STUB IOleObject_SetExtent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_GetExtent_Proxy(IOleObject *This,DWORD dwDrawAspect,SIZEL *psizel);
  void __RPC_STUB IOleObject_GetExtent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_Advise_Proxy(IOleObject *This,IAdviseSink *pAdvSink,DWORD *pdwConnection);
  void __RPC_STUB IOleObject_Advise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_Unadvise_Proxy(IOleObject *This,DWORD dwConnection);
  void __RPC_STUB IOleObject_Unadvise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_EnumAdvise_Proxy(IOleObject *This,IEnumSTATDATA **ppenumAdvise);
  void __RPC_STUB IOleObject_EnumAdvise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_GetMiscStatus_Proxy(IOleObject *This,DWORD dwAspect,DWORD *pdwStatus);
  void __RPC_STUB IOleObject_GetMiscStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleObject_SetColorScheme_Proxy(IOleObject *This,LOGPALETTE *pLogpal);
  void __RPC_STUB IOleObject_SetColorScheme_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOLETypes_INTERFACE_DEFINED__
#define __IOLETypes_INTERFACE_DEFINED__
  typedef enum tagOLERENDER {
    OLERENDER_NONE = 0,OLERENDER_DRAW = 1,OLERENDER_FORMAT = 2,OLERENDER_ASIS = 3
  } OLERENDER;

  typedef OLERENDER *LPOLERENDER;

  typedef struct tagOBJECTDESCRIPTOR {
    ULONG cbSize;
    CLSID clsid;
    DWORD dwDrawAspect;
    SIZEL sizel;
    POINTL pointl;
    DWORD dwStatus;
    DWORD dwFullUserTypeName;
    DWORD dwSrcOfCopy;
  } OBJECTDESCRIPTOR;

  typedef struct tagOBJECTDESCRIPTOR *POBJECTDESCRIPTOR;
  typedef struct tagOBJECTDESCRIPTOR *LPOBJECTDESCRIPTOR;
  typedef struct tagOBJECTDESCRIPTOR LINKSRCDESCRIPTOR;
  typedef struct tagOBJECTDESCRIPTOR *PLINKSRCDESCRIPTOR;
  typedef struct tagOBJECTDESCRIPTOR *LPLINKSRCDESCRIPTOR;

  extern RPC_IF_HANDLE IOLETypes_v0_0_c_ifspec;
  extern RPC_IF_HANDLE IOLETypes_v0_0_s_ifspec;
#endif

#ifndef __IOleWindow_INTERFACE_DEFINED__
#define __IOleWindow_INTERFACE_DEFINED__
  typedef IOleWindow *LPOLEWINDOW;

  EXTERN_C const IID IID_IOleWindow;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleWindow : public IUnknown {
  public:
    virtual HRESULT WINAPI GetWindow(HWND *phwnd) = 0;
    virtual HRESULT WINAPI ContextSensitiveHelp(WINBOOL fEnterMode) = 0;
  };
#else
  typedef struct IOleWindowVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleWindow *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleWindow *This);
      ULONG (WINAPI *Release)(IOleWindow *This);
      HRESULT (WINAPI *GetWindow)(IOleWindow *This,HWND *phwnd);
      HRESULT (WINAPI *ContextSensitiveHelp)(IOleWindow *This,WINBOOL fEnterMode);
    END_INTERFACE
  } IOleWindowVtbl;
  struct IOleWindow {
    CONST_VTBL struct IOleWindowVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleWindow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleWindow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleWindow_Release(This) (This)->lpVtbl->Release(This)
#define IOleWindow_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IOleWindow_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
#endif
#endif
  HRESULT WINAPI IOleWindow_GetWindow_Proxy(IOleWindow *This,HWND *phwnd);
  void __RPC_STUB IOleWindow_GetWindow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleWindow_ContextSensitiveHelp_Proxy(IOleWindow *This,WINBOOL fEnterMode);
  void __RPC_STUB IOleWindow_ContextSensitiveHelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleLink_INTERFACE_DEFINED__
#define __IOleLink_INTERFACE_DEFINED__
  typedef IOleLink *LPOLELINK;

  typedef enum tagOLEUPDATE {
    OLEUPDATE_ALWAYS = 1,OLEUPDATE_ONCALL = 3
  } OLEUPDATE;

  typedef OLEUPDATE *LPOLEUPDATE;
  typedef OLEUPDATE *POLEUPDATE;

  typedef enum tagOLELINKBIND {
    OLELINKBIND_EVENIFCLASSDIFF = 1
  } OLELINKBIND;

  EXTERN_C const IID IID_IOleLink;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleLink : public IUnknown {
  public:
    virtual HRESULT WINAPI SetUpdateOptions(DWORD dwUpdateOpt) = 0;
    virtual HRESULT WINAPI GetUpdateOptions(DWORD *pdwUpdateOpt) = 0;
    virtual HRESULT WINAPI SetSourceMoniker(IMoniker *pmk,REFCLSID rclsid) = 0;
    virtual HRESULT WINAPI GetSourceMoniker(IMoniker **ppmk) = 0;
    virtual HRESULT WINAPI SetSourceDisplayName(LPCOLESTR pszStatusText) = 0;
    virtual HRESULT WINAPI GetSourceDisplayName(LPOLESTR *ppszDisplayName) = 0;
    virtual HRESULT WINAPI BindToSource(DWORD bindflags,IBindCtx *pbc) = 0;
    virtual HRESULT WINAPI BindIfRunning(void) = 0;
    virtual HRESULT WINAPI GetBoundSource(IUnknown **ppunk) = 0;
    virtual HRESULT WINAPI UnbindSource(void) = 0;
    virtual HRESULT WINAPI Update(IBindCtx *pbc) = 0;
  };
#else
  typedef struct IOleLinkVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleLink *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleLink *This);
      ULONG (WINAPI *Release)(IOleLink *This);
      HRESULT (WINAPI *SetUpdateOptions)(IOleLink *This,DWORD dwUpdateOpt);
      HRESULT (WINAPI *GetUpdateOptions)(IOleLink *This,DWORD *pdwUpdateOpt);
      HRESULT (WINAPI *SetSourceMoniker)(IOleLink *This,IMoniker *pmk,REFCLSID rclsid);
      HRESULT (WINAPI *GetSourceMoniker)(IOleLink *This,IMoniker **ppmk);
      HRESULT (WINAPI *SetSourceDisplayName)(IOleLink *This,LPCOLESTR pszStatusText);
      HRESULT (WINAPI *GetSourceDisplayName)(IOleLink *This,LPOLESTR *ppszDisplayName);
      HRESULT (WINAPI *BindToSource)(IOleLink *This,DWORD bindflags,IBindCtx *pbc);
      HRESULT (WINAPI *BindIfRunning)(IOleLink *This);
      HRESULT (WINAPI *GetBoundSource)(IOleLink *This,IUnknown **ppunk);
      HRESULT (WINAPI *UnbindSource)(IOleLink *This);
      HRESULT (WINAPI *Update)(IOleLink *This,IBindCtx *pbc);
    END_INTERFACE
  } IOleLinkVtbl;
  struct IOleLink {
    CONST_VTBL struct IOleLinkVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleLink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleLink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleLink_Release(This) (This)->lpVtbl->Release(This)
#define IOleLink_SetUpdateOptions(This,dwUpdateOpt) (This)->lpVtbl->SetUpdateOptions(This,dwUpdateOpt)
#define IOleLink_GetUpdateOptions(This,pdwUpdateOpt) (This)->lpVtbl->GetUpdateOptions(This,pdwUpdateOpt)
#define IOleLink_SetSourceMoniker(This,pmk,rclsid) (This)->lpVtbl->SetSourceMoniker(This,pmk,rclsid)
#define IOleLink_GetSourceMoniker(This,ppmk) (This)->lpVtbl->GetSourceMoniker(This,ppmk)
#define IOleLink_SetSourceDisplayName(This,pszStatusText) (This)->lpVtbl->SetSourceDisplayName(This,pszStatusText)
#define IOleLink_GetSourceDisplayName(This,ppszDisplayName) (This)->lpVtbl->GetSourceDisplayName(This,ppszDisplayName)
#define IOleLink_BindToSource(This,bindflags,pbc) (This)->lpVtbl->BindToSource(This,bindflags,pbc)
#define IOleLink_BindIfRunning(This) (This)->lpVtbl->BindIfRunning(This)
#define IOleLink_GetBoundSource(This,ppunk) (This)->lpVtbl->GetBoundSource(This,ppunk)
#define IOleLink_UnbindSource(This) (This)->lpVtbl->UnbindSource(This)
#define IOleLink_Update(This,pbc) (This)->lpVtbl->Update(This,pbc)
#endif
#endif
  HRESULT WINAPI IOleLink_SetUpdateOptions_Proxy(IOleLink *This,DWORD dwUpdateOpt);
  void __RPC_STUB IOleLink_SetUpdateOptions_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_GetUpdateOptions_Proxy(IOleLink *This,DWORD *pdwUpdateOpt);
  void __RPC_STUB IOleLink_GetUpdateOptions_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_SetSourceMoniker_Proxy(IOleLink *This,IMoniker *pmk,REFCLSID rclsid);
  void __RPC_STUB IOleLink_SetSourceMoniker_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_GetSourceMoniker_Proxy(IOleLink *This,IMoniker **ppmk);
  void __RPC_STUB IOleLink_GetSourceMoniker_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_SetSourceDisplayName_Proxy(IOleLink *This,LPCOLESTR pszStatusText);
  void __RPC_STUB IOleLink_SetSourceDisplayName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_GetSourceDisplayName_Proxy(IOleLink *This,LPOLESTR *ppszDisplayName);
  void __RPC_STUB IOleLink_GetSourceDisplayName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_BindToSource_Proxy(IOleLink *This,DWORD bindflags,IBindCtx *pbc);
  void __RPC_STUB IOleLink_BindToSource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_BindIfRunning_Proxy(IOleLink *This);
  void __RPC_STUB IOleLink_BindIfRunning_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_GetBoundSource_Proxy(IOleLink *This,IUnknown **ppunk);
  void __RPC_STUB IOleLink_GetBoundSource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_UnbindSource_Proxy(IOleLink *This);
  void __RPC_STUB IOleLink_UnbindSource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleLink_Update_Proxy(IOleLink *This,IBindCtx *pbc);
  void __RPC_STUB IOleLink_Update_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleItemContainer_INTERFACE_DEFINED__
#define __IOleItemContainer_INTERFACE_DEFINED__
  typedef IOleItemContainer *LPOLEITEMCONTAINER;

  typedef enum tagBINDSPEED {
    BINDSPEED_INDEFINITE = 1,BINDSPEED_MODERATE = 2,BINDSPEED_IMMEDIATE = 3
  } BINDSPEED;

  typedef enum tagOLECONTF {
    OLECONTF_EMBEDDINGS = 1,OLECONTF_LINKS = 2,OLECONTF_OTHERS = 4,OLECONTF_ONLYUSER = 8,OLECONTF_ONLYIFRUNNING = 16
  } OLECONTF;

  EXTERN_C const IID IID_IOleItemContainer;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleItemContainer : public IOleContainer {
  public:
    virtual HRESULT WINAPI GetObject(LPOLESTR pszItem,DWORD dwSpeedNeeded,IBindCtx *pbc,REFIID riid,void **ppvObject) = 0;
    virtual HRESULT WINAPI GetObjectStorage(LPOLESTR pszItem,IBindCtx *pbc,REFIID riid,void **ppvStorage) = 0;
    virtual HRESULT WINAPI IsRunning(LPOLESTR pszItem) = 0;
  };
#else
  typedef struct IOleItemContainerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleItemContainer *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleItemContainer *This);
      ULONG (WINAPI *Release)(IOleItemContainer *This);
      HRESULT (WINAPI *ParseDisplayName)(IOleItemContainer *This,IBindCtx *pbc,LPOLESTR pszDisplayName,ULONG *pchEaten,IMoniker **ppmkOut);
      HRESULT (WINAPI *EnumObjects)(IOleItemContainer *This,DWORD grfFlags,IEnumUnknown **ppenum);
      HRESULT (WINAPI *LockContainer)(IOleItemContainer *This,WINBOOL fLock);
      HRESULT (WINAPI *GetObject)(IOleItemContainer *This,LPOLESTR pszItem,DWORD dwSpeedNeeded,IBindCtx *pbc,REFIID riid,void **ppvObject);
      HRESULT (WINAPI *GetObjectStorage)(IOleItemContainer *This,LPOLESTR pszItem,IBindCtx *pbc,REFIID riid,void **ppvStorage);
      HRESULT (WINAPI *IsRunning)(IOleItemContainer *This,LPOLESTR pszItem);
    END_INTERFACE
  } IOleItemContainerVtbl;
  struct IOleItemContainer {
    CONST_VTBL struct IOleItemContainerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleItemContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleItemContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleItemContainer_Release(This) (This)->lpVtbl->Release(This)
#define IOleItemContainer_ParseDisplayName(This,pbc,pszDisplayName,pchEaten,ppmkOut) (This)->lpVtbl->ParseDisplayName(This,pbc,pszDisplayName,pchEaten,ppmkOut)
#define IOleItemContainer_EnumObjects(This,grfFlags,ppenum) (This)->lpVtbl->EnumObjects(This,grfFlags,ppenum)
#define IOleItemContainer_LockContainer(This,fLock) (This)->lpVtbl->LockContainer(This,fLock)
#define IOleItemContainer_GetObject(This,pszItem,dwSpeedNeeded,pbc,riid,ppvObject) (This)->lpVtbl->GetObject(This,pszItem,dwSpeedNeeded,pbc,riid,ppvObject)
#define IOleItemContainer_GetObjectStorage(This,pszItem,pbc,riid,ppvStorage) (This)->lpVtbl->GetObjectStorage(This,pszItem,pbc,riid,ppvStorage)
#define IOleItemContainer_IsRunning(This,pszItem) (This)->lpVtbl->IsRunning(This,pszItem)
#endif
#endif
  HRESULT WINAPI IOleItemContainer_GetObject_Proxy(IOleItemContainer *This,LPOLESTR pszItem,DWORD dwSpeedNeeded,IBindCtx *pbc,REFIID riid,void **ppvObject);
  void __RPC_STUB IOleItemContainer_GetObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleItemContainer_GetObjectStorage_Proxy(IOleItemContainer *This,LPOLESTR pszItem,IBindCtx *pbc,REFIID riid,void **ppvStorage);
  void __RPC_STUB IOleItemContainer_GetObjectStorage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleItemContainer_IsRunning_Proxy(IOleItemContainer *This,LPOLESTR pszItem);
  void __RPC_STUB IOleItemContainer_IsRunning_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleInPlaceUIWindow_INTERFACE_DEFINED__
#define __IOleInPlaceUIWindow_INTERFACE_DEFINED__
  typedef IOleInPlaceUIWindow *LPOLEINPLACEUIWINDOW;

  typedef RECT BORDERWIDTHS;
  typedef LPRECT LPBORDERWIDTHS;
  typedef LPCRECT LPCBORDERWIDTHS;

  EXTERN_C const IID IID_IOleInPlaceUIWindow;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleInPlaceUIWindow : public IOleWindow {
  public:
    virtual HRESULT WINAPI GetBorder(LPRECT lprectBorder) = 0;
    virtual HRESULT WINAPI RequestBorderSpace(LPCBORDERWIDTHS pborderwidths) = 0;
    virtual HRESULT WINAPI SetBorderSpace(LPCBORDERWIDTHS pborderwidths) = 0;
    virtual HRESULT WINAPI SetActiveObject(IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName) = 0;
  };
#else
  typedef struct IOleInPlaceUIWindowVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleInPlaceUIWindow *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleInPlaceUIWindow *This);
      ULONG (WINAPI *Release)(IOleInPlaceUIWindow *This);
      HRESULT (WINAPI *GetWindow)(IOleInPlaceUIWindow *This,HWND *phwnd);
      HRESULT (WINAPI *ContextSensitiveHelp)(IOleInPlaceUIWindow *This,WINBOOL fEnterMode);
      HRESULT (WINAPI *GetBorder)(IOleInPlaceUIWindow *This,LPRECT lprectBorder);
      HRESULT (WINAPI *RequestBorderSpace)(IOleInPlaceUIWindow *This,LPCBORDERWIDTHS pborderwidths);
      HRESULT (WINAPI *SetBorderSpace)(IOleInPlaceUIWindow *This,LPCBORDERWIDTHS pborderwidths);
      HRESULT (WINAPI *SetActiveObject)(IOleInPlaceUIWindow *This,IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName);
    END_INTERFACE
  } IOleInPlaceUIWindowVtbl;
  struct IOleInPlaceUIWindow {
    CONST_VTBL struct IOleInPlaceUIWindowVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleInPlaceUIWindow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleInPlaceUIWindow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleInPlaceUIWindow_Release(This) (This)->lpVtbl->Release(This)
#define IOleInPlaceUIWindow_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IOleInPlaceUIWindow_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
#define IOleInPlaceUIWindow_GetBorder(This,lprectBorder) (This)->lpVtbl->GetBorder(This,lprectBorder)
#define IOleInPlaceUIWindow_RequestBorderSpace(This,pborderwidths) (This)->lpVtbl->RequestBorderSpace(This,pborderwidths)
#define IOleInPlaceUIWindow_SetBorderSpace(This,pborderwidths) (This)->lpVtbl->SetBorderSpace(This,pborderwidths)
#define IOleInPlaceUIWindow_SetActiveObject(This,pActiveObject,pszObjName) (This)->lpVtbl->SetActiveObject(This,pActiveObject,pszObjName)
#endif
#endif
  HRESULT WINAPI IOleInPlaceUIWindow_GetBorder_Proxy(IOleInPlaceUIWindow *This,LPRECT lprectBorder);
  void __RPC_STUB IOleInPlaceUIWindow_GetBorder_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceUIWindow_RequestBorderSpace_Proxy(IOleInPlaceUIWindow *This,LPCBORDERWIDTHS pborderwidths);
  void __RPC_STUB IOleInPlaceUIWindow_RequestBorderSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceUIWindow_SetBorderSpace_Proxy(IOleInPlaceUIWindow *This,LPCBORDERWIDTHS pborderwidths);
  void __RPC_STUB IOleInPlaceUIWindow_SetBorderSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceUIWindow_SetActiveObject_Proxy(IOleInPlaceUIWindow *This,IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName);
  void __RPC_STUB IOleInPlaceUIWindow_SetActiveObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleInPlaceActiveObject_INTERFACE_DEFINED__
#define __IOleInPlaceActiveObject_INTERFACE_DEFINED__
  typedef IOleInPlaceActiveObject *LPOLEINPLACEACTIVEOBJECT;

  EXTERN_C const IID IID_IOleInPlaceActiveObject;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleInPlaceActiveObject : public IOleWindow {
  public:
    virtual HRESULT WINAPI TranslateAccelerator(LPMSG lpmsg) = 0;
    virtual HRESULT WINAPI OnFrameWindowActivate(WINBOOL fActivate) = 0;
    virtual HRESULT WINAPI OnDocWindowActivate(WINBOOL fActivate) = 0;
    virtual HRESULT WINAPI ResizeBorder(LPCRECT prcBorder,IOleInPlaceUIWindow *pUIWindow,WINBOOL fFrameWindow) = 0;
    virtual HRESULT WINAPI EnableModeless(WINBOOL fEnable) = 0;
  };
#else
  typedef struct IOleInPlaceActiveObjectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleInPlaceActiveObject *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleInPlaceActiveObject *This);
      ULONG (WINAPI *Release)(IOleInPlaceActiveObject *This);
      HRESULT (WINAPI *GetWindow)(IOleInPlaceActiveObject *This,HWND *phwnd);
      HRESULT (WINAPI *ContextSensitiveHelp)(IOleInPlaceActiveObject *This,WINBOOL fEnterMode);
      HRESULT (WINAPI *TranslateAccelerator)(IOleInPlaceActiveObject *This,LPMSG lpmsg);
      HRESULT (WINAPI *OnFrameWindowActivate)(IOleInPlaceActiveObject *This,WINBOOL fActivate);
      HRESULT (WINAPI *OnDocWindowActivate)(IOleInPlaceActiveObject *This,WINBOOL fActivate);
      HRESULT (WINAPI *ResizeBorder)(IOleInPlaceActiveObject *This,LPCRECT prcBorder,IOleInPlaceUIWindow *pUIWindow,WINBOOL fFrameWindow);
      HRESULT (WINAPI *EnableModeless)(IOleInPlaceActiveObject *This,WINBOOL fEnable);
    END_INTERFACE
  } IOleInPlaceActiveObjectVtbl;
  struct IOleInPlaceActiveObject {
    CONST_VTBL struct IOleInPlaceActiveObjectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleInPlaceActiveObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleInPlaceActiveObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleInPlaceActiveObject_Release(This) (This)->lpVtbl->Release(This)
#define IOleInPlaceActiveObject_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IOleInPlaceActiveObject_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
#define IOleInPlaceActiveObject_TranslateAccelerator(This,lpmsg) (This)->lpVtbl->TranslateAccelerator(This,lpmsg)
#define IOleInPlaceActiveObject_OnFrameWindowActivate(This,fActivate) (This)->lpVtbl->OnFrameWindowActivate(This,fActivate)
#define IOleInPlaceActiveObject_OnDocWindowActivate(This,fActivate) (This)->lpVtbl->OnDocWindowActivate(This,fActivate)
#define IOleInPlaceActiveObject_ResizeBorder(This,prcBorder,pUIWindow,fFrameWindow) (This)->lpVtbl->ResizeBorder(This,prcBorder,pUIWindow,fFrameWindow)
#define IOleInPlaceActiveObject_EnableModeless(This,fEnable) (This)->lpVtbl->EnableModeless(This,fEnable)
#endif
#endif
  HRESULT WINAPI IOleInPlaceActiveObject_RemoteTranslateAccelerator_Proxy(IOleInPlaceActiveObject *This);
  void __RPC_STUB IOleInPlaceActiveObject_RemoteTranslateAccelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceActiveObject_OnFrameWindowActivate_Proxy(IOleInPlaceActiveObject *This,WINBOOL fActivate);
  void __RPC_STUB IOleInPlaceActiveObject_OnFrameWindowActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceActiveObject_OnDocWindowActivate_Proxy(IOleInPlaceActiveObject *This,WINBOOL fActivate);
  void __RPC_STUB IOleInPlaceActiveObject_OnDocWindowActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceActiveObject_RemoteResizeBorder_Proxy(IOleInPlaceActiveObject *This,LPCRECT prcBorder,REFIID riid,IOleInPlaceUIWindow *pUIWindow,WINBOOL fFrameWindow);
  void __RPC_STUB IOleInPlaceActiveObject_RemoteResizeBorder_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceActiveObject_EnableModeless_Proxy(IOleInPlaceActiveObject *This,WINBOOL fEnable);
  void __RPC_STUB IOleInPlaceActiveObject_EnableModeless_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleInPlaceFrame_INTERFACE_DEFINED__
#define __IOleInPlaceFrame_INTERFACE_DEFINED__
  typedef IOleInPlaceFrame *LPOLEINPLACEFRAME;

  typedef struct tagOIFI {
    UINT cb;
    WINBOOL fMDIApp;
    HWND hwndFrame;
    HACCEL haccel;
    UINT cAccelEntries;
  } OLEINPLACEFRAMEINFO;

  typedef struct tagOIFI *LPOLEINPLACEFRAMEINFO;

  typedef struct tagOleMenuGroupWidths {
    LONG width[6 ];
  } OLEMENUGROUPWIDTHS;

  typedef struct tagOleMenuGroupWidths *LPOLEMENUGROUPWIDTHS;
  typedef HGLOBAL HOLEMENU;

  EXTERN_C const IID IID_IOleInPlaceFrame;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleInPlaceFrame : public IOleInPlaceUIWindow {
  public:
    virtual HRESULT WINAPI InsertMenus(HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths) = 0;
    virtual HRESULT WINAPI SetMenu(HMENU hmenuShared,HOLEMENU holemenu,HWND hwndActiveObject) = 0;
    virtual HRESULT WINAPI RemoveMenus(HMENU hmenuShared) = 0;
    virtual HRESULT WINAPI SetStatusText(LPCOLESTR pszStatusText) = 0;
    virtual HRESULT WINAPI EnableModeless(WINBOOL fEnable) = 0;
    virtual HRESULT WINAPI TranslateAccelerator(LPMSG lpmsg,WORD wID) = 0;
  };
#else
  typedef struct IOleInPlaceFrameVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleInPlaceFrame *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleInPlaceFrame *This);
      ULONG (WINAPI *Release)(IOleInPlaceFrame *This);
      HRESULT (WINAPI *GetWindow)(IOleInPlaceFrame *This,HWND *phwnd);
      HRESULT (WINAPI *ContextSensitiveHelp)(IOleInPlaceFrame *This,WINBOOL fEnterMode);
      HRESULT (WINAPI *GetBorder)(IOleInPlaceFrame *This,LPRECT lprectBorder);
      HRESULT (WINAPI *RequestBorderSpace)(IOleInPlaceFrame *This,LPCBORDERWIDTHS pborderwidths);
      HRESULT (WINAPI *SetBorderSpace)(IOleInPlaceFrame *This,LPCBORDERWIDTHS pborderwidths);
      HRESULT (WINAPI *SetActiveObject)(IOleInPlaceFrame *This,IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName);
      HRESULT (WINAPI *InsertMenus)(IOleInPlaceFrame *This,HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths);
      HRESULT (WINAPI *SetMenu)(IOleInPlaceFrame *This,HMENU hmenuShared,HOLEMENU holemenu,HWND hwndActiveObject);
      HRESULT (WINAPI *RemoveMenus)(IOleInPlaceFrame *This,HMENU hmenuShared);
      HRESULT (WINAPI *SetStatusText)(IOleInPlaceFrame *This,LPCOLESTR pszStatusText);
      HRESULT (WINAPI *EnableModeless)(IOleInPlaceFrame *This,WINBOOL fEnable);
      HRESULT (WINAPI *TranslateAccelerator)(IOleInPlaceFrame *This,LPMSG lpmsg,WORD wID);
    END_INTERFACE
  } IOleInPlaceFrameVtbl;
  struct IOleInPlaceFrame {
    CONST_VTBL struct IOleInPlaceFrameVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleInPlaceFrame_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleInPlaceFrame_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleInPlaceFrame_Release(This) (This)->lpVtbl->Release(This)
#define IOleInPlaceFrame_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IOleInPlaceFrame_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
#define IOleInPlaceFrame_GetBorder(This,lprectBorder) (This)->lpVtbl->GetBorder(This,lprectBorder)
#define IOleInPlaceFrame_RequestBorderSpace(This,pborderwidths) (This)->lpVtbl->RequestBorderSpace(This,pborderwidths)
#define IOleInPlaceFrame_SetBorderSpace(This,pborderwidths) (This)->lpVtbl->SetBorderSpace(This,pborderwidths)
#define IOleInPlaceFrame_SetActiveObject(This,pActiveObject,pszObjName) (This)->lpVtbl->SetActiveObject(This,pActiveObject,pszObjName)
#define IOleInPlaceFrame_InsertMenus(This,hmenuShared,lpMenuWidths) (This)->lpVtbl->InsertMenus(This,hmenuShared,lpMenuWidths)
#define IOleInPlaceFrame_SetMenu(This,hmenuShared,holemenu,hwndActiveObject) (This)->lpVtbl->SetMenu(This,hmenuShared,holemenu,hwndActiveObject)
#define IOleInPlaceFrame_RemoveMenus(This,hmenuShared) (This)->lpVtbl->RemoveMenus(This,hmenuShared)
#define IOleInPlaceFrame_SetStatusText(This,pszStatusText) (This)->lpVtbl->SetStatusText(This,pszStatusText)
#define IOleInPlaceFrame_EnableModeless(This,fEnable) (This)->lpVtbl->EnableModeless(This,fEnable)
#define IOleInPlaceFrame_TranslateAccelerator(This,lpmsg,wID) (This)->lpVtbl->TranslateAccelerator(This,lpmsg,wID)
#endif
#endif
  HRESULT WINAPI IOleInPlaceFrame_InsertMenus_Proxy(IOleInPlaceFrame *This,HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths);
  void __RPC_STUB IOleInPlaceFrame_InsertMenus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceFrame_SetMenu_Proxy(IOleInPlaceFrame *This,HMENU hmenuShared,HOLEMENU holemenu,HWND hwndActiveObject);
  void __RPC_STUB IOleInPlaceFrame_SetMenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceFrame_RemoveMenus_Proxy(IOleInPlaceFrame *This,HMENU hmenuShared);
  void __RPC_STUB IOleInPlaceFrame_RemoveMenus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceFrame_SetStatusText_Proxy(IOleInPlaceFrame *This,LPCOLESTR pszStatusText);
  void __RPC_STUB IOleInPlaceFrame_SetStatusText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceFrame_EnableModeless_Proxy(IOleInPlaceFrame *This,WINBOOL fEnable);
  void __RPC_STUB IOleInPlaceFrame_EnableModeless_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceFrame_TranslateAccelerator_Proxy(IOleInPlaceFrame *This,LPMSG lpmsg,WORD wID);
  void __RPC_STUB IOleInPlaceFrame_TranslateAccelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleInPlaceObject_INTERFACE_DEFINED__
#define __IOleInPlaceObject_INTERFACE_DEFINED__
  typedef IOleInPlaceObject *LPOLEINPLACEOBJECT;

  EXTERN_C const IID IID_IOleInPlaceObject;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleInPlaceObject : public IOleWindow {
  public:
    virtual HRESULT WINAPI InPlaceDeactivate(void) = 0;
    virtual HRESULT WINAPI UIDeactivate(void) = 0;
    virtual HRESULT WINAPI SetObjectRects(LPCRECT lprcPosRect,LPCRECT lprcClipRect) = 0;
    virtual HRESULT WINAPI ReactivateAndUndo(void) = 0;
  };
#else
  typedef struct IOleInPlaceObjectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleInPlaceObject *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleInPlaceObject *This);
      ULONG (WINAPI *Release)(IOleInPlaceObject *This);
      HRESULT (WINAPI *GetWindow)(IOleInPlaceObject *This,HWND *phwnd);
      HRESULT (WINAPI *ContextSensitiveHelp)(IOleInPlaceObject *This,WINBOOL fEnterMode);
      HRESULT (WINAPI *InPlaceDeactivate)(IOleInPlaceObject *This);
      HRESULT (WINAPI *UIDeactivate)(IOleInPlaceObject *This);
      HRESULT (WINAPI *SetObjectRects)(IOleInPlaceObject *This,LPCRECT lprcPosRect,LPCRECT lprcClipRect);
      HRESULT (WINAPI *ReactivateAndUndo)(IOleInPlaceObject *This);
    END_INTERFACE
  } IOleInPlaceObjectVtbl;
  struct IOleInPlaceObject {
    CONST_VTBL struct IOleInPlaceObjectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleInPlaceObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleInPlaceObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleInPlaceObject_Release(This) (This)->lpVtbl->Release(This)
#define IOleInPlaceObject_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IOleInPlaceObject_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
#define IOleInPlaceObject_InPlaceDeactivate(This) (This)->lpVtbl->InPlaceDeactivate(This)
#define IOleInPlaceObject_UIDeactivate(This) (This)->lpVtbl->UIDeactivate(This)
#define IOleInPlaceObject_SetObjectRects(This,lprcPosRect,lprcClipRect) (This)->lpVtbl->SetObjectRects(This,lprcPosRect,lprcClipRect)
#define IOleInPlaceObject_ReactivateAndUndo(This) (This)->lpVtbl->ReactivateAndUndo(This)
#endif
#endif
  HRESULT WINAPI IOleInPlaceObject_InPlaceDeactivate_Proxy(IOleInPlaceObject *This);
  void __RPC_STUB IOleInPlaceObject_InPlaceDeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceObject_UIDeactivate_Proxy(IOleInPlaceObject *This);
  void __RPC_STUB IOleInPlaceObject_UIDeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceObject_SetObjectRects_Proxy(IOleInPlaceObject *This,LPCRECT lprcPosRect,LPCRECT lprcClipRect);
  void __RPC_STUB IOleInPlaceObject_SetObjectRects_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceObject_ReactivateAndUndo_Proxy(IOleInPlaceObject *This);
  void __RPC_STUB IOleInPlaceObject_ReactivateAndUndo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOleInPlaceSite_INTERFACE_DEFINED__
#define __IOleInPlaceSite_INTERFACE_DEFINED__
  typedef IOleInPlaceSite *LPOLEINPLACESITE;

  EXTERN_C const IID IID_IOleInPlaceSite;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleInPlaceSite : public IOleWindow {
  public:
    virtual HRESULT WINAPI CanInPlaceActivate(void) = 0;
    virtual HRESULT WINAPI OnInPlaceActivate(void) = 0;
    virtual HRESULT WINAPI OnUIActivate(void) = 0;
    virtual HRESULT WINAPI GetWindowContext(IOleInPlaceFrame **ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT lprcPosRect,LPRECT lprcClipRect,LPOLEINPLACEFRAMEINFO lpFrameInfo) = 0;
    virtual HRESULT WINAPI Scroll(SIZE scrollExtant) = 0;
    virtual HRESULT WINAPI OnUIDeactivate(WINBOOL fUndoable) = 0;
    virtual HRESULT WINAPI OnInPlaceDeactivate(void) = 0;
    virtual HRESULT WINAPI DiscardUndoState(void) = 0;
    virtual HRESULT WINAPI DeactivateAndUndo(void) = 0;
    virtual HRESULT WINAPI OnPosRectChange(LPCRECT lprcPosRect) = 0;
  };
#else
  typedef struct IOleInPlaceSiteVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleInPlaceSite *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleInPlaceSite *This);
      ULONG (WINAPI *Release)(IOleInPlaceSite *This);
      HRESULT (WINAPI *GetWindow)(IOleInPlaceSite *This,HWND *phwnd);
      HRESULT (WINAPI *ContextSensitiveHelp)(IOleInPlaceSite *This,WINBOOL fEnterMode);
      HRESULT (WINAPI *CanInPlaceActivate)(IOleInPlaceSite *This);
      HRESULT (WINAPI *OnInPlaceActivate)(IOleInPlaceSite *This);
      HRESULT (WINAPI *OnUIActivate)(IOleInPlaceSite *This);
      HRESULT (WINAPI *GetWindowContext)(IOleInPlaceSite *This,IOleInPlaceFrame **ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT lprcPosRect,LPRECT lprcClipRect,LPOLEINPLACEFRAMEINFO lpFrameInfo);
      HRESULT (WINAPI *Scroll)(IOleInPlaceSite *This,SIZE scrollExtant);
      HRESULT (WINAPI *OnUIDeactivate)(IOleInPlaceSite *This,WINBOOL fUndoable);
      HRESULT (WINAPI *OnInPlaceDeactivate)(IOleInPlaceSite *This);
      HRESULT (WINAPI *DiscardUndoState)(IOleInPlaceSite *This);
      HRESULT (WINAPI *DeactivateAndUndo)(IOleInPlaceSite *This);
      HRESULT (WINAPI *OnPosRectChange)(IOleInPlaceSite *This,LPCRECT lprcPosRect);
    END_INTERFACE
  } IOleInPlaceSiteVtbl;
  struct IOleInPlaceSite {
    CONST_VTBL struct IOleInPlaceSiteVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleInPlaceSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleInPlaceSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleInPlaceSite_Release(This) (This)->lpVtbl->Release(This)
#define IOleInPlaceSite_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IOleInPlaceSite_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
#define IOleInPlaceSite_CanInPlaceActivate(This) (This)->lpVtbl->CanInPlaceActivate(This)
#define IOleInPlaceSite_OnInPlaceActivate(This) (This)->lpVtbl->OnInPlaceActivate(This)
#define IOleInPlaceSite_OnUIActivate(This) (This)->lpVtbl->OnUIActivate(This)
#define IOleInPlaceSite_GetWindowContext(This,ppFrame,ppDoc,lprcPosRect,lprcClipRect,lpFrameInfo) (This)->lpVtbl->GetWindowContext(This,ppFrame,ppDoc,lprcPosRect,lprcClipRect,lpFrameInfo)
#define IOleInPlaceSite_Scroll(This,scrollExtant) (This)->lpVtbl->Scroll(This,scrollExtant)
#define IOleInPlaceSite_OnUIDeactivate(This,fUndoable) (This)->lpVtbl->OnUIDeactivate(This,fUndoable)
#define IOleInPlaceSite_OnInPlaceDeactivate(This) (This)->lpVtbl->OnInPlaceDeactivate(This)
#define IOleInPlaceSite_DiscardUndoState(This) (This)->lpVtbl->DiscardUndoState(This)
#define IOleInPlaceSite_DeactivateAndUndo(This) (This)->lpVtbl->DeactivateAndUndo(This)
#define IOleInPlaceSite_OnPosRectChange(This,lprcPosRect) (This)->lpVtbl->OnPosRectChange(This,lprcPosRect)
#endif
#endif
  HRESULT WINAPI IOleInPlaceSite_CanInPlaceActivate_Proxy(IOleInPlaceSite *This);
  void __RPC_STUB IOleInPlaceSite_CanInPlaceActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSite_OnInPlaceActivate_Proxy(IOleInPlaceSite *This);
  void __RPC_STUB IOleInPlaceSite_OnInPlaceActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSite_OnUIActivate_Proxy(IOleInPlaceSite *This);
  void __RPC_STUB IOleInPlaceSite_OnUIActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSite_GetWindowContext_Proxy(IOleInPlaceSite *This,IOleInPlaceFrame **ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT lprcPosRect,LPRECT lprcClipRect,LPOLEINPLACEFRAMEINFO lpFrameInfo);
  void __RPC_STUB IOleInPlaceSite_GetWindowContext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSite_Scroll_Proxy(IOleInPlaceSite *This,SIZE scrollExtant);
  void __RPC_STUB IOleInPlaceSite_Scroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSite_OnUIDeactivate_Proxy(IOleInPlaceSite *This,WINBOOL fUndoable);
  void __RPC_STUB IOleInPlaceSite_OnUIDeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSite_OnInPlaceDeactivate_Proxy(IOleInPlaceSite *This);
  void __RPC_STUB IOleInPlaceSite_OnInPlaceDeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSite_DiscardUndoState_Proxy(IOleInPlaceSite *This);
  void __RPC_STUB IOleInPlaceSite_DiscardUndoState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSite_DeactivateAndUndo_Proxy(IOleInPlaceSite *This);
  void __RPC_STUB IOleInPlaceSite_DeactivateAndUndo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleInPlaceSite_OnPosRectChange_Proxy(IOleInPlaceSite *This,LPCRECT lprcPosRect);
  void __RPC_STUB IOleInPlaceSite_OnPosRectChange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IContinue_INTERFACE_DEFINED__
#define __IContinue_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IContinue;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IContinue : public IUnknown {
  public:
    virtual HRESULT WINAPI FContinue(void) = 0;
  };
#else
  typedef struct IContinueVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IContinue *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IContinue *This);
      ULONG (WINAPI *Release)(IContinue *This);
      HRESULT (WINAPI *FContinue)(IContinue *This);
    END_INTERFACE
  } IContinueVtbl;
  struct IContinue {
    CONST_VTBL struct IContinueVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IContinue_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IContinue_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IContinue_Release(This) (This)->lpVtbl->Release(This)
#define IContinue_FContinue(This) (This)->lpVtbl->FContinue(This)
#endif
#endif
  HRESULT WINAPI IContinue_FContinue_Proxy(IContinue *This);
  void __RPC_STUB IContinue_FContinue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IViewObject_INTERFACE_DEFINED__
#define __IViewObject_INTERFACE_DEFINED__
  typedef IViewObject *LPVIEWOBJECT;

  EXTERN_C const IID IID_IViewObject;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IViewObject : public IUnknown {
  public:
    virtual HRESULT WINAPI Draw(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) = 0;
    virtual HRESULT WINAPI GetColorSet(DWORD dwDrawAspect,LONG lindex,void *pvAspect,DVTARGETDEVICE *ptd,HDC hicTargetDev,LOGPALETTE **ppColorSet) = 0;
    virtual HRESULT WINAPI Freeze(DWORD dwDrawAspect,LONG lindex,void *pvAspect,DWORD *pdwFreeze) = 0;
    virtual HRESULT WINAPI Unfreeze(DWORD dwFreeze) = 0;
    virtual HRESULT WINAPI SetAdvise(DWORD aspects,DWORD advf,IAdviseSink *pAdvSink) = 0;
    virtual HRESULT WINAPI GetAdvise(DWORD *pAspects,DWORD *pAdvf,IAdviseSink **ppAdvSink) = 0;
  };
#else
  typedef struct IViewObjectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IViewObject *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IViewObject *This);
      ULONG (WINAPI *Release)(IViewObject *This);
      HRESULT (WINAPI *Draw)(IViewObject *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)(IViewObject *This,DWORD dwDrawAspect,LONG lindex,void *pvAspect,DVTARGETDEVICE *ptd,HDC hicTargetDev,LOGPALETTE **ppColorSet);
      HRESULT (WINAPI *Freeze)(IViewObject *This,DWORD dwDrawAspect,LONG lindex,void *pvAspect,DWORD *pdwFreeze);
      HRESULT (WINAPI *Unfreeze)(IViewObject *This,DWORD dwFreeze);
      HRESULT (WINAPI *SetAdvise)(IViewObject *This,DWORD aspects,DWORD advf,IAdviseSink *pAdvSink);
      HRESULT (WINAPI *GetAdvise)(IViewObject *This,DWORD *pAspects,DWORD *pAdvf,IAdviseSink **ppAdvSink);
    END_INTERFACE
  } IViewObjectVtbl;
  struct IViewObject {
    CONST_VTBL struct IViewObjectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IViewObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IViewObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IViewObject_Release(This) (This)->lpVtbl->Release(This)
#define IViewObject_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 IViewObject_GetColorSet(This,dwDrawAspect,lindex,pvAspect,ptd,hicTargetDev,ppColorSet) (This)->lpVtbl->GetColorSet(This,dwDrawAspect,lindex,pvAspect,ptd,hicTargetDev,ppColorSet)
#define IViewObject_Freeze(This,dwDrawAspect,lindex,pvAspect,pdwFreeze) (This)->lpVtbl->Freeze(This,dwDrawAspect,lindex,pvAspect,pdwFreeze)
#define IViewObject_Unfreeze(This,dwFreeze) (This)->lpVtbl->Unfreeze(This,dwFreeze)
#define IViewObject_SetAdvise(This,aspects,advf,pAdvSink) (This)->lpVtbl->SetAdvise(This,aspects,advf,pAdvSink)
#define IViewObject_GetAdvise(This,pAspects,pAdvf,ppAdvSink) (This)->lpVtbl->GetAdvise(This,pAspects,pAdvf,ppAdvSink)
#endif
#endif
  HRESULT WINAPI IViewObject_RemoteDraw_Proxy(IViewObject *This,DWORD dwDrawAspect,LONG lindex,ULONG_PTR pvAspect,DVTARGETDEVICE *ptd,ULONG_PTR hdcTargetDev,ULONG_PTR hdcDraw,LPCRECTL lprcBounds,LPCRECTL lprcWBounds,IContinue *pContinue);
  void __RPC_STUB IViewObject_RemoteDraw_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IViewObject_RemoteGetColorSet_Proxy(IViewObject *This,DWORD dwDrawAspect,LONG lindex,ULONG_PTR pvAspect,DVTARGETDEVICE *ptd,ULONG_PTR hicTargetDev,LOGPALETTE **ppColorSet);
  void __RPC_STUB IViewObject_RemoteGetColorSet_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IViewObject_RemoteFreeze_Proxy(IViewObject *This,DWORD dwDrawAspect,LONG lindex,ULONG_PTR pvAspect,DWORD *pdwFreeze);
  void __RPC_STUB IViewObject_RemoteFreeze_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IViewObject_Unfreeze_Proxy(IViewObject *This,DWORD dwFreeze);
  void __RPC_STUB IViewObject_Unfreeze_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IViewObject_SetAdvise_Proxy(IViewObject *This,DWORD aspects,DWORD advf,IAdviseSink *pAdvSink);
  void __RPC_STUB IViewObject_SetAdvise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IViewObject_RemoteGetAdvise_Proxy(IViewObject *This,DWORD *pAspects,DWORD *pAdvf,IAdviseSink **ppAdvSink);
  void __RPC_STUB IViewObject_RemoteGetAdvise_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IViewObject2_INTERFACE_DEFINED__
#define __IViewObject2_INTERFACE_DEFINED__
  typedef IViewObject2 *LPVIEWOBJECT2;

  EXTERN_C const IID IID_IViewObject2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IViewObject2 : public IViewObject {
  public:
    virtual HRESULT WINAPI GetExtent(DWORD dwDrawAspect,LONG lindex,DVTARGETDEVICE *ptd,LPSIZEL lpsizel) = 0;
  };
#else
  typedef struct IViewObject2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IViewObject2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IViewObject2 *This);
      ULONG (WINAPI *Release)(IViewObject2 *This);
      HRESULT (WINAPI *Draw)(IViewObject2 *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)(IViewObject2 *This,DWORD dwDrawAspect,LONG lindex,void *pvAspect,DVTARGETDEVICE *ptd,HDC hicTargetDev,LOGPALETTE **ppColorSet);
      HRESULT (WINAPI *Freeze)(IViewObject2 *This,DWORD dwDrawAspect,LONG lindex,void *pvAspect,DWORD *pdwFreeze);
      HRESULT (WINAPI *Unfreeze)(IViewObject2 *This,DWORD dwFreeze);
      HRESULT (WINAPI *SetAdvise)(IViewObject2 *This,DWORD aspects,DWORD advf,IAdviseSink *pAdvSink);
      HRESULT (WINAPI *GetAdvise)(IViewObject2 *This,DWORD *pAspects,DWORD *pAdvf,IAdviseSink **ppAdvSink);
      HRESULT (WINAPI *GetExtent)(IViewObject2 *This,DWORD dwDrawAspect,LONG lindex,DVTARGETDEVICE *ptd,LPSIZEL lpsizel);
    END_INTERFACE
  } IViewObject2Vtbl;
  struct IViewObject2 {
    CONST_VTBL struct IViewObject2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IViewObject2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IViewObject2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IViewObject2_Release(This) (This)->lpVtbl->Release(This)
#define IViewObject2_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 IViewObject2_GetColorSet(This,dwDrawAspect,lindex,pvAspect,ptd,hicTargetDev,ppColorSet) (This)->lpVtbl->GetColorSet(This,dwDrawAspect,lindex,pvAspect,ptd,hicTargetDev,ppColorSet)
#define IViewObject2_Freeze(This,dwDrawAspect,lindex,pvAspect,pdwFreeze) (This)->lpVtbl->Freeze(This,dwDrawAspect,lindex,pvAspect,pdwFreeze)
#define IViewObject2_Unfreeze(This,dwFreeze) (This)->lpVtbl->Unfreeze(This,dwFreeze)
#define IViewObject2_SetAdvise(This,aspects,advf,pAdvSink) (This)->lpVtbl->SetAdvise(This,aspects,advf,pAdvSink)
#define IViewObject2_GetAdvise(This,pAspects,pAdvf,ppAdvSink) (This)->lpVtbl->GetAdvise(This,pAspects,pAdvf,ppAdvSink)
#define IViewObject2_GetExtent(This,dwDrawAspect,lindex,ptd,lpsizel) (This)->lpVtbl->GetExtent(This,dwDrawAspect,lindex,ptd,lpsizel)
#endif
#endif
  HRESULT WINAPI IViewObject2_GetExtent_Proxy(IViewObject2 *This,DWORD dwDrawAspect,LONG lindex,DVTARGETDEVICE *ptd,LPSIZEL lpsizel);
  void __RPC_STUB IViewObject2_GetExtent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IDropSource_INTERFACE_DEFINED__
#define __IDropSource_INTERFACE_DEFINED__
  typedef IDropSource *LPDROPSOURCE;

  EXTERN_C const IID IID_IDropSource;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IDropSource : public IUnknown {
  public:
    virtual HRESULT WINAPI QueryContinueDrag(WINBOOL fEscapePressed,DWORD grfKeyState) = 0;
    virtual HRESULT WINAPI GiveFeedback(DWORD dwEffect) = 0;
  };
#else
  typedef struct IDropSourceVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IDropSource *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IDropSource *This);
      ULONG (WINAPI *Release)(IDropSource *This);
      HRESULT (WINAPI *QueryContinueDrag)(IDropSource *This,WINBOOL fEscapePressed,DWORD grfKeyState);
      HRESULT (WINAPI *GiveFeedback)(IDropSource *This,DWORD dwEffect);
    END_INTERFACE
  } IDropSourceVtbl;
  struct IDropSource {
    CONST_VTBL struct IDropSourceVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IDropSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDropSource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDropSource_Release(This) (This)->lpVtbl->Release(This)
#define IDropSource_QueryContinueDrag(This,fEscapePressed,grfKeyState) (This)->lpVtbl->QueryContinueDrag(This,fEscapePressed,grfKeyState)
#define IDropSource_GiveFeedback(This,dwEffect) (This)->lpVtbl->GiveFeedback(This,dwEffect)
#endif
#endif
  HRESULT WINAPI IDropSource_QueryContinueDrag_Proxy(IDropSource *This,WINBOOL fEscapePressed,DWORD grfKeyState);
  void __RPC_STUB IDropSource_QueryContinueDrag_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDropSource_GiveFeedback_Proxy(IDropSource *This,DWORD dwEffect);
  void __RPC_STUB IDropSource_GiveFeedback_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IDropTarget_INTERFACE_DEFINED__
#define __IDropTarget_INTERFACE_DEFINED__
  typedef IDropTarget *LPDROPTARGET;

#define MK_ALT (0x20)

#define DROPEFFECT_NONE (0)
#define DROPEFFECT_COPY (1)
#define DROPEFFECT_MOVE (2)
#define DROPEFFECT_LINK (4)
#define DROPEFFECT_SCROLL (0x80000000)
#define DD_DEFSCROLLINSET (11)
#define DD_DEFSCROLLDELAY (50)
#define DD_DEFSCROLLINTERVAL (50)
#define DD_DEFDRAGDELAY (200)
#define DD_DEFDRAGMINDIST (2)

  EXTERN_C const IID IID_IDropTarget;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IDropTarget : public IUnknown {
  public:
    virtual HRESULT WINAPI DragEnter(IDataObject *pDataObj,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect) = 0;
    virtual HRESULT WINAPI DragOver(DWORD grfKeyState,POINTL pt,DWORD *pdwEffect) = 0;
    virtual HRESULT WINAPI DragLeave(void) = 0;
    virtual HRESULT WINAPI Drop(IDataObject *pDataObj,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect) = 0;
  };
#else
  typedef struct IDropTargetVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IDropTarget *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IDropTarget *This);
      ULONG (WINAPI *Release)(IDropTarget *This);
      HRESULT (WINAPI *DragEnter)(IDropTarget *This,IDataObject *pDataObj,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect);
      HRESULT (WINAPI *DragOver)(IDropTarget *This,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect);
      HRESULT (WINAPI *DragLeave)(IDropTarget *This);
      HRESULT (WINAPI *Drop)(IDropTarget *This,IDataObject *pDataObj,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect);
    END_INTERFACE
  } IDropTargetVtbl;
  struct IDropTarget {
    CONST_VTBL struct IDropTargetVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IDropTarget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDropTarget_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDropTarget_Release(This) (This)->lpVtbl->Release(This)
#define IDropTarget_DragEnter(This,pDataObj,grfKeyState,pt,pdwEffect) (This)->lpVtbl->DragEnter(This,pDataObj,grfKeyState,pt,pdwEffect)
#define IDropTarget_DragOver(This,grfKeyState,pt,pdwEffect) (This)->lpVtbl->DragOver(This,grfKeyState,pt,pdwEffect)
#define IDropTarget_DragLeave(This) (This)->lpVtbl->DragLeave(This)
#define IDropTarget_Drop(This,pDataObj,grfKeyState,pt,pdwEffect) (This)->lpVtbl->Drop(This,pDataObj,grfKeyState,pt,pdwEffect)
#endif
#endif
  HRESULT WINAPI IDropTarget_DragEnter_Proxy(IDropTarget *This,IDataObject *pDataObj,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect);
  void __RPC_STUB IDropTarget_DragEnter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDropTarget_DragOver_Proxy(IDropTarget *This,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect);
  void __RPC_STUB IDropTarget_DragOver_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDropTarget_DragLeave_Proxy(IDropTarget *This);
  void __RPC_STUB IDropTarget_DragLeave_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDropTarget_Drop_Proxy(IDropTarget *This,IDataObject *pDataObj,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect);
  void __RPC_STUB IDropTarget_Drop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumOLEVERB_INTERFACE_DEFINED__
#define __IEnumOLEVERB_INTERFACE_DEFINED__
  typedef IEnumOLEVERB *LPENUMOLEVERB;

  typedef struct tagOLEVERB {
    LONG lVerb;
    LPOLESTR lpszVerbName;
    DWORD fuFlags;
    DWORD grfAttribs;
  } OLEVERB;

  typedef struct tagOLEVERB *LPOLEVERB;

  typedef enum tagOLEVERBATTRIB {
    OLEVERBATTRIB_NEVERDIRTIES = 1,OLEVERBATTRIB_ONCONTAINERMENU = 2
  } OLEVERBATTRIB;

  EXTERN_C const IID IID_IEnumOLEVERB;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumOLEVERB : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(ULONG celt,LPOLEVERB rgelt,ULONG *pceltFetched) = 0;
    virtual HRESULT WINAPI Skip(ULONG celt) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Clone(IEnumOLEVERB **ppenum) = 0;
  };
#else
  typedef struct IEnumOLEVERBVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumOLEVERB *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumOLEVERB *This);
      ULONG (WINAPI *Release)(IEnumOLEVERB *This);
      HRESULT (WINAPI *Next)(IEnumOLEVERB *This,ULONG celt,LPOLEVERB rgelt,ULONG *pceltFetched);
      HRESULT (WINAPI *Skip)(IEnumOLEVERB *This,ULONG celt);
      HRESULT (WINAPI *Reset)(IEnumOLEVERB *This);
      HRESULT (WINAPI *Clone)(IEnumOLEVERB *This,IEnumOLEVERB **ppenum);
    END_INTERFACE
  } IEnumOLEVERBVtbl;
  struct IEnumOLEVERB {
    CONST_VTBL struct IEnumOLEVERBVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumOLEVERB_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumOLEVERB_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumOLEVERB_Release(This) (This)->lpVtbl->Release(This)
#define IEnumOLEVERB_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumOLEVERB_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumOLEVERB_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumOLEVERB_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#endif
#endif
  HRESULT WINAPI IEnumOLEVERB_RemoteNext_Proxy(IEnumOLEVERB *This,ULONG celt,LPOLEVERB rgelt,ULONG *pceltFetched);
  void __RPC_STUB IEnumOLEVERB_RemoteNext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumOLEVERB_Skip_Proxy(IEnumOLEVERB *This,ULONG celt);
  void __RPC_STUB IEnumOLEVERB_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumOLEVERB_Reset_Proxy(IEnumOLEVERB *This);
  void __RPC_STUB IEnumOLEVERB_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumOLEVERB_Clone_Proxy(IEnumOLEVERB *This,IEnumOLEVERB **ppenum);
  void __RPC_STUB IEnumOLEVERB_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  unsigned long __RPC_API CLIPFORMAT_UserSize(unsigned long *,unsigned long,CLIPFORMAT *);
  unsigned char *__RPC_API CLIPFORMAT_UserMarshal(unsigned long *,unsigned char *,CLIPFORMAT *);
  unsigned char *__RPC_API CLIPFORMAT_UserUnmarshal(unsigned long *,unsigned char *,CLIPFORMAT *);
  void __RPC_API CLIPFORMAT_UserFree(unsigned long *,CLIPFORMAT *);
  unsigned long __RPC_API HACCEL_UserSize(unsigned long *,unsigned long,HACCEL *);
  unsigned char *__RPC_API HACCEL_UserMarshal(unsigned long *,unsigned char *,HACCEL *);
  unsigned char *__RPC_API HACCEL_UserUnmarshal(unsigned long *,unsigned char *,HACCEL *);
  void __RPC_API HACCEL_UserFree(unsigned long *,HACCEL *);
  unsigned long __RPC_API HGLOBAL_UserSize(unsigned long *,unsigned long,HGLOBAL *);
  unsigned char *__RPC_API HGLOBAL_UserMarshal(unsigned long *,unsigned char *,HGLOBAL *);
  unsigned char *__RPC_API HGLOBAL_UserUnmarshal(unsigned long *,unsigned char *,HGLOBAL *);
  void __RPC_API HGLOBAL_UserFree(unsigned long *,HGLOBAL *);
  unsigned long __RPC_API HMENU_UserSize(unsigned long *,unsigned long,HMENU *);
  unsigned char *__RPC_API HMENU_UserMarshal(unsigned long *,unsigned char *,HMENU *);
  unsigned char *__RPC_API HMENU_UserUnmarshal(unsigned long *,unsigned char *,HMENU *);
  void __RPC_API HMENU_UserFree(unsigned long *,HMENU *);
  unsigned long __RPC_API HWND_UserSize(unsigned long *,unsigned long,HWND *);
  unsigned char *__RPC_API HWND_UserMarshal(unsigned long *,unsigned char *,HWND *);
  unsigned char *__RPC_API HWND_UserUnmarshal(unsigned long *,unsigned char *,HWND *);
  void __RPC_API HWND_UserFree(unsigned long *,HWND *);
  unsigned long __RPC_API STGMEDIUM_UserSize(unsigned long *,unsigned long,STGMEDIUM *);
  unsigned char *__RPC_API STGMEDIUM_UserMarshal(unsigned long *,unsigned char *,STGMEDIUM *);
  unsigned char *__RPC_API STGMEDIUM_UserUnmarshal(unsigned long *,unsigned char *,STGMEDIUM *);
  void __RPC_API STGMEDIUM_UserFree(unsigned long *,STGMEDIUM *);

  HRESULT WINAPI IOleCache2_UpdateCache_Proxy(IOleCache2 *This,LPDATAOBJECT pDataObject,DWORD grfUpdf,LPVOID pReserved);
  HRESULT WINAPI IOleCache2_UpdateCache_Stub(IOleCache2 *This,LPDATAOBJECT pDataObject,DWORD grfUpdf,LONG_PTR pReserved);
  HRESULT WINAPI IOleInPlaceActiveObject_TranslateAccelerator_Proxy(IOleInPlaceActiveObject *This,LPMSG lpmsg);
  HRESULT WINAPI IOleInPlaceActiveObject_TranslateAccelerator_Stub(IOleInPlaceActiveObject *This);
  HRESULT WINAPI IOleInPlaceActiveObject_ResizeBorder_Proxy(IOleInPlaceActiveObject *This,LPCRECT prcBorder,IOleInPlaceUIWindow *pUIWindow,WINBOOL fFrameWindow);
  HRESULT WINAPI IOleInPlaceActiveObject_ResizeBorder_Stub(IOleInPlaceActiveObject *This,LPCRECT prcBorder,REFIID riid,IOleInPlaceUIWindow *pUIWindow,WINBOOL fFrameWindow);
  HRESULT WINAPI IViewObject_Draw_Proxy(IViewObject *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 IViewObject_Draw_Stub(IViewObject *This,DWORD dwDrawAspect,LONG lindex,ULONG_PTR pvAspect,DVTARGETDEVICE *ptd,ULONG_PTR hdcTargetDev,ULONG_PTR hdcDraw,LPCRECTL lprcBounds,LPCRECTL lprcWBounds,IContinue *pContinue);
  HRESULT WINAPI IViewObject_GetColorSet_Proxy(IViewObject *This,DWORD dwDrawAspect,LONG lindex,void *pvAspect,DVTARGETDEVICE *ptd,HDC hicTargetDev,LOGPALETTE **ppColorSet);
  HRESULT WINAPI IViewObject_GetColorSet_Stub(IViewObject *This,DWORD dwDrawAspect,LONG lindex,ULONG_PTR pvAspect,DVTARGETDEVICE *ptd,ULONG_PTR hicTargetDev,LOGPALETTE **ppColorSet);
  HRESULT WINAPI IViewObject_Freeze_Proxy(IViewObject *This,DWORD dwDrawAspect,LONG lindex,void *pvAspect,DWORD *pdwFreeze);
  HRESULT WINAPI IViewObject_Freeze_Stub(IViewObject *This,DWORD dwDrawAspect,LONG lindex,ULONG_PTR pvAspect,DWORD *pdwFreeze);
  HRESULT WINAPI IViewObject_GetAdvise_Proxy(IViewObject *This,DWORD *pAspects,DWORD *pAdvf,IAdviseSink **ppAdvSink);
  HRESULT WINAPI IViewObject_GetAdvise_Stub(IViewObject *This,DWORD *pAspects,DWORD *pAdvf,IAdviseSink **ppAdvSink);
  HRESULT WINAPI IEnumOLEVERB_Next_Proxy(IEnumOLEVERB *This,ULONG celt,LPOLEVERB rgelt,ULONG *pceltFetched);
  HRESULT WINAPI IEnumOLEVERB_Next_Stub(IEnumOLEVERB *This,ULONG celt,LPOLEVERB rgelt,ULONG *pceltFetched);
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __oleidl_h__ */
