/*** Autogenerated by WIDL 6.0-rc3 from include/docobj.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __docobj_h__
#define __docobj_h__

/* Forward declarations */

#ifndef __IOleDocument_FWD_DEFINED__
#define __IOleDocument_FWD_DEFINED__
typedef interface IOleDocument IOleDocument;
#ifdef __cplusplus
interface IOleDocument;
#endif /* __cplusplus */
#endif

#ifndef __IOleDocumentSite_FWD_DEFINED__
#define __IOleDocumentSite_FWD_DEFINED__
typedef interface IOleDocumentSite IOleDocumentSite;
#ifdef __cplusplus
interface IOleDocumentSite;
#endif /* __cplusplus */
#endif

#ifndef __IOleDocumentView_FWD_DEFINED__
#define __IOleDocumentView_FWD_DEFINED__
typedef interface IOleDocumentView IOleDocumentView;
#ifdef __cplusplus
interface IOleDocumentView;
#endif /* __cplusplus */
#endif

#ifndef __IEnumOleDocumentViews_FWD_DEFINED__
#define __IEnumOleDocumentViews_FWD_DEFINED__
typedef interface IEnumOleDocumentViews IEnumOleDocumentViews;
#ifdef __cplusplus
interface IEnumOleDocumentViews;
#endif /* __cplusplus */
#endif

#ifndef __IContinueCallback_FWD_DEFINED__
#define __IContinueCallback_FWD_DEFINED__
typedef interface IContinueCallback IContinueCallback;
#ifdef __cplusplus
interface IContinueCallback;
#endif /* __cplusplus */
#endif

#ifndef __IPrint_FWD_DEFINED__
#define __IPrint_FWD_DEFINED__
typedef interface IPrint IPrint;
#ifdef __cplusplus
interface IPrint;
#endif /* __cplusplus */
#endif

#ifndef __IOleCommandTarget_FWD_DEFINED__
#define __IOleCommandTarget_FWD_DEFINED__
typedef interface IOleCommandTarget IOleCommandTarget;
#ifdef __cplusplus
interface IOleCommandTarget;
#endif /* __cplusplus */
#endif

#ifndef __IZoomEvents_FWD_DEFINED__
#define __IZoomEvents_FWD_DEFINED__
typedef interface IZoomEvents IZoomEvents;
#ifdef __cplusplus
interface IZoomEvents;
#endif /* __cplusplus */
#endif

#ifndef __IProtectFocus_FWD_DEFINED__
#define __IProtectFocus_FWD_DEFINED__
typedef interface IProtectFocus IProtectFocus;
#ifdef __cplusplus
interface IProtectFocus;
#endif /* __cplusplus */
#endif

#ifndef __IProtectedModeMenuServices_FWD_DEFINED__
#define __IProtectedModeMenuServices_FWD_DEFINED__
typedef interface IProtectedModeMenuServices IProtectedModeMenuServices;
#ifdef __cplusplus
interface IProtectedModeMenuServices;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

/**
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)


#ifndef __IOleDocument_FWD_DEFINED__
#define __IOleDocument_FWD_DEFINED__
typedef interface IOleDocument IOleDocument;
#ifdef __cplusplus
interface IOleDocument;
#endif /* __cplusplus */
#endif

#ifndef __IOleDocumentSite_FWD_DEFINED__
#define __IOleDocumentSite_FWD_DEFINED__
typedef interface IOleDocumentSite IOleDocumentSite;
#ifdef __cplusplus
interface IOleDocumentSite;
#endif /* __cplusplus */
#endif

#ifndef __IOleDocumentView_FWD_DEFINED__
#define __IOleDocumentView_FWD_DEFINED__
typedef interface IOleDocumentView IOleDocumentView;
#ifdef __cplusplus
interface IOleDocumentView;
#endif /* __cplusplus */
#endif

#ifndef __IEnumOleDocumentViews_FWD_DEFINED__
#define __IEnumOleDocumentViews_FWD_DEFINED__
typedef interface IEnumOleDocumentViews IEnumOleDocumentViews;
#ifdef __cplusplus
interface IEnumOleDocumentViews;
#endif /* __cplusplus */
#endif

#ifndef __IContinueCallback_FWD_DEFINED__
#define __IContinueCallback_FWD_DEFINED__
typedef interface IContinueCallback IContinueCallback;
#ifdef __cplusplus
interface IContinueCallback;
#endif /* __cplusplus */
#endif

#ifndef __IPrint_FWD_DEFINED__
#define __IPrint_FWD_DEFINED__
typedef interface IPrint IPrint;
#ifdef __cplusplus
interface IPrint;
#endif /* __cplusplus */
#endif

#ifndef __IOleCommandTarget_FWD_DEFINED__
#define __IOleCommandTarget_FWD_DEFINED__
typedef interface IOleCommandTarget IOleCommandTarget;
#ifdef __cplusplus
interface IOleCommandTarget;
#endif /* __cplusplus */
#endif

#ifndef __IProtectedModeMenuServices_FWD_DEFINED__
#define __IProtectedModeMenuServices_FWD_DEFINED__
typedef interface IProtectedModeMenuServices IProtectedModeMenuServices;
#ifdef __cplusplus
interface IProtectedModeMenuServices;
#endif /* __cplusplus */
#endif


