/*** Autogenerated by WIDL 1.5.25 from include/docobj.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 __docobj_h__
#define __docobj_h__

/* Forward declarations */

#ifndef __IOleCommandTarget_FWD_DEFINED__
#define __IOleCommandTarget_FWD_DEFINED__
typedef interface IOleCommandTarget IOleCommandTarget;
#endif

/* Headers for imported files */

#include <ocidl.h>
#include <objidl.h>
#include <oleidl.h>
#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __IOleDocument_FWD_DEFINED__
#define __IOleDocument_FWD_DEFINED__
typedef struct IOleDocument IOleDocument;
#endif

#ifndef __IOleDocumentSite_FWD_DEFINED__
#define __IOleDocumentSite_FWD_DEFINED__
typedef struct IOleDocumentSite IOleDocumentSite;
#endif

#ifndef __IOleDocumentView_FWD_DEFINED__
#define __IOleDocumentView_FWD_DEFINED__
typedef struct IOleDocumentView IOleDocumentView;
#endif

#ifndef __IEnumOleDocumentViews_FWD_DEFINED__
#define __IEnumOleDocumentViews_FWD_DEFINED__
typedef struct IEnumOleDocumentViews IEnumOleDocumentViews;
#endif

#ifndef __IContinueCallback_FWD_DEFINED__
#define __IContinueCallback_FWD_DEFINED__
typedef struct IContinueCallback IContinueCallback;
#endif

#ifndef __IPrint_FWD_DEFINED__
#define __IPrint_FWD_DEFINED__
typedef struct IPrint IPrint;
#endif

#ifndef _LPOLEDOCUMENT_DEFINED
#define _LPOLEDOCUMENT_DEFINED

  extern RPC_IF_HANDLE __MIDL_itf_docobj_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0000_v0_0_s_ifspec;

#ifndef __IOleDocument_INTERFACE_DEFINED__
#define __IOleDocument_INTERFACE_DEFINED__
  typedef IOleDocument *LPOLEDOCUMENT;
  typedef enum __MIDL_IOleDocument_0001 {
    DOCMISC_CANCREATEMULTIPLEVIEWS = 1,DOCMISC_SUPPORTCOMPLEXRECTANGLES = 2,DOCMISC_CANTOPENEDIT = 4,DOCMISC_NOFILESUPPORT = 8
  } DOCMISC;

  EXTERN_C const IID IID_IOleDocument;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleDocument : public IUnknown {
  public:
    virtual HRESULT WINAPI CreateView(IOleInPlaceSite *pIPSite,IStream *pstm,DWORD dwReserved,IOleDocumentView **ppView) = 0;
    virtual HRESULT WINAPI GetDocMiscStatus(DWORD *pdwStatus) = 0;
    virtual HRESULT WINAPI EnumViews(IEnumOleDocumentViews **ppEnum,IOleDocumentView **ppView) = 0;
  };