#ifndef _LPOLEDOCUMENT_DEFINED
#define _LPOLEDOCUMENT_DEFINED
/*****************************************************************************
 * IOleDocument interface
 */
#ifndef __IOleDocument_INTERFACE_DEFINED__
#define __IOleDocument_INTERFACE_DEFINED__

typedef IOleDocument *LPOLEDOCUMENT;

typedef enum __WIDL_docobj_generated_name_00000020 {
    DOCMISC_CANCREATEMULTIPLEVIEWS = 1,
    DOCMISC_SUPPORTCOMPLEXRECTANGLES = 2,
    DOCMISC_CANTOPENEDIT = 4,
    DOCMISC_NOFILESUPPORT = 8
} DOCMISC;

DEFINE_GUID(IID_IOleDocument, 0xb722bcc5, 0x4e68, 0x101b, 0xa2,0xbc, 0x00,0xaa,0x00,0x40,0x47,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b722bcc5-4e68-101b-a2bc-00aa00404770")
IOleDocument : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateView(
        IOleInPlaceSite *pIPSite,
        IStream *pstm,
        DWORD dwReserved,
        IOleDocumentView **ppView) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocMiscStatus(
        DWORD *pdwStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumViews(
        IEnumOleDocumentViews **ppEnum,
        IOleDocumentView **ppView) = 0;

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

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

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

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

    /*** IOleDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateView)(
        IOleDocument *This,
        IOleInPlaceSite *pIPSite,
        IStream *pstm,
        DWORD dwReserved,
        IOleDocumentView **ppView);

    HRESULT (STDMETHODCALLTYPE *GetDocMiscStatus)(
        IOleDocument *This,
        DWORD *pdwStatus);

    HRESULT (STDMETHODCALLTYPE *EnumViews)(
        IOleDocument *This,
        IEnumOleDocumentViews **ppEnum,
        IOleDocumentView **ppView);

    END_INTERFACE
} IOleDocumentVtbl;

interface IOleDocument {
    CONST_VTBL IOleDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#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)
/*** IOleDocument methods ***/
#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)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOleDocument_QueryInterface(IOleDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOleDocument_AddRef(IOleDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOleDocument_Release(IOleDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleDocument methods ***/
static FORCEINLINE HRESULT IOleDocument_CreateView(IOleDocument* This,IOleInPlaceSite *pIPSite,IStream *pstm,DWORD dwReserved,IOleDocumentView **ppView) {
    return This->lpVtbl->CreateView(This,pIPSite,pstm,dwReserved,ppView);
}
static FORCEINLINE HRESULT IOleDocument_GetDocMiscStatus(IOleDocument* This,DWORD *pdwStatus) {
    return This->lpVtbl->GetDocMiscStatus(This,pdwStatus);
}
static FORCEINLINE HRESULT IOleDocument_EnumViews(IOleDocument* This,IEnumOleDocumentViews **ppEnum,IOleDocumentView **ppView) {
    return This->lpVtbl->EnumViews(This,ppEnum,ppView);
}
#endif
#endif

#endif


#endif  /* __IOleDocument_INTERFACE_DEFINED__ */

#endif

#ifndef _LPOLEDOCUMENTSITE_DEFINED
#define _LPOLEDOCUMENTSITE_DEFINED
/*****************************************************************************
 * IOleDocumentSite interface
 */
#ifndef __IOleDocumentSite_INTERFACE_DEFINED__
#define __IOleDocumentSite_INTERFACE_DEFINED__

typedef IOleDocumentSite *LPOLEDOCUMENTSITE;

DEFINE_GUID(IID_IOleDocumentSite, 0xb722bcc7, 0x4e68, 0x101b, 0xa2,0xbc, 0x00,0xaa,0x00,0x40,0x47,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b722bcc7-4e68-101b-a2bc-00aa00404770")
IOleDocumentSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ActivateMe(
        IOleDocumentView *pViewToActivate) = 0;

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

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

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

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

    /*** IOleDocumentSite methods ***/
    HRESULT (STDMETHODCALLTYPE *ActivateMe)(
        IOleDocumentSite *This,
        IOleDocumentView *pViewToActivate);

    END_INTERFACE
} IOleDocumentSiteVtbl;

interface IOleDocumentSite {
    CONST_VTBL IOleDocumentSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#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)
/*** IOleDocumentSite methods ***/
#define IOleDocumentSite_ActivateMe(This,pViewToActivate) (This)->lpVtbl->ActivateMe(This,pViewToActivate)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOleDocumentSite_QueryInterface(IOleDocumentSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOleDocumentSite_AddRef(IOleDocumentSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOleDocumentSite_Release(IOleDocumentSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleDocumentSite methods ***/
static FORCEINLINE HRESULT IOleDocumentSite_ActivateMe(IOleDocumentSite* This,IOleDocumentView *pViewToActivate) {
    return This->lpVtbl->ActivateMe(This,pViewToActivate);
}
#endif
#endif

#endif


#endif  /* __IOleDocumentSite_INTERFACE_DEFINED__ */

#endif

#ifndef _LPOLEDOCUMENTVIEW_DEFINED
#define _LPOLEDOCUMENTVIEW_DEFINED
/*****************************************************************************
 * IOleDocumentView interface
 */
#ifndef __IOleDocumentView_INTERFACE_DEFINED__
#define __IOleDocumentView_INTERFACE_DEFINED__

typedef IOleDocumentView *LPOLEDOCUMENTVIEW;

DEFINE_GUID(IID_IOleDocumentView, 0xb722bcc6, 0x4e68, 0x101b, 0xa2,0xbc, 0x00,0xaa,0x00,0x40,0x47,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b722bcc6-4e68-101b-a2bc-00aa00404770")
IOleDocumentView : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetInPlaceSite(
        IOleInPlaceSite *pIPSite) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInPlaceSite(
        IOleInPlaceSite **ppIPSite) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocument(
        IUnknown **ppunk) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRect(
        LPRECT prcView) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRect(
        LPRECT prcView) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRectComplex(
        LPRECT prcView,
        LPRECT prcHScroll,
        LPRECT prcVScroll,
        LPRECT prcSizeBox) = 0;

    virtual HRESULT STDMETHODCALLTYPE Show(
        WINBOOL fShow) = 0;

    virtual HRESULT STDMETHODCALLTYPE UIActivate(
        WINBOOL fUIActivate) = 0;

    virtual HRESULT STDMETHODCALLTYPE Open(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CloseView(
        DWORD dwReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveViewState(
        LPSTREAM pstm) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyViewState(
        LPSTREAM pstm) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOleInPlaceSite *pIPSiteNew,
        IOleDocumentView **ppViewNew) = 0;

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

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

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

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

    /*** IOleDocumentView methods ***/
    HRESULT (STDMETHODCALLTYPE *SetInPlaceSite)(
        IOleDocumentView *This,
        IOleInPlaceSite *pIPSite);

    HRESULT (STDMETHODCALLTYPE *GetInPlaceSite)(
        IOleDocumentView *This,
        IOleInPlaceSite **ppIPSite);

    HRESULT (STDMETHODCALLTYPE *GetDocument)(
        IOleDocumentView *This,
        IUnknown **ppunk);

    HRESULT (STDMETHODCALLTYPE *SetRect)(
        IOleDocumentView *This,
        LPRECT prcView);

    HRESULT (STDMETHODCALLTYPE *GetRect)(
        IOleDocumentView *This,
        LPRECT prcView);

    HRESULT (STDMETHODCALLTYPE *SetRectComplex)(
        IOleDocumentView *This,
        LPRECT prcView,
        LPRECT prcHScroll,
        LPRECT prcVScroll,
        LPRECT prcSizeBox);

    HRESULT (STDMETHODCALLTYPE *Show)(
        IOleDocumentView *This,
        WINBOOL fShow);

    HRESULT (STDMETHODCALLTYPE *UIActivate)(
        IOleDocumentView *This,
        WINBOOL fUIActivate);

    HRESULT (STDMETHODCALLTYPE *Open)(
        IOleDocumentView *This);

    HRESULT (STDMETHODCALLTYPE *CloseView)(
        IOleDocumentView *This,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *SaveViewState)(
        IOleDocumentView *This,
        LPSTREAM pstm);

    HRESULT (STDMETHODCALLTYPE *ApplyViewState)(
        IOleDocumentView *This,
        LPSTREAM pstm);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOleDocumentView *This,
        IOleInPlaceSite *pIPSiteNew,
        IOleDocumentView **ppViewNew);

    END_INTERFACE
} IOleDocumentViewVtbl;

interface IOleDocumentView {
    CONST_VTBL IOleDocumentViewVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#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)
/*** IOleDocumentView methods ***/
#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)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOleDocumentView_QueryInterface(IOleDocumentView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOleDocumentView_AddRef(IOleDocumentView* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOleDocumentView_Release(IOleDocumentView* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleDocumentView methods ***/
static FORCEINLINE HRESULT IOleDocumentView_SetInPlaceSite(IOleDocumentView* This,IOleInPlaceSite *pIPSite) {
    return This->lpVtbl->SetInPlaceSite(This,pIPSite);
}
static FORCEINLINE HRESULT IOleDocumentView_GetInPlaceSite(IOleDocumentView* This,IOleInPlaceSite **ppIPSite) {
    return This->lpVtbl->GetInPlaceSite(This,ppIPSite);
}
static FORCEINLINE HRESULT IOleDocumentView_GetDocument(IOleDocumentView* This,IUnknown **ppunk) {
    return This->lpVtbl->GetDocument(This,ppunk);
}
static FORCEINLINE HRESULT IOleDocumentView_SetRect(IOleDocumentView* This,LPRECT prcView) {
    return This->lpVtbl->SetRect(This,prcView);
}
static FORCEINLINE HRESULT IOleDocumentView_GetRect(IOleDocumentView* This,LPRECT prcView) {
    return This->lpVtbl->GetRect(This,prcView);
}
static FORCEINLINE HRESULT IOleDocumentView_SetRectComplex(IOleDocumentView* This,LPRECT prcView,LPRECT prcHScroll,LPRECT prcVScroll,LPRECT prcSizeBox) {
    return This->lpVtbl->SetRectComplex(This,prcView,prcHScroll,prcVScroll,prcSizeBox);
}
static FORCEINLINE HRESULT IOleDocumentView_Show(IOleDocumentView* This,WINBOOL fShow) {
    return This->lpVtbl->Show(This,fShow);
}
static FORCEINLINE HRESULT IOleDocumentView_UIActivate(IOleDocumentView* This,WINBOOL fUIActivate) {
    return This->lpVtbl->UIActivate(This,fUIActivate);
}
static FORCEINLINE HRESULT IOleDocumentView_Open(IOleDocumentView* This) {
    return This->lpVtbl->Open(This);
}
static FORCEINLINE HRESULT IOleDocumentView_CloseView(IOleDocumentView* This,DWORD dwReserved) {
    return This->lpVtbl->CloseView(This,dwReserved);
}
static FORCEINLINE HRESULT IOleDocumentView_SaveViewState(IOleDocumentView* This,LPSTREAM pstm) {
    return This->lpVtbl->SaveViewState(This,pstm);
}
static FORCEINLINE HRESULT IOleDocumentView_ApplyViewState(IOleDocumentView* This,LPSTREAM pstm) {
    return This->lpVtbl->ApplyViewState(This,pstm);
}
static FORCEINLINE HRESULT IOleDocumentView_Clone(IOleDocumentView* This,IOleInPlaceSite *pIPSiteNew,IOleDocumentView **ppViewNew) {
    return This->lpVtbl->Clone(This,pIPSiteNew,ppViewNew);
}
#endif
#endif

#endif


#endif  /* __IOleDocumentView_INTERFACE_DEFINED__ */

#endif

#ifndef _LPENUMOLEDOCUMENTVIEWS_DEFINED
#define _LPENUMOLEDOCUMENTVIEWS_DEFINED
/*****************************************************************************
 * IEnumOleDocumentViews interface
 */
#ifndef __IEnumOleDocumentViews_INTERFACE_DEFINED__
#define __IEnumOleDocumentViews_INTERFACE_DEFINED__

typedef IEnumOleDocumentViews *LPENUMOLEDOCUMENTVIEWS;

DEFINE_GUID(IID_IEnumOleDocumentViews, 0xb722bcc8, 0x4e68, 0x101b, 0xa2,0xbc, 0x00,0xaa,0x00,0x40,0x47,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b722bcc8-4e68-101b-a2bc-00aa00404770")
IEnumOleDocumentViews : public IUnknown
{
    virtual HRESULT __stdcall Next(
        ULONG cViews,
        IOleDocumentView **rgpView,
        ULONG *pcFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG cViews) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumOleDocumentViews **ppEnum) = 0;

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

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

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

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

    /*** IEnumOleDocumentViews methods ***/
    HRESULT (__stdcall *Next)(
        IEnumOleDocumentViews *This,
        ULONG cViews,
        IOleDocumentView **rgpView,
        ULONG *pcFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumOleDocumentViews *This,
        ULONG cViews);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumOleDocumentViews *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumOleDocumentViews *This,
        IEnumOleDocumentViews **ppEnum);

    END_INTERFACE
} IEnumOleDocumentViewsVtbl;

interface IEnumOleDocumentViews {
    CONST_VTBL IEnumOleDocumentViewsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#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)
/*** IEnumOleDocumentViews methods ***/
#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)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumOleDocumentViews_QueryInterface(IEnumOleDocumentViews* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumOleDocumentViews_AddRef(IEnumOleDocumentViews* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumOleDocumentViews_Release(IEnumOleDocumentViews* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumOleDocumentViews methods ***/
static FORCEINLINE HRESULT IEnumOleDocumentViews_Next(IEnumOleDocumentViews* This,ULONG cViews,IOleDocumentView **rgpView,ULONG *pcFetched) {
    return This->lpVtbl->Next(This,cViews,rgpView,pcFetched);
}
static FORCEINLINE HRESULT IEnumOleDocumentViews_Skip(IEnumOleDocumentViews* This,ULONG cViews) {
    return This->lpVtbl->Skip(This,cViews);
}
static FORCEINLINE HRESULT IEnumOleDocumentViews_Reset(IEnumOleDocumentViews* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumOleDocumentViews_Clone(IEnumOleDocumentViews* This,IEnumOleDocumentViews **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
#endif
#endif

#endif

HRESULT __stdcall 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 CALLBACK IEnumOleDocumentViews_Next_Proxy(
    IEnumOleDocumentViews* This,
    ULONG cViews,
    IOleDocumentView **rgpView,
    ULONG *pcFetched);
HRESULT __RPC_STUB IEnumOleDocumentViews_Next_Stub(
    IEnumOleDocumentViews* This,
    ULONG cViews,
    IOleDocumentView **rgpView,
    ULONG *pcFetched);

#endif  /* __IEnumOleDocumentViews_INTERFACE_DEFINED__ */

#endif

#ifndef _LPCONTINUECALLBACK_DEFINED
#define _LPCONTINUECALLBACK_DEFINED
/*****************************************************************************
 * IContinueCallback interface
 */
#ifndef __IContinueCallback_INTERFACE_DEFINED__
#define __IContinueCallback_INTERFACE_DEFINED__

typedef IContinueCallback *LPCONTINUECALLBACK;

DEFINE_GUID(IID_IContinueCallback, 0xb722bcca, 0x4e68, 0x101b, 0xa2,0xbc, 0x00,0xaa,0x00,0x40,0x47,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b722bcca-4e68-101b-a2bc-00aa00404770")
IContinueCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FContinue(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE FContinuePrinting(
        LONG nCntPrinted,
        LONG nCurPage,
        wchar_t *pwszPrintStatus) = 0;

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

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

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

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

    /*** IContinueCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *FContinue)(
        IContinueCallback *This);

    HRESULT (STDMETHODCALLTYPE *FContinuePrinting)(
        IContinueCallback *This,
        LONG nCntPrinted,
        LONG nCurPage,
        wchar_t *pwszPrintStatus);

    END_INTERFACE
} IContinueCallbackVtbl;

interface IContinueCallback {
    CONST_VTBL IContinueCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#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)
/*** IContinueCallback methods ***/
#define IContinueCallback_FContinue(This) (This)->lpVtbl->FContinue(This)
#define IContinueCallback_FContinuePrinting(This,nCntPrinted,nCurPage,pwszPrintStatus) (This)->lpVtbl->FContinuePrinting(This,nCntPrinted,nCurPage,pwszPrintStatus)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IContinueCallback_QueryInterface(IContinueCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IContinueCallback_AddRef(IContinueCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IContinueCallback_Release(IContinueCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IContinueCallback methods ***/
static FORCEINLINE HRESULT IContinueCallback_FContinue(IContinueCallback* This) {
    return This->lpVtbl->FContinue(This);
}
static FORCEINLINE HRESULT IContinueCallback_FContinuePrinting(IContinueCallback* This,LONG nCntPrinted,LONG nCurPage,wchar_t *pwszPrintStatus) {
    return This->lpVtbl->FContinuePrinting(This,nCntPrinted,nCurPage,pwszPrintStatus);
}
#endif
#endif

#endif


#endif  /* __IContinueCallback_INTERFACE_DEFINED__ */

#endif

#ifndef _LPPRINT_DEFINED
#define _LPPRINT_DEFINED
/*****************************************************************************
 * IPrint interface
 */
#ifndef __IPrint_INTERFACE_DEFINED__
#define __IPrint_INTERFACE_DEFINED__

typedef IPrint *LPPRINT;

typedef enum __WIDL_docobj_generated_name_00000021 {
    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))

DEFINE_GUID(IID_IPrint, 0xb722bcc9, 0x4e68, 0x101b, 0xa2,0xbc, 0x00,0xaa,0x00,0x40,0x47,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b722bcc9-4e68-101b-a2bc-00aa00404770")
IPrint : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetInitialPageNum(
        LONG nFirstPage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPageInfo(
        LONG *pnFirstPage,
        LONG *pcPages) = 0;

    virtual HRESULT __stdcall Print(
        DWORD grfFlags,
        DVTARGETDEVICE **pptd,
        PAGESET **ppPageSet,
        STGMEDIUM *pstgmOptions,
        IContinueCallback *pcallback,
        LONG nFirstPage,
        LONG *pcPagesPrinted,
        LONG *pnLastPage) = 0;

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

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

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

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

    /*** IPrint methods ***/
    HRESULT (STDMETHODCALLTYPE *SetInitialPageNum)(
        IPrint *This,
        LONG nFirstPage);

    HRESULT (STDMETHODCALLTYPE *GetPageInfo)(
        IPrint *This,
        LONG *pnFirstPage,
        LONG *pcPages);

    HRESULT (__stdcall *Print)(
        IPrint *This,
        DWORD grfFlags,
        DVTARGETDEVICE **pptd,
        PAGESET **ppPageSet,
        STGMEDIUM *pstgmOptions,
        IContinueCallback *pcallback,
        LONG nFirstPage,
        LONG *pcPagesPrinted,
        LONG *pnLastPage);

    END_INTERFACE
} IPrintVtbl;

interface IPrint {
    CONST_VTBL IPrintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#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)
/*** IPrint methods ***/
#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)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPrint_QueryInterface(IPrint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPrint_AddRef(IPrint* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPrint_Release(IPrint* This) {
    return This->lpVtbl->Release(This);
}
/*** IPrint methods ***/
static FORCEINLINE HRESULT IPrint_SetInitialPageNum(IPrint* This,LONG nFirstPage) {
    return This->lpVtbl->SetInitialPageNum(This,nFirstPage);
}
static FORCEINLINE HRESULT IPrint_GetPageInfo(IPrint* This,LONG *pnFirstPage,LONG *pcPages) {
    return This->lpVtbl->GetPageInfo(This,pnFirstPage,pcPages);
}
static FORCEINLINE HRESULT IPrint_Print(IPrint* This,DWORD grfFlags,DVTARGETDEVICE **pptd,PAGESET **ppPageSet,STGMEDIUM *pstgmOptions,IContinueCallback *pcallback,LONG nFirstPage,LONG *pcPagesPrinted,LONG *pnLastPage) {
    return This->lpVtbl->Print(This,grfFlags,pptd,ppPageSet,pstgmOptions,pcallback,nFirstPage,pcPagesPrinted,pnLastPage);
}
#endif
#endif

#endif

HRESULT __stdcall 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);
HRESULT CALLBACK IPrint_Print_Proxy(
    IPrint* This,
    DWORD grfFlags,
    DVTARGETDEVICE **pptd,
    PAGESET **ppPageSet,
    STGMEDIUM *pstgmOptions,
    IContinueCallback *pcallback,
    LONG nFirstPage,
    LONG *pcPagesPrinted,
    LONG *pnLastPage);
HRESULT __RPC_STUB IPrint_Print_Stub(
    IPrint* This,
    DWORD grfFlags,
    DVTARGETDEVICE **pptd,
    PAGESET **pppageset,
    RemSTGMEDIUM *pstgmOptions,
    IContinueCallback *pcallback,
    LONG nFirstPage,
    LONG *pcPagesPrinted,
    LONG *pnLastPage);

#endif  /* __IPrint_INTERFACE_DEFINED__ */

#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_SHOWTASKDLG = 68,
    OLECMDID_POPSTATEEVENT = 69,
    OLECMDID_VIEWPORT_MODE = 70,
    OLECMDID_LAYOUT_VIEWPORT_WIDTH = 71,
    OLECMDID_VISUAL_VIEWPORT_EXCLUDE_BOTTOM = 72,
    OLECMDID_USER_OPTICAL_ZOOM = 73,
    OLECMDID_PAGEAVAILABLE = 74,
    OLECMDID_GETUSERSCALABLE = 75,
    OLECMDID_UPDATE_CARET = 76,
    OLECMDID_ENABLE_VISIBILITY = 77,
    OLECMDID_MEDIA_PLAYBACK = 78
} OLECMDID;

typedef enum MEDIAPLAYBACK_STATE {
    MEDIAPLAYBACK_RESUME = 0,
    MEDIAPLAYBACK_PAUSE = 1
} MEDIAPLAYBACK_STATE;

#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 OLECMD_TASKDLGID_ONBEFOREUNLOAD            1

#if NTDDI_VERSION >= NTDDI_WINXPSP2
#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
#define OLECMDARGINDEX_ACTIVEXINSTALL_CLSID 2
#define OLECMDARGINDEX_ACTIVEXINSTALL_INSTALLSCOPE 3
#define OLECMDARGINDEX_ACTIVEXINSTALL_SOURCEURL 4

#define INSTALL_SCOPE_INVALID 0
#define INSTALL_SCOPE_MACHINE 1
#define INSTALL_SCOPE_USER 2

typedef enum IGNOREMIME {
    IGNOREMIME_PROMPT = 0x1,
    IGNOREMIME_TEXT = 0x2
} IGNOREMIME;

typedef enum WPCSETTING {
    WPCSETTING_LOGGING_ENABLED = 0x1,
    WPCSETTING_FILEDOWNLOAD_BLOCKED = 0x2
} WPCSETTING;
#endif

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


#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,
#if NTDDI_VERSION >= NTDDI_WINXPSP2
  OLECMDIDF_REFRESH_PROMPTIFOFFLINE = 0x2000,
  OLECMDIDF_REFRESH_THROUGHSCRIPT = 0x4000,
  OLECMDIDF_REFRESH_SKIPBEFOREUNLOADEVENT = 0x8000,
  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,
#else
OLECMDIDF_REFRESH_PROMPTIFOFFLINE = 0x2000,
OLECMDIDF_REFRESH_THROUGHSCRIPT = 0x4000,
#endif
  OLECMDIDF_REFRESH_PAGEACTION_MIXEDCONTENT = 0x02000000,
  OLECMDIDF_REFRESH_PAGEACTION_INVALID_CERT = 0x04000000
} 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_SCRIPTNAVIGATE_ACTIVEXINSTALL = 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_SCRIPTPROMPT = 0x00020000,
  OLECMDIDF_PAGEACTION_ACTIVEXUSERAPPROVAL = 0x00040000,
  OLECMDIDF_PAGEACTION_MIXEDCONTENT = 0x00080000,
  OLECMDIDF_PAGEACTION_INVALID_CERT = 0x00100000,
  OLECMDIDF_PAGEACTION_INTRANETZONEREQUEST = 0x00200000,
  OLECMDIDF_PAGEACTION_XSSFILTERED = 0x00400000,
  OLECMDIDF_PAGEACTION_SPOOFABLEIDNHOST = 0x00800000,
  OLECMDIDF_PAGEACTION_ACTIVEX_EPM_INCOMPATIBLE = 0x01000000,
  OLECMDIDF_PAGEACTION_SCRIPTNAVIGATE_ACTIVEXUSERAPPROVAL = 0x02000000,
  OLECMDIDF_PAGEACTION_WPCBLOCKED = 0x04000000,
  OLECMDIDF_PAGEACTION_WPCBLOCKED_ACTIVEX = 0x08000000,
  OLECMDIDF_PAGEACTION_EXTENSION_COMPAT_BLOCKED = 0x10000000,
  OLECMDIDF_PAGEACTION_NORESETACTIVEX = 0x20000000,
  OLECMDIDF_PAGEACTION_GENERIC_STATE = 0x40000000,
  OLECMDIDF_PAGEACTION_RESET = (int) 0x80000000
} OLECMDID_PAGEACTIONFLAG;

typedef enum {
  OLECMDIDF_BROWSERSTATE_EXTENSIONSOFF = 0x00000001,
  OLECMDIDF_BROWSERSTATE_IESECURITY = 0x00000002,
  OLECMDIDF_BROWSERSTATE_PROTECTEDMODE_OFF = 0x00000004,
  OLECMDIDF_BROWSERSTATE_RESET = 0x00000008,
  OLECMDIDF_BROWSERSTATE_REQUIRESACTIVEX = 0x00000010,
} OLECMDID_BROWSERSTATEFLAG;

typedef enum {
  OLECMDIDF_OPTICAL_ZOOM_NOPERSIST = 0x00000001,
  OLECMDIDF_OPTICAL_ZOOM_NOLAYOUT = 0x00000010
} OLECMDID_OPTICAL_ZOOMFLAG;

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

typedef enum {
  OLECMDIDF_WINDOWSTATE_USERVISIBLE = 0x00000001,
  OLECMDIDF_WINDOWSTATE_ENABLED = 0x00000002,
  OLECMDIDF_WINDOWSTATE_USERVISIBLE_VALID = 0x00010000,
  OLECMDIDF_WINDOWSTATE_ENABLED_VALID = 0x00020000
} OLECMDID_WINDOWSTATE_FLAG;

typedef enum {
  OLECMDIDF_VIEWPORTMODE_FIXED_LAYOUT_WIDTH = 0x00000001,
  OLECMDIDF_VIEWPORTMODE_EXCLUDE_VISUAL_BOTTOM = 0x00000002,
  OLECMDIDF_VIEWPORTMODE_FIXED_LAYOUT_WIDTH_VALID = 0x00010000,
  OLECMDIDF_VIEWPORTMODE_EXCLUDE_VISUAL_BOTTOM_VALID = 0x00020000
} OLECMDID_VIEWPORT_MODE_FLAG;

#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;

/*****************************************************************************
 * IZoomEvents interface
 */
#ifndef __IZoomEvents_INTERFACE_DEFINED__
#define __IZoomEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IZoomEvents, 0x41b68150, 0x904c, 0x4e17, 0xa0,0xba, 0xa4,0x38,0x18,0x2e,0x35,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("41b68150-904c-4e17-a0ba-a438182e359d")
IZoomEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnZoomPercentChanged(
        ULONG ulZoomPercent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IZoomEvents, 0x41b68150, 0x904c, 0x4e17, 0xa0,0xba, 0xa4,0x38,0x18,0x2e,0x35,0x9d)
#endif
#else
typedef struct IZoomEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IZoomEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnZoomPercentChanged)(
        IZoomEvents *This,
        ULONG ulZoomPercent);

    END_INTERFACE
} IZoomEventsVtbl;

interface IZoomEvents {
    CONST_VTBL IZoomEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IZoomEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IZoomEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IZoomEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IZoomEvents methods ***/
#define IZoomEvents_OnZoomPercentChanged(This,ulZoomPercent) (This)->lpVtbl->OnZoomPercentChanged(This,ulZoomPercent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IZoomEvents_QueryInterface(IZoomEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IZoomEvents_AddRef(IZoomEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IZoomEvents_Release(IZoomEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IZoomEvents methods ***/
static FORCEINLINE HRESULT IZoomEvents_OnZoomPercentChanged(IZoomEvents* This,ULONG ulZoomPercent) {
    return This->lpVtbl->OnZoomPercentChanged(This,ulZoomPercent);
}
#endif
#endif

#endif


#endif  /* __IZoomEvents_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IProtectFocus interface
 */
#ifndef __IProtectFocus_INTERFACE_DEFINED__
#define __IProtectFocus_INTERFACE_DEFINED__

DEFINE_GUID(IID_IProtectFocus, 0xd81f90a3, 0x8156, 0x44f7, 0xad,0x28, 0x5a,0xbb,0x87,0x00,0x32,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d81f90a3-8156-44f7-ad28-5abb87003274")
IProtectFocus : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AllowFocusChange(
        WINBOOL *pfAllow) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IProtectFocus, 0xd81f90a3, 0x8156, 0x44f7, 0xad,0x28, 0x5a,0xbb,0x87,0x00,0x32,0x74)
#endif
#else
typedef struct IProtectFocusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IProtectFocus methods ***/
    HRESULT (STDMETHODCALLTYPE *AllowFocusChange)(
        IProtectFocus *This,
        WINBOOL *pfAllow);

    END_INTERFACE
} IProtectFocusVtbl;

interface IProtectFocus {
    CONST_VTBL IProtectFocusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IProtectFocus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProtectFocus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProtectFocus_Release(This) (This)->lpVtbl->Release(This)
/*** IProtectFocus methods ***/
#define IProtectFocus_AllowFocusChange(This,pfAllow) (This)->lpVtbl->AllowFocusChange(This,pfAllow)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IProtectFocus_QueryInterface(IProtectFocus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IProtectFocus_AddRef(IProtectFocus* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IProtectFocus_Release(IProtectFocus* This) {
    return This->lpVtbl->Release(This);
}
/*** IProtectFocus methods ***/
static FORCEINLINE HRESULT IProtectFocus_AllowFocusChange(IProtectFocus* This,WINBOOL *pfAllow) {
    return This->lpVtbl->AllowFocusChange(This,pfAllow);
}
#endif
#endif

#endif


#endif  /* __IProtectFocus_INTERFACE_DEFINED__ */


#define SID_SProtectFocus  IID_IProtectFocus

#ifndef _LPPROTECTEDMODEMENUSERVICES_DEFINED
#define _LPPROTECTEDMODEMENUSERVICES_DEFINED
/*****************************************************************************
 * IProtectedModeMenuServices interface
 */
#ifndef __IProtectedModeMenuServices_INTERFACE_DEFINED__
#define __IProtectedModeMenuServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_IProtectedModeMenuServices, 0x73c105ee, 0x9dff, 0x4a07, 0xb8,0x3c, 0x7e,0xff,0x29,0x0c,0x26,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("73c105ee-9dff-4a07-b83c-7eff290c266e")
IProtectedModeMenuServices : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateMenu(
        HMENU *phMenu) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadMenu(
        LPCWSTR pszModuleName,
        LPCWSTR pszMenuName,
        HMENU *phMenu) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadMenuID(
        LPCWSTR pszModuleName,
        WORD wResourceID,
        HMENU *phMenu) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IProtectedModeMenuServices, 0x73c105ee, 0x9dff, 0x4a07, 0xb8,0x3c, 0x7e,0xff,0x29,0x0c,0x26,0x6e)
#endif
#else
typedef struct IProtectedModeMenuServicesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IProtectedModeMenuServices methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateMenu)(
        IProtectedModeMenuServices *This,
        HMENU *phMenu);

    HRESULT (STDMETHODCALLTYPE *LoadMenu)(
        IProtectedModeMenuServices *This,
        LPCWSTR pszModuleName,
        LPCWSTR pszMenuName,
        HMENU *phMenu);

    HRESULT (STDMETHODCALLTYPE *LoadMenuID)(
        IProtectedModeMenuServices *This,
        LPCWSTR pszModuleName,
        WORD wResourceID,
        HMENU *phMenu);

    END_INTERFACE
} IProtectedModeMenuServicesVtbl;