#else
  typedef struct IOleDocumentVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleDocument *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleDocument *This);
      ULONG (WINAPI *Release)(IOleDocument *This);
      HRESULT (WINAPI *CreateView)(IOleDocument *This,IOleInPlaceSite *pIPSite,IStream *pstm,DWORD dwReserved,IOleDocumentView **ppView);
      HRESULT (WINAPI *GetDocMiscStatus)(IOleDocument *This,DWORD *pdwStatus);
      HRESULT (WINAPI *EnumViews)(IOleDocument *This,IEnumOleDocumentViews **ppEnum,IOleDocumentView **ppView);
    END_INTERFACE
  } IOleDocumentVtbl;
  struct IOleDocument {
    CONST_VTBL struct IOleDocumentVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleDocument_Release(This) (This)->lpVtbl->Release(This)
#define IOleDocument_CreateView(This,pIPSite,pstm,dwReserved,ppView) (This)->lpVtbl->CreateView(This,pIPSite,pstm,dwReserved,ppView)
#define IOleDocument_GetDocMiscStatus(This,pdwStatus) (This)->lpVtbl->GetDocMiscStatus(This,pdwStatus)
#define IOleDocument_EnumViews(This,ppEnum,ppView) (This)->lpVtbl->EnumViews(This,ppEnum,ppView)
#endif
#endif
  HRESULT WINAPI IOleDocument_CreateView_Proxy(IOleDocument *This,IOleInPlaceSite *pIPSite,IStream *pstm,DWORD dwReserved,IOleDocumentView **ppView);
  void __RPC_STUB IOleDocument_CreateView_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocument_GetDocMiscStatus_Proxy(IOleDocument *This,DWORD *pdwStatus);
  void __RPC_STUB IOleDocument_GetDocMiscStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocument_EnumViews_Proxy(IOleDocument *This,IEnumOleDocumentViews **ppEnum,IOleDocumentView **ppView);
  void __RPC_STUB IOleDocument_EnumViews_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
#endif

#ifndef _LPOLEDOCUMENTSITE_DEFINED
#define _LPOLEDOCUMENTSITE_DEFINED
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0265_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0265_v0_0_s_ifspec;
#ifndef __IOleDocumentSite_INTERFACE_DEFINED__
#define __IOleDocumentSite_INTERFACE_DEFINED__
  typedef IOleDocumentSite *LPOLEDOCUMENTSITE;
  EXTERN_C const IID IID_IOleDocumentSite;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleDocumentSite : public IUnknown {
  public:
    virtual HRESULT WINAPI ActivateMe(IOleDocumentView *pViewToActivate) = 0;
  };
#else
  typedef struct IOleDocumentSiteVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleDocumentSite *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleDocumentSite *This);
      ULONG (WINAPI *Release)(IOleDocumentSite *This);
      HRESULT (WINAPI *ActivateMe)(IOleDocumentSite *This,IOleDocumentView *pViewToActivate);
    END_INTERFACE
  } IOleDocumentSiteVtbl;
  struct IOleDocumentSite {
    CONST_VTBL struct IOleDocumentSiteVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleDocumentSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleDocumentSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleDocumentSite_Release(This) (This)->lpVtbl->Release(This)
#define IOleDocumentSite_ActivateMe(This,pViewToActivate) (This)->lpVtbl->ActivateMe(This,pViewToActivate)
#endif
#endif
  HRESULT WINAPI IOleDocumentSite_ActivateMe_Proxy(IOleDocumentSite *This,IOleDocumentView *pViewToActivate);
  void __RPC_STUB IOleDocumentSite_ActivateMe_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
#endif

#ifndef _LPOLEDOCUMENTVIEW_DEFINED
#define _LPOLEDOCUMENTVIEW_DEFINED
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0266_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0266_v0_0_s_ifspec;

#ifndef __IOleDocumentView_INTERFACE_DEFINED__
#define __IOleDocumentView_INTERFACE_DEFINED__
  typedef IOleDocumentView *LPOLEDOCUMENTVIEW;
  EXTERN_C const IID IID_IOleDocumentView;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOleDocumentView : public IUnknown {
  public:
    virtual HRESULT WINAPI SetInPlaceSite(IOleInPlaceSite *pIPSite) = 0;
    virtual HRESULT WINAPI GetInPlaceSite(IOleInPlaceSite **ppIPSite) = 0;
    virtual HRESULT WINAPI GetDocument(IUnknown **ppunk) = 0;
    virtual HRESULT WINAPI SetRect(LPRECT prcView) = 0;
    virtual HRESULT WINAPI GetRect(LPRECT prcView) = 0;
    virtual HRESULT WINAPI SetRectComplex(LPRECT prcView,LPRECT prcHScroll,LPRECT prcVScroll,LPRECT prcSizeBox) = 0;
    virtual HRESULT WINAPI Show(WINBOOL fShow) = 0;
    virtual HRESULT WINAPI UIActivate(WINBOOL fUIActivate) = 0;
    virtual HRESULT WINAPI Open(void) = 0;
    virtual HRESULT WINAPI CloseView(DWORD dwReserved) = 0;
    virtual HRESULT WINAPI SaveViewState(LPSTREAM pstm) = 0;
    virtual HRESULT WINAPI ApplyViewState(LPSTREAM pstm) = 0;
    virtual HRESULT WINAPI Clone(IOleInPlaceSite *pIPSiteNew,IOleDocumentView **ppViewNew) = 0;
  };
#else
  typedef struct IOleDocumentViewVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOleDocumentView *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOleDocumentView *This);
      ULONG (WINAPI *Release)(IOleDocumentView *This);
      HRESULT (WINAPI *SetInPlaceSite)(IOleDocumentView *This,IOleInPlaceSite *pIPSite);
      HRESULT (WINAPI *GetInPlaceSite)(IOleDocumentView *This,IOleInPlaceSite **ppIPSite);
      HRESULT (WINAPI *GetDocument)(IOleDocumentView *This,IUnknown **ppunk);
      HRESULT (WINAPI *SetRect)(IOleDocumentView *This,LPRECT prcView);
      HRESULT (WINAPI *GetRect)(IOleDocumentView *This,LPRECT prcView);
      HRESULT (WINAPI *SetRectComplex)(IOleDocumentView *This,LPRECT prcView,LPRECT prcHScroll,LPRECT prcVScroll,LPRECT prcSizeBox);
      HRESULT (WINAPI *Show)(IOleDocumentView *This,WINBOOL fShow);
      HRESULT (WINAPI *UIActivate)(IOleDocumentView *This,WINBOOL fUIActivate);
      HRESULT (WINAPI *Open)(IOleDocumentView *This);
      HRESULT (WINAPI *CloseView)(IOleDocumentView *This,DWORD dwReserved);
      HRESULT (WINAPI *SaveViewState)(IOleDocumentView *This,LPSTREAM pstm);
      HRESULT (WINAPI *ApplyViewState)(IOleDocumentView *This,LPSTREAM pstm);
      HRESULT (WINAPI *Clone)(IOleDocumentView *This,IOleInPlaceSite *pIPSiteNew,IOleDocumentView **ppViewNew);
    END_INTERFACE
  } IOleDocumentViewVtbl;
  struct IOleDocumentView {
    CONST_VTBL struct IOleDocumentViewVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IOleDocumentView_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleDocumentView_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleDocumentView_Release(This) (This)->lpVtbl->Release(This)
#define IOleDocumentView_SetInPlaceSite(This,pIPSite) (This)->lpVtbl->SetInPlaceSite(This,pIPSite)
#define IOleDocumentView_GetInPlaceSite(This,ppIPSite) (This)->lpVtbl->GetInPlaceSite(This,ppIPSite)
#define IOleDocumentView_GetDocument(This,ppunk) (This)->lpVtbl->GetDocument(This,ppunk)
#define IOleDocumentView_SetRect(This,prcView) (This)->lpVtbl->SetRect(This,prcView)
#define IOleDocumentView_GetRect(This,prcView) (This)->lpVtbl->GetRect(This,prcView)
#define IOleDocumentView_SetRectComplex(This,prcView,prcHScroll,prcVScroll,prcSizeBox) (This)->lpVtbl->SetRectComplex(This,prcView,prcHScroll,prcVScroll,prcSizeBox)
#define IOleDocumentView_Show(This,fShow) (This)->lpVtbl->Show(This,fShow)
#define IOleDocumentView_UIActivate(This,fUIActivate) (This)->lpVtbl->UIActivate(This,fUIActivate)
#define IOleDocumentView_Open(This) (This)->lpVtbl->Open(This)
#define IOleDocumentView_CloseView(This,dwReserved) (This)->lpVtbl->CloseView(This,dwReserved)
#define IOleDocumentView_SaveViewState(This,pstm) (This)->lpVtbl->SaveViewState(This,pstm)
#define IOleDocumentView_ApplyViewState(This,pstm) (This)->lpVtbl->ApplyViewState(This,pstm)
#define IOleDocumentView_Clone(This,pIPSiteNew,ppViewNew) (This)->lpVtbl->Clone(This,pIPSiteNew,ppViewNew)
#endif
#endif
  HRESULT WINAPI IOleDocumentView_SetInPlaceSite_Proxy(IOleDocumentView *This,IOleInPlaceSite *pIPSite);
  void __RPC_STUB IOleDocumentView_SetInPlaceSite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_GetInPlaceSite_Proxy(IOleDocumentView *This,IOleInPlaceSite **ppIPSite);
  void __RPC_STUB IOleDocumentView_GetInPlaceSite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_GetDocument_Proxy(IOleDocumentView *This,IUnknown **ppunk);
  void __RPC_STUB IOleDocumentView_GetDocument_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_SetRect_Proxy(IOleDocumentView *This,LPRECT prcView);
  void __RPC_STUB IOleDocumentView_SetRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_GetRect_Proxy(IOleDocumentView *This,LPRECT prcView);
  void __RPC_STUB IOleDocumentView_GetRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_SetRectComplex_Proxy(IOleDocumentView *This,LPRECT prcView,LPRECT prcHScroll,LPRECT prcVScroll,LPRECT prcSizeBox);
  void __RPC_STUB IOleDocumentView_SetRectComplex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_Show_Proxy(IOleDocumentView *This,WINBOOL fShow);
  void __RPC_STUB IOleDocumentView_Show_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_UIActivate_Proxy(IOleDocumentView *This,WINBOOL fUIActivate);
  void __RPC_STUB IOleDocumentView_UIActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_Open_Proxy(IOleDocumentView *This);
  void __RPC_STUB IOleDocumentView_Open_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_CloseView_Proxy(IOleDocumentView *This,DWORD dwReserved);
  void __RPC_STUB IOleDocumentView_CloseView_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_SaveViewState_Proxy(IOleDocumentView *This,LPSTREAM pstm);
  void __RPC_STUB IOleDocumentView_SaveViewState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_ApplyViewState_Proxy(IOleDocumentView *This,LPSTREAM pstm);
  void __RPC_STUB IOleDocumentView_ApplyViewState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOleDocumentView_Clone_Proxy(IOleDocumentView *This,IOleInPlaceSite *pIPSiteNew,IOleDocumentView **ppViewNew);
  void __RPC_STUB IOleDocumentView_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
#endif

#ifndef _LPENUMOLEDOCUMENTVIEWS_DEFINED
#define _LPENUMOLEDOCUMENTVIEWS_DEFINED
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0267_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0267_v0_0_s_ifspec;
#ifndef __IEnumOleDocumentViews_INTERFACE_DEFINED__
#define __IEnumOleDocumentViews_INTERFACE_DEFINED__
  typedef IEnumOleDocumentViews *LPENUMOLEDOCUMENTVIEWS;
  EXTERN_C const IID IID_IEnumOleDocumentViews;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumOleDocumentViews : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(ULONG cViews,IOleDocumentView **rgpView,ULONG *pcFetched) = 0;
    virtual HRESULT WINAPI Skip(ULONG cViews) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Clone(IEnumOleDocumentViews **ppEnum) = 0;
  };
#else
  typedef struct IEnumOleDocumentViewsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumOleDocumentViews *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumOleDocumentViews *This);
      ULONG (WINAPI *Release)(IEnumOleDocumentViews *This);
      HRESULT (WINAPI *Next)(IEnumOleDocumentViews *This,ULONG cViews,IOleDocumentView **rgpView,ULONG *pcFetched);
      HRESULT (WINAPI *Skip)(IEnumOleDocumentViews *This,ULONG cViews);
      HRESULT (WINAPI *Reset)(IEnumOleDocumentViews *This);
      HRESULT (WINAPI *Clone)(IEnumOleDocumentViews *This,IEnumOleDocumentViews **ppEnum);
    END_INTERFACE
  } IEnumOleDocumentViewsVtbl;
  struct IEnumOleDocumentViews {
    CONST_VTBL struct IEnumOleDocumentViewsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumOleDocumentViews_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumOleDocumentViews_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumOleDocumentViews_Release(This) (This)->lpVtbl->Release(This)
#define IEnumOleDocumentViews_Next(This,cViews,rgpView,pcFetched) (This)->lpVtbl->Next(This,cViews,rgpView,pcFetched)
#define IEnumOleDocumentViews_Skip(This,cViews) (This)->lpVtbl->Skip(This,cViews)
#define IEnumOleDocumentViews_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumOleDocumentViews_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#endif
#endif
  HRESULT WINAPI IEnumOleDocumentViews_RemoteNext_Proxy(IEnumOleDocumentViews *This,ULONG cViews,IOleDocumentView **rgpView,ULONG *pcFetched);
  void __RPC_STUB IEnumOleDocumentViews_RemoteNext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumOleDocumentViews_Skip_Proxy(IEnumOleDocumentViews *This,ULONG cViews);
  void __RPC_STUB IEnumOleDocumentViews_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumOleDocumentViews_Reset_Proxy(IEnumOleDocumentViews *This);
  void __RPC_STUB IEnumOleDocumentViews_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumOleDocumentViews_Clone_Proxy(IEnumOleDocumentViews *This,IEnumOleDocumentViews **ppEnum);
  void __RPC_STUB IEnumOleDocumentViews_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
#endif

#ifndef _LPCONTINUECALLBACK_DEFINED
#define _LPCONTINUECALLBACK_DEFINED
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0268_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0268_v0_0_s_ifspec;
#ifndef __IContinueCallback_INTERFACE_DEFINED__
#define __IContinueCallback_INTERFACE_DEFINED__
  typedef IContinueCallback *LPCONTINUECALLBACK;
  EXTERN_C const IID IID_IContinueCallback;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IContinueCallback : public IUnknown {
  public:
    virtual HRESULT WINAPI FContinue(void) = 0;
    virtual HRESULT WINAPI FContinuePrinting(LONG nCntPrinted,LONG nCurPage,wchar_t *pwszPrintStatus) = 0;
  };
#else
  typedef struct IContinueCallbackVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IContinueCallback *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IContinueCallback *This);
      ULONG (WINAPI *Release)(IContinueCallback *This);
      HRESULT (WINAPI *FContinue)(IContinueCallback *This);
      HRESULT (WINAPI *FContinuePrinting)(IContinueCallback *This,LONG nCntPrinted,LONG nCurPage,wchar_t *pwszPrintStatus);
    END_INTERFACE
  } IContinueCallbackVtbl;
  struct IContinueCallback {
    CONST_VTBL struct IContinueCallbackVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IContinueCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IContinueCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IContinueCallback_Release(This) (This)->lpVtbl->Release(This)
#define IContinueCallback_FContinue(This) (This)->lpVtbl->FContinue(This)
#define IContinueCallback_FContinuePrinting(This,nCntPrinted,nCurPage,pwszPrintStatus) (This)->lpVtbl->FContinuePrinting(This,nCntPrinted,nCurPage,pwszPrintStatus)
#endif
#endif
  HRESULT WINAPI IContinueCallback_FContinue_Proxy(IContinueCallback *This);
  void __RPC_STUB IContinueCallback_FContinue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IContinueCallback_FContinuePrinting_Proxy(IContinueCallback *This,LONG nCntPrinted,LONG nCurPage,wchar_t *pwszPrintStatus);
  void __RPC_STUB IContinueCallback_FContinuePrinting_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
#endif

#ifndef _LPPRINT_DEFINED
#define _LPPRINT_DEFINED
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0269_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0269_v0_0_s_ifspec;
#ifndef __IPrint_INTERFACE_DEFINED__
#define __IPrint_INTERFACE_DEFINED__
  typedef IPrint *LPPRINT;
  typedef enum __MIDL_IPrint_0001 {
    PRINTFLAG_MAYBOTHERUSER = 1,PRINTFLAG_PROMPTUSER = 2,PRINTFLAG_USERMAYCHANGEPRINTER = 4,PRINTFLAG_RECOMPOSETODEVICE = 8,
    PRINTFLAG_DONTACTUALLYPRINT = 16,PRINTFLAG_FORCEPROPERTIES = 32,PRINTFLAG_PRINTTOFILE = 64
  } PRINTFLAG;
  typedef struct tagPAGERANGE {
    LONG nFromPage;
    LONG nToPage;
  } PAGERANGE;

  typedef struct tagPAGESET {
    ULONG cbStruct;
    WINBOOL fOddPages;
    WINBOOL fEvenPages;
    ULONG cPageRange;
    PAGERANGE rgPages[1 ];
  } PAGESET;
#define PAGESET_TOLASTPAGE ((WORD)(-1L))

  EXTERN_C const IID IID_IPrint;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPrint : public IUnknown {
  public:
    virtual HRESULT WINAPI SetInitialPageNum(LONG nFirstPage) = 0;
    virtual HRESULT WINAPI GetPageInfo(LONG *pnFirstPage,LONG *pcPages) = 0;
    virtual HRESULT WINAPI Print(DWORD grfFlags,DVTARGETDEVICE **pptd,PAGESET **ppPageSet,STGMEDIUM *pstgmOptions,IContinueCallback *pcallback,LONG nFirstPage,LONG *pcPagesPrinted,LONG *pnLastPage) = 0;
  };
#else
  typedef struct IPrintVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPrint *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPrint *This);
      ULONG (WINAPI *Release)(IPrint *This);
      HRESULT (WINAPI *SetInitialPageNum)(IPrint *This,LONG nFirstPage);
      HRESULT (WINAPI *GetPageInfo)(IPrint *This,LONG *pnFirstPage,LONG *pcPages);
      HRESULT (WINAPI *Print)(IPrint *This,DWORD grfFlags,DVTARGETDEVICE **pptd,PAGESET **ppPageSet,STGMEDIUM *pstgmOptions,IContinueCallback *pcallback,LONG nFirstPage,LONG *pcPagesPrinted,LONG *pnLastPage);
    END_INTERFACE
  } IPrintVtbl;
  struct IPrint {
    CONST_VTBL struct IPrintVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPrint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPrint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPrint_Release(This) (This)->lpVtbl->Release(This)
#define IPrint_SetInitialPageNum(This,nFirstPage) (This)->lpVtbl->SetInitialPageNum(This,nFirstPage)
#define IPrint_GetPageInfo(This,pnFirstPage,pcPages) (This)->lpVtbl->GetPageInfo(This,pnFirstPage,pcPages)
#define IPrint_Print(This,grfFlags,pptd,ppPageSet,pstgmOptions,pcallback,nFirstPage,pcPagesPrinted,pnLastPage) (This)->lpVtbl->Print(This,grfFlags,pptd,ppPageSet,pstgmOptions,pcallback,nFirstPage,pcPagesPrinted,pnLastPage)
#endif
#endif
  HRESULT WINAPI IPrint_SetInitialPageNum_Proxy(IPrint *This,LONG nFirstPage);
  void __RPC_STUB IPrint_SetInitialPageNum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPrint_GetPageInfo_Proxy(IPrint *This,LONG *pnFirstPage,LONG *pcPages);
  void __RPC_STUB IPrint_GetPageInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPrint_RemotePrint_Proxy(IPrint *This,DWORD grfFlags,DVTARGETDEVICE **pptd,PAGESET **pppageset,RemSTGMEDIUM *pstgmOptions,IContinueCallback *pcallback,LONG nFirstPage,LONG *pcPagesPrinted,LONG *pnLastPage);
  void __RPC_STUB IPrint_RemotePrint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
#endif
#ifndef _LPOLECOMMANDTARGET_DEFINED
#define _LPOLECOMMANDTARGET_DEFINED
/*****************************************************************************
 * IOleCommandTarget interface
 */
#ifndef __IOleCommandTarget_INTERFACE_DEFINED__
#define __IOleCommandTarget_INTERFACE_DEFINED__

typedef IOleCommandTarget *LPOLECOMMANDTARGET;
typedef enum OLECMDF {
    OLECMDF_SUPPORTED = 0x1,
    OLECMDF_ENABLED = 0x2,
    OLECMDF_LATCHED = 0x4,
    OLECMDF_NINCHED = 0x8,
    OLECMDF_INVISIBLE = 0x10,
    OLECMDF_DEFHIDEONCTXTMENU = 0x20
} OLECMDF;
typedef struct _tagOLECMD {
    ULONG cmdID;
    DWORD cmdf;
} OLECMD;
typedef struct _tagOLECMDTEXT {
    DWORD cmdtextf;
    ULONG cwActual;
    ULONG cwBuf;
    wchar_t rgwz[1];
} OLECMDTEXT;
typedef enum OLECMDTEXTF {
    OLECMDTEXTF_NONE = 0,
    OLECMDTEXTF_NAME = 1,
    OLECMDTEXTF_STATUS = 2
} OLECMDTEXTF;
typedef enum OLECMDEXECOPT {
    OLECMDEXECOPT_DODEFAULT = 0,
    OLECMDEXECOPT_PROMPTUSER = 1,
    OLECMDEXECOPT_DONTPROMPTUSER = 2,
    OLECMDEXECOPT_SHOWHELP = 3
} OLECMDEXECOPT;
typedef enum OLECMDID {
    OLECMDID_OPEN = 1,
    OLECMDID_NEW = 2,
    OLECMDID_SAVE = 3,
    OLECMDID_SAVEAS = 4,
    OLECMDID_SAVECOPYAS = 5,
    OLECMDID_PRINT = 6,
    OLECMDID_PRINTPREVIEW = 7,
    OLECMDID_PAGESETUP = 8,
    OLECMDID_SPELL = 9,
    OLECMDID_PROPERTIES = 10,
    OLECMDID_CUT = 11,
    OLECMDID_COPY = 12,
    OLECMDID_PASTE = 13,
    OLECMDID_PASTESPECIAL = 14,
    OLECMDID_UNDO = 15,
    OLECMDID_REDO = 16,
    OLECMDID_SELECTALL = 17,
    OLECMDID_CLEARSELECTION = 18,
    OLECMDID_ZOOM = 19,
    OLECMDID_GETZOOMRANGE = 20,
    OLECMDID_UPDATECOMMANDS = 21,
    OLECMDID_REFRESH = 22,
    OLECMDID_STOP = 23,
    OLECMDID_HIDETOOLBARS = 24,
    OLECMDID_SETPROGRESSMAX = 25,
    OLECMDID_SETPROGRESSPOS = 26,
    OLECMDID_SETPROGRESSTEXT = 27,
    OLECMDID_SETTITLE = 28,
    OLECMDID_SETDOWNLOADSTATE = 29,
    OLECMDID_STOPDOWNLOAD = 30,
    OLECMDID_ONTOOLBARACTIVATED = 31,
    OLECMDID_FIND = 32,
    OLECMDID_DELETE = 33,
    OLECMDID_HTTPEQUIV = 34,
    OLECMDID_HTTPEQUIV_DONE = 35,
    OLECMDID_ENABLE_INTERACTION = 36,
    OLECMDID_ONUNLOAD = 37,
    OLECMDID_PROPERTYBAG2 = 38,
    OLECMDID_PREREFRESH = 39,
    OLECMDID_SHOWSCRIPTERROR = 40,
    OLECMDID_SHOWMESSAGE = 41,
    OLECMDID_SHOWFIND = 42,
    OLECMDID_SHOWPAGESETUP = 43,
    OLECMDID_SHOWPRINT = 44,
    OLECMDID_CLOSE = 45,
    OLECMDID_ALLOWUILESSSAVEAS = 46,
    OLECMDID_DONTDOWNLOADCSS = 47,
    OLECMDID_UPDATEPAGESTATUS = 48,
    OLECMDID_PRINT2 = 49,
    OLECMDID_PRINTPREVIEW2 = 50,
    OLECMDID_SETPRINTTEMPLATE = 51,
    OLECMDID_GETPRINTTEMPLATE = 52,
    OLECMDID_PAGEACTIONBLOCKED = 55,
    OLECMDID_PAGEACTIONUIQUERY = 56,
    OLECMDID_FOCUSVIEWCONTROLS = 57,
    OLECMDID_FOCUSVIEWCONTROLSQUERY = 58,
    OLECMDID_SHOWPAGEACTIONMENU = 59,
    OLECMDID_ADDTRAVELENTRY = 60,
    OLECMDID_UPDATETRAVELENTRY = 61,
    OLECMDID_UPDATEBACKFORWARDSTATE = 62,
    OLECMDID_OPTICAL_ZOOM = 63,
    OLECMDID_OPTICAL_GETZOOMRANGE = 64,
    OLECMDID_WINDOWSTATECHANGED = 65,
    OLECMDID_ACTIVEXINSTALLSCOPE = 66,
    OLECMDID_UPDATETRAVELENTRY_DATARECOVERY = 67
} OLECMDID;
#define OLECMDERR_E_FIRST (OLE_E_LAST+1)
#define OLECMDERR_E_NOTSUPPORTED (OLECMDERR_E_FIRST)
#define OLECMDERR_E_DISABLED (OLECMDERR_E_FIRST+1)
#define OLECMDERR_E_NOHELP (OLECMDERR_E_FIRST+2)
#define OLECMDERR_E_CANCELED (OLECMDERR_E_FIRST+3)
#define OLECMDERR_E_UNKNOWNGROUP (OLECMDERR_E_FIRST+4)
#define MSOCMDERR_E_FIRST OLECMDERR_E_FIRST
#define MSOCMDERR_E_NOTSUPPORTED OLECMDERR_E_NOTSUPPORTED
#define MSOCMDERR_E_DISABLED OLECMDERR_E_DISABLED
#define MSOCMDERR_E_NOHELP OLECMDERR_E_NOHELP
#define MSOCMDERR_E_CANCELED OLECMDERR_E_CANCELED
#define MSOCMDERR_E_UNKNOWNGROUP OLECMDERR_E_UNKNOWNGROUP
#define OLECMDARGINDEX_SHOWPAGEACTIONMENU_HWND 0
#define OLECMDARGINDEX_SHOWPAGEACTIONMENU_X 1
#define OLECMDARGINDEX_SHOWPAGEACTIONMENU_Y 2
#define OLECMDARGINDEX_ACTIVEXINSTALL_PUBLISHER 0
#define OLECMDARGINDEX_ACTIVEXINSTALL_DISPLAYNAME 1
typedef enum IGNOREMIME {
    IGNOREMIME_PROMPT = 1,
    IGNOREMIME_TEXT = 2
} IGNOREMIME;
typedef enum WPCSETTING {
    WPCSETTING_LOGGING_ENABLED = 1,
    WPCSETTING_FILEDOWNLOAD_BLOCKED = 2
} WPCSETTING;
DEFINE_GUID(IID_IOleCommandTarget, 0xb722bccb, 0x4e68, 0x101b, 0xa2,0xbc, 0x00,0xaa,0x00,0x40,0x47,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b722bccb-4e68-101b-a2bc-00aa00404770")
IOleCommandTarget : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryStatus(
        const GUID *pguidCmdGroup,
        ULONG cCmds,
        OLECMD prgCmds[],
        OLECMDTEXT *pCmdText) = 0;

    virtual HRESULT STDMETHODCALLTYPE Exec(
        const GUID *pguidCmdGroup,
        DWORD nCmdID,
        DWORD nCmdexecopt,
        VARIANT *pvaIn,
        VARIANT *pvaOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOleCommandTarget, 0xb722bccb, 0x4e68, 0x101b, 0xa2,0xbc, 0x00,0xaa,0x00,0x40,0x47,0x70)
#endif
#else
typedef struct IOleCommandTargetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOleCommandTarget methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryStatus)(
        IOleCommandTarget* This,
        const GUID *pguidCmdGroup,
        ULONG cCmds,
        OLECMD prgCmds[],
        OLECMDTEXT *pCmdText);

    HRESULT (STDMETHODCALLTYPE *Exec)(
        IOleCommandTarget* This,
        const GUID *pguidCmdGroup,
        DWORD nCmdID,
        DWORD nCmdexecopt,
        VARIANT *pvaIn,
        VARIANT *pvaOut);

    END_INTERFACE
} IOleCommandTargetVtbl;
interface IOleCommandTarget {
    CONST_VTBL IOleCommandTargetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOleCommandTarget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOleCommandTarget_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOleCommandTarget_Release(This) (This)->lpVtbl->Release(This)
/*** IOleCommandTarget methods ***/
#define IOleCommandTarget_QueryStatus(This,pguidCmdGroup,cCmds,prgCmds,pCmdText) (This)->lpVtbl->QueryStatus(This,pguidCmdGroup,cCmds,prgCmds,pCmdText)
#define IOleCommandTarget_Exec(This,pguidCmdGroup,nCmdID,nCmdexecopt,pvaIn,pvaOut) (This)->lpVtbl->Exec(This,pguidCmdGroup,nCmdID,nCmdexecopt,pvaIn,pvaOut)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOleCommandTarget_QueryInterface(IOleCommandTarget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOleCommandTarget_AddRef(IOleCommandTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOleCommandTarget_Release(IOleCommandTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleCommandTarget methods ***/
static FORCEINLINE HRESULT IOleCommandTarget_QueryStatus(IOleCommandTarget* This,const GUID *pguidCmdGroup,ULONG cCmds,OLECMD prgCmds[],OLECMDTEXT *pCmdText) {
    return This->lpVtbl->QueryStatus(This,pguidCmdGroup,cCmds,prgCmds,pCmdText);
}
static FORCEINLINE HRESULT IOleCommandTarget_Exec(IOleCommandTarget* This,const GUID *pguidCmdGroup,DWORD nCmdID,DWORD nCmdexecopt,VARIANT *pvaIn,VARIANT *pvaOut) {
    return This->lpVtbl->Exec(This,pguidCmdGroup,nCmdID,nCmdexecopt,pvaIn,pvaOut);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOleCommandTarget_QueryStatus_Proxy(
    IOleCommandTarget* This,
    const GUID *pguidCmdGroup,
    ULONG cCmds,
    OLECMD prgCmds[],
    OLECMDTEXT *pCmdText);
void __RPC_STUB IOleCommandTarget_QueryStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOleCommandTarget_Exec_Proxy(
    IOleCommandTarget* This,
    const GUID *pguidCmdGroup,
    DWORD nCmdID,
    DWORD nCmdexecopt,
    VARIANT *pvaIn,
    VARIANT *pvaOut);
void __RPC_STUB IOleCommandTarget_Exec_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOleCommandTarget_INTERFACE_DEFINED__ */

#endif
  typedef enum {
    OLECMDIDF_REFRESH_NORMAL = 0,OLECMDIDF_REFRESH_IFEXPIRED = 1,OLECMDIDF_REFRESH_CONTINUE = 2,OLECMDIDF_REFRESH_COMPLETELY = 3,
    OLECMDIDF_REFRESH_NO_CACHE = 4,OLECMDIDF_REFRESH_RELOAD = 5,OLECMDIDF_REFRESH_LEVELMASK = 0x00FF,OLECMDIDF_REFRESH_CLEARUSERINPUT = 0x1000,
    OLECMDIDF_REFRESH_PROMPTIFOFFLINE = 0x2000,OLECMDIDF_REFRESH_THROUGHSCRIPT = 0x4000,OLECMDIDF_REFRESH_PAGEACTION_ACTIVEXINSTALL = 0x00010000,
    OLECMDIDF_REFRESH_PAGEACTION_FILEDOWNLOAD = 0x00020000,OLECMDIDF_REFRESH_PAGEACTION_LOCALMACHINE = 0x00040000,
    OLECMDIDF_REFRESH_PAGEACTION_POPUPWINDOW = 0x00080000,OLECMDIDF_REFRESH_PAGEACTION_PROTLOCKDOWNLOCALMACHINE = 0x00100000,
    OLECMDIDF_REFRESH_PAGEACTION_PROTLOCKDOWNTRUSTED = 0x00200000,OLECMDIDF_REFRESH_PAGEACTION_PROTLOCKDOWNINTRANET = 0x00400000,
    OLECMDIDF_REFRESH_PAGEACTION_PROTLOCKDOWNINTERNET = 0x00800000,OLECMDIDF_REFRESH_PAGEACTION_PROTLOCKDOWNRESTRICTED = 0x01000000
  } OLECMDID_REFRESHFLAG;

  typedef enum {
    OLECMDIDF_PAGEACTION_FILEDOWNLOAD = 0x00000001,OLECMDIDF_PAGEACTION_ACTIVEXINSTALL = 0x00000002,
    OLECMDIDF_PAGEACTION_ACTIVEXTRUSTFAIL = 0x00000004,OLECMDIDF_PAGEACTION_ACTIVEXUSERDISABLE = 0x00000008,
    OLECMDIDF_PAGEACTION_ACTIVEXDISALLOW = 0x00000010,OLECMDIDF_PAGEACTION_ACTIVEXUNSAFE = 0x00000020,OLECMDIDF_PAGEACTION_POPUPWINDOW = 0x00000040,
    OLECMDIDF_PAGEACTION_LOCALMACHINE = 0x00000080,OLECMDIDF_PAGEACTION_MIMETEXTPLAIN = 0x00000100,OLECMDIDF_PAGEACTION_SCRIPTNAVIGATE = 0x00000200,
    OLECMDIDF_PAGEACTION_PROTLOCKDOWNLOCALMACHINE = 0x00000400,OLECMDIDF_PAGEACTION_PROTLOCKDOWNTRUSTED = 0x00000800,
    OLECMDIDF_PAGEACTION_PROTLOCKDOWNINTRANET = 0x00001000,OLECMDIDF_PAGEACTION_PROTLOCKDOWNINTERNET = 0x00002000,
    OLECMDIDF_PAGEACTION_PROTLOCKDOWNRESTRICTED = 0x00004000,OLECMDIDF_PAGEACTION_PROTLOCKDOWNDENY = 0x00008000,
    OLECMDIDF_PAGEACTION_POPUPALLOWED = 0x00010000,OLECMDIDF_PAGEACTION_RESET = 0x80000000
  } OLECMDID_PAGEACTIONFLAG;

  typedef enum {
    PAGEACTION_UI_DEFAULT = 0,PAGEACTION_UI_MODAL = 1,PAGEACTION_UI_MODELESS = 2,PAGEACTION_UI_SILENT = 3
  } PAGEACTION_UI;

#define IMsoDocument IOleDocument
#define IMsoDocumentSite IOleDocumentSite
#define IMsoView IOleDocumentView
#define IEnumMsoView IEnumOleDocumentViews
#define IMsoCommandTarget IOleCommandTarget
#define LPMSODOCUMENT LPOLEDOCUMENT
#define LPMSODOCUMENTSITE LPOLEDOCUMENTSITE
#define LPMSOVIEW LPOLEDOCUMENTVIEW
#define LPENUMMSOVIEW LPENUMOLEDOCUMENTVIEWS
#define LPMSOCOMMANDTARGET LPOLECOMMANDTARGET
#define MSOCMD OLECMD
#define MSOCMDTEXT OLECMDTEXT
#define IID_IMsoDocument IID_IOleDocument
#define IID_IMsoDocumentSite IID_IOleDocumentSite
#define IID_IMsoView IID_IOleDocumentView
#define IID_IEnumMsoView IID_IEnumOleDocumentViews
#define IID_IMsoCommandTarget IID_IOleCommandTarget
#define MSOCMDF_SUPPORTED OLECMDF_SUPPORTED
#define MSOCMDF_ENABLED OLECMDF_ENABLED
#define MSOCMDF_LATCHED OLECMDF_LATCHED
#define MSOCMDF_NINCHED OLECMDF_NINCHED
#define MSOCMDTEXTF_NONE OLECMDTEXTF_NONE
#define MSOCMDTEXTF_NAME OLECMDTEXTF_NAME
#define MSOCMDTEXTF_STATUS OLECMDTEXTF_STATUS
#define MSOCMDEXECOPT_DODEFAULT OLECMDEXECOPT_DODEFAULT
#define MSOCMDEXECOPT_PROMPTUSER OLECMDEXECOPT_PROMPTUSER
#define MSOCMDEXECOPT_DONTPROMPTUSER OLECMDEXECOPT_DONTPROMPTUSER
#define MSOCMDEXECOPT_SHOWHELP OLECMDEXECOPT_SHOWHELP
#define MSOCMDID_OPEN OLECMDID_OPEN
#define MSOCMDID_NEW OLECMDID_NEW
#define MSOCMDID_SAVE OLECMDID_SAVE
#define MSOCMDID_SAVEAS OLECMDID_SAVEAS
#define MSOCMDID_SAVECOPYAS OLECMDID_SAVECOPYAS
#define MSOCMDID_PRINT OLECMDID_PRINT
#define MSOCMDID_PRINTPREVIEW OLECMDID_PRINTPREVIEW
#define MSOCMDID_PAGESETUP OLECMDID_PAGESETUP
#define MSOCMDID_SPELL OLECMDID_SPELL
#define MSOCMDID_PROPERTIES OLECMDID_PROPERTIES
#define MSOCMDID_CUT OLECMDID_CUT
#define MSOCMDID_COPY OLECMDID_COPY
#define MSOCMDID_PASTE OLECMDID_PASTE
#define MSOCMDID_PASTESPECIAL OLECMDID_PASTESPECIAL
#define MSOCMDID_UNDO OLECMDID_UNDO
#define MSOCMDID_REDO OLECMDID_REDO
#define MSOCMDID_SELECTALL OLECMDID_SELECTALL
#define MSOCMDID_CLEARSELECTION OLECMDID_CLEARSELECTION
#define MSOCMDID_ZOOM OLECMDID_ZOOM
#define MSOCMDID_GETZOOMRANGE OLECMDID_GETZOOMRANGE
  EXTERN_C const GUID SID_SContainerDispatch;

  extern RPC_IF_HANDLE __MIDL_itf_docobj_0271_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_docobj_0271_v0_0_s_ifspec;

  HRESULT WINAPI IEnumOleDocumentViews_Next_Proxy(IEnumOleDocumentViews *This,ULONG cViews,IOleDocumentView **rgpView,ULONG *pcFetched);
  HRESULT WINAPI IEnumOleDocumentViews_Next_Stub(IEnumOleDocumentViews *This,ULONG cViews,IOleDocumentView **rgpView,ULONG *pcFetched);
  HRESULT WINAPI IPrint_Print_Proxy(IPrint *This,DWORD grfFlags,DVTARGETDEVICE **pptd,PAGESET **ppPageSet,STGMEDIUM *pstgmOptions,IContinueCallback *pcallback,LONG nFirstPage,LONG *pcPagesPrinted,LONG *pnLastPage);
  HRESULT WINAPI IPrint_Print_Stub(IPrint *This,DWORD grfFlags,DVTARGETDEVICE **pptd,PAGESET **pppageset,RemSTGMEDIUM *pstgmOptions,IContinueCallback *pcallback,LONG nFirstPage,LONG *pcPagesPrinted,LONG *pnLastPage);
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __docobj_h__ */