interface IProtectedModeMenuServices {
    CONST_VTBL IProtectedModeMenuServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IProtectedModeMenuServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProtectedModeMenuServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProtectedModeMenuServices_Release(This) (This)->lpVtbl->Release(This)
/*** IProtectedModeMenuServices methods ***/
#define IProtectedModeMenuServices_CreateMenu(This,phMenu) (This)->lpVtbl->CreateMenu(This,phMenu)
#define IProtectedModeMenuServices_LoadMenu(This,pszModuleName,pszMenuName,phMenu) (This)->lpVtbl->LoadMenu(This,pszModuleName,pszMenuName,phMenu)
#define IProtectedModeMenuServices_LoadMenuID(This,pszModuleName,wResourceID,phMenu) (This)->lpVtbl->LoadMenuID(This,pszModuleName,wResourceID,phMenu)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IProtectedModeMenuServices_QueryInterface(IProtectedModeMenuServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IProtectedModeMenuServices_AddRef(IProtectedModeMenuServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IProtectedModeMenuServices_Release(IProtectedModeMenuServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IProtectedModeMenuServices methods ***/
static FORCEINLINE HRESULT IProtectedModeMenuServices_CreateMenu(IProtectedModeMenuServices* This,HMENU *phMenu) {
    return This->lpVtbl->CreateMenu(This,phMenu);
}
static FORCEINLINE HRESULT IProtectedModeMenuServices_LoadMenu(IProtectedModeMenuServices* This,LPCWSTR pszModuleName,LPCWSTR pszMenuName,HMENU *phMenu) {
    return This->lpVtbl->LoadMenu(This,pszModuleName,pszMenuName,phMenu);
}
static FORCEINLINE HRESULT IProtectedModeMenuServices_LoadMenuID(IProtectedModeMenuServices* This,LPCWSTR pszModuleName,WORD wResourceID,HMENU *phMenu) {
    return This->lpVtbl->LoadMenuID(This,pszModuleName,wResourceID,phMenu);
}
#endif
#endif

#endif


#endif  /* __IProtectedModeMenuServices_INTERFACE_DEFINED__ */

#endif
#endif
#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY_DESKTOP_APP, WINAPI_PARTITION_APP)
typedef struct tagPAGESET { } PAGESET;
#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER STGMEDIUM_UserSize     (ULONG *, ULONG, STGMEDIUM *);
unsigned char * __RPC_USER STGMEDIUM_UserMarshal  (ULONG *, unsigned char *, STGMEDIUM *);
unsigned char * __RPC_USER STGMEDIUM_UserUnmarshal(ULONG *, unsigned char *, STGMEDIUM *);
void            __RPC_USER STGMEDIUM_UserFree     (ULONG *, STGMEDIUM *);
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 *);
ULONG           __RPC_USER HMENU_UserSize     (ULONG *, ULONG, HMENU *);
unsigned char * __RPC_USER HMENU_UserMarshal  (ULONG *, unsigned char *, HMENU *);
unsigned char * __RPC_USER HMENU_UserUnmarshal(ULONG *, unsigned char *, HMENU *);
void            __RPC_USER HMENU_UserFree     (ULONG *, HMENU *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __docobj_h__ */
