/*** Autogenerated by WIDL 0.1 from exdisp.idl - Do not edit ***/
#include <rpc.h>
#include <rpcndr.h>

#ifndef __WIDL_EXDISP_H
#define __WIDL_EXDISP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <ocidl.h>
#include <docobj.h>
#ifndef __IWebBrowser_FWD_DEFINED__
#define __IWebBrowser_FWD_DEFINED__
typedef struct IWebBrowser IWebBrowser;
#endif

typedef enum BrowserNavConstants {
    navOpenInNewWindow = 0x1,
    navNoHistory = 0x2,
    navNoReadFromCache = 0x4,
    navNoWriteToCache = 0x8,
    navAllowAutosearch = 0x10,
    navBrowserBar = 0x20,
    navHyperlink = 0x40,
    navEnforceRestricted = 0x80
} BrowserNavConstants;

typedef enum RefreshConstants {
    REFRESH_NORMAL = 0,
    REFRESH_IFEXPIRED = 1,
    REFRESH_COMPLETELY = 3
} RefreshConstants;

/*****************************************************************************
 * IWebBrowser interface
 */
#ifndef __IWebBrowser_INTERFACE_DEFINED__
#define __IWebBrowser_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebBrowser, 0xeab22ac1, 0x30c1, 0x11cf, 0xa7,0xeb, 0x00,0x00,0xc0,0x5b,0xae,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IWebBrowser : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE GoBack(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GoForward(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GoHome(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GoSearch(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Navigate(
        BSTR URL,
        VARIANT* Flags,
        VARIANT* TargetFrameName,
        VARIANT* PostData,
        VARIANT* Headers) = 0;

    virtual HRESULT STDMETHODCALLTYPE Refresh(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Refresh2(
        VARIANT* Level) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Application(
        IDispatch** ppDisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parent(
        IDispatch** ppDisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Container(
        IDispatch** ppDisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Document(
        IDispatch** ppDisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TopLevelContainer(
        VARIANT_BOOL* pBool) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Type(
        BSTR* Type) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Left(
        long* pl) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Left(
        long Left) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Top(
        long* pl) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Top(
        long Top) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Width(
        long* pl) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Width(
        long Width) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Height(
        long* pl) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Height(
        long Height) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocationName(
        BSTR* LocationName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocationURL(
        BSTR* LocationURL) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Busy(
        VARIANT_BOOL* pBool) = 0;

};
#else
typedef struct IWebBrowserVtbl IWebBrowserVtbl;
struct IWebBrowser {
    const IWebBrowserVtbl* lpVtbl;
};
struct IWebBrowserVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWebBrowser* This,
        UINT* pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWebBrowser* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo** ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWebBrowser* This,
        REFIID riid,
        LPOLESTR* rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID* rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWebBrowser* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS* pDispParams,
        VARIANT* pVarResult,
        EXCEPINFO* pExcepInfo,
        UINT* puArgErr);

    /*** IWebBrowser methods ***/
    HRESULT (STDMETHODCALLTYPE *GoBack)(
        IWebBrowser* This);

    HRESULT (STDMETHODCALLTYPE *GoForward)(
        IWebBrowser* This);

    HRESULT (STDMETHODCALLTYPE *GoHome)(
        IWebBrowser* This);

    HRESULT (STDMETHODCALLTYPE *GoSearch)(
        IWebBrowser* This);

    HRESULT (STDMETHODCALLTYPE *Navigate)(
        IWebBrowser* This,
        BSTR URL,
        VARIANT* Flags,
        VARIANT* TargetFrameName,
        VARIANT* PostData,
        VARIANT* Headers);

    HRESULT (STDMETHODCALLTYPE *Refresh)(
        IWebBrowser* This);

    HRESULT (STDMETHODCALLTYPE *Refresh2)(
        IWebBrowser* This,
        VARIANT* Level);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IWebBrowser* This);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IWebBrowser* This,
        IDispatch** ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IWebBrowser* This,
        IDispatch** ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_Container)(
        IWebBrowser* This,
        IDispatch** ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_Document)(
        IWebBrowser* This,
        IDispatch** ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_TopLevelContainer)(
        IWebBrowser* This,
        VARIANT_BOOL* pBool);

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IWebBrowser* This,
        BSTR* Type);

    HRESULT (STDMETHODCALLTYPE *get_Left)(
        IWebBrowser* This,
        long* pl);

    HRESULT (STDMETHODCALLTYPE *put_Left)(
        IWebBrowser* This,
        long Left);

    HRESULT (STDMETHODCALLTYPE *get_Top)(
        IWebBrowser* This,
        long* pl);

    HRESULT (STDMETHODCALLTYPE *put_Top)(
        IWebBrowser* This,
        long Top);

    HRESULT (STDMETHODCALLTYPE *get_Width)(
        IWebBrowser* This,
        long* pl);

    HRESULT (STDMETHODCALLTYPE *put_Width)(
        IWebBrowser* This,
        long Width);

    HRESULT (STDMETHODCALLTYPE *get_Height)(
        IWebBrowser* This,
        long* pl);

    HRESULT (STDMETHODCALLTYPE *put_Height)(
        IWebBrowser* This,
        long Height);

    HRESULT (STDMETHODCALLTYPE *get_LocationName)(
        IWebBrowser* This,
        BSTR* LocationName);

    HRESULT (STDMETHODCALLTYPE *get_LocationURL)(
        IWebBrowser* This,
        BSTR* LocationURL);

    HRESULT (STDMETHODCALLTYPE *get_Busy)(
        IWebBrowser* This,
        VARIANT_BOOL* pBool);

};

/*** IUnknown methods ***/
#define IWebBrowser_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IWebBrowser_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IWebBrowser_Release(p) (p)->lpVtbl->Release(p)
/*** IDispatch methods ***/
#define IWebBrowser_GetTypeInfoCount(p,a) (p)->lpVtbl->GetTypeInfoCount(p,a)
#define IWebBrowser_GetTypeInfo(p,a,b,c) (p)->lpVtbl->GetTypeInfo(p,a,b,c)
#define IWebBrowser_GetIDsOfNames(p,a,b,c,d,e) (p)->lpVtbl->GetIDsOfNames(p,a,b,c,d,e)
#define IWebBrowser_Invoke(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->Invoke(p,a,b,c,d,e,f,g,h)
/*** IWebBrowser methods ***/
#define IWebBrowser_GoBack(p) (p)->lpVtbl->GoBack(p)
#define IWebBrowser_GoForward(p) (p)->lpVtbl->GoForward(p)
#define IWebBrowser_GoHome(p) (p)->lpVtbl->GoHome(p)
#define IWebBrowser_GoSearch(p) (p)->lpVtbl->GoSearch(p)
#define IWebBrowser_Navigate(p,a,b,c,d,e) (p)->lpVtbl->Navigate(p,a,b,c,d,e)
#define IWebBrowser_Refresh(p) (p)->lpVtbl->Refresh(p)
#define IWebBrowser_Refresh2(p,a) (p)->lpVtbl->Refresh2(p,a)
#define IWebBrowser_Stop(p) (p)->lpVtbl->Stop(p)
#define IWebBrowser_get_Application(p,a) (p)->lpVtbl->get_Application(p,a)
#define IWebBrowser_get_Parent(p,a) (p)->lpVtbl->get_Parent(p,a)
#define IWebBrowser_get_Container(p,a) (p)->lpVtbl->get_Container(p,a)
#define IWebBrowser_get_Document(p,a) (p)->lpVtbl->get_Document(p,a)
#define IWebBrowser_get_TopLevelContainer(p,a) (p)->lpVtbl->get_TopLevelContainer(p,a)
#define IWebBrowser_get_Type(p,a) (p)->lpVtbl->get_Type(p,a)
#define IWebBrowser_get_Left(p,a) (p)->lpVtbl->get_Left(p,a)
#define IWebBrowser_put_Left(p,a) (p)->lpVtbl->put_Left(p,a)
#define IWebBrowser_get_Top(p,a) (p)->lpVtbl->get_Top(p,a)
#define IWebBrowser_put_Top(p,a) (p)->lpVtbl->put_Top(p,a)
#define IWebBrowser_get_Width(p,a) (p)->lpVtbl->get_Width(p,a)
#define IWebBrowser_put_Width(p,a) (p)->lpVtbl->put_Width(p,a)
#define IWebBrowser_get_Height(p,a) (p)->lpVtbl->get_Height(p,a)
#define IWebBrowser_put_Height(p,a) (p)->lpVtbl->put_Height(p,a)
#define IWebBrowser_get_LocationName(p,a) (p)->lpVtbl->get_LocationName(p,a)
#define IWebBrowser_get_LocationURL(p,a) (p)->lpVtbl->get_LocationURL(p,a)
#define IWebBrowser_get_Busy(p,a) (p)->lpVtbl->get_Busy(p,a)

#endif

#define IWebBrowser_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IDispatch methods ***/ \
    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ UINT* pctinfo) PURE; \
    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) PURE; \
    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) PURE; \
    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) PURE; \
    /*** IWebBrowser methods ***/ \
    STDMETHOD_(HRESULT,GoBack)(THIS) PURE; \
    STDMETHOD_(HRESULT,GoForward)(THIS) PURE; \
    STDMETHOD_(HRESULT,GoHome)(THIS) PURE; \
    STDMETHOD_(HRESULT,GoSearch)(THIS) PURE; \
    STDMETHOD_(HRESULT,Navigate)(THIS_ BSTR URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers) PURE; \
    STDMETHOD_(HRESULT,Refresh)(THIS) PURE; \
    STDMETHOD_(HRESULT,Refresh2)(THIS_ VARIANT* Level) PURE; \
    STDMETHOD_(HRESULT,Stop)(THIS) PURE; \
    STDMETHOD_(HRESULT,get_Application)(THIS_ IDispatch** ppDisp) PURE; \
    STDMETHOD_(HRESULT,get_Parent)(THIS_ IDispatch** ppDisp) PURE; \
    STDMETHOD_(HRESULT,get_Container)(THIS_ IDispatch** ppDisp) PURE; \
    STDMETHOD_(HRESULT,get_Document)(THIS_ IDispatch** ppDisp) PURE; \
    STDMETHOD_(HRESULT,get_TopLevelContainer)(THIS_ VARIANT_BOOL* pBool) PURE; \
    STDMETHOD_(HRESULT,get_Type)(THIS_ BSTR* Type) PURE; \
    STDMETHOD_(HRESULT,get_Left)(THIS_ long* pl) PURE; \
    STDMETHOD_(HRESULT,put_Left)(THIS_ long Left) PURE; \
    STDMETHOD_(HRESULT,get_Top)(THIS_ long* pl) PURE; \
    STDMETHOD_(HRESULT,put_Top)(THIS_ long Top) PURE; \
    STDMETHOD_(HRESULT,get_Width)(THIS_ long* pl) PURE; \
    STDMETHOD_(HRESULT,put_Width)(THIS_ long Width) PURE; \
    STDMETHOD_(HRESULT,get_Height)(THIS_ long* pl) PURE; \
    STDMETHOD_(HRESULT,put_Height)(THIS_ long Height) PURE; \
    STDMETHOD_(HRESULT,get_LocationName)(THIS_ BSTR* LocationName) PURE; \
    STDMETHOD_(HRESULT,get_LocationURL)(THIS_ BSTR* LocationURL) PURE; \
    STDMETHOD_(HRESULT,get_Busy)(THIS_ VARIANT_BOOL* pBool) PURE;

HRESULT CALLBACK IWebBrowser_GoBack_Proxy(
    IWebBrowser* This);
void __RPC_STUB IWebBrowser_GoBack_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_GoForward_Proxy(
    IWebBrowser* This);
void __RPC_STUB IWebBrowser_GoForward_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_GoHome_Proxy(
    IWebBrowser* This);
void __RPC_STUB IWebBrowser_GoHome_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_GoSearch_Proxy(
    IWebBrowser* This);
void __RPC_STUB IWebBrowser_GoSearch_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_Navigate_Proxy(
    IWebBrowser* This,
    BSTR URL,
    VARIANT* Flags,
    VARIANT* TargetFrameName,
    VARIANT* PostData,
    VARIANT* Headers);
void __RPC_STUB IWebBrowser_Navigate_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_Refresh_Proxy(
    IWebBrowser* This);
void __RPC_STUB IWebBrowser_Refresh_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_Refresh2_Proxy(
    IWebBrowser* This,
    VARIANT* Level);
void __RPC_STUB IWebBrowser_Refresh2_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_Stop_Proxy(
    IWebBrowser* This);
void __RPC_STUB IWebBrowser_Stop_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Application_Proxy(
    IWebBrowser* This,
    IDispatch** ppDisp);
void __RPC_STUB IWebBrowser_get_Application_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Parent_Proxy(
    IWebBrowser* This,
    IDispatch** ppDisp);
void __RPC_STUB IWebBrowser_get_Parent_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Container_Proxy(
    IWebBrowser* This,
    IDispatch** ppDisp);
void __RPC_STUB IWebBrowser_get_Container_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Document_Proxy(
    IWebBrowser* This,
    IDispatch** ppDisp);
void __RPC_STUB IWebBrowser_get_Document_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_TopLevelContainer_Proxy(
    IWebBrowser* This,
    VARIANT_BOOL* pBool);
void __RPC_STUB IWebBrowser_get_TopLevelContainer_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Type_Proxy(
    IWebBrowser* This,
    BSTR* Type);
void __RPC_STUB IWebBrowser_get_Type_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Left_Proxy(
    IWebBrowser* This,
    long* pl);
void __RPC_STUB IWebBrowser_get_Left_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_put_Left_Proxy(
    IWebBrowser* This,
    long Left);
void __RPC_STUB IWebBrowser_put_Left_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Top_Proxy(
    IWebBrowser* This,
    long* pl);
void __RPC_STUB IWebBrowser_get_Top_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_put_Top_Proxy(
    IWebBrowser* This,
    long Top);
void __RPC_STUB IWebBrowser_put_Top_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Width_Proxy(
    IWebBrowser* This,
    long* pl);
void __RPC_STUB IWebBrowser_get_Width_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_put_Width_Proxy(
    IWebBrowser* This,
    long Width);
void __RPC_STUB IWebBrowser_put_Width_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Height_Proxy(
    IWebBrowser* This,
    long* pl);
void __RPC_STUB IWebBrowser_get_Height_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_put_Height_Proxy(
    IWebBrowser* This,
    long Height);
void __RPC_STUB IWebBrowser_put_Height_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_LocationName_Proxy(
    IWebBrowser* This,
    BSTR* LocationName);
void __RPC_STUB IWebBrowser_get_LocationName_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_LocationURL_Proxy(
    IWebBrowser* This,
    BSTR* LocationURL);
void __RPC_STUB IWebBrowser_get_LocationURL_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowser_get_Busy_Proxy(
    IWebBrowser* This,
    VARIANT_BOOL* pBool);
void __RPC_STUB IWebBrowser_get_Busy_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWebBrowser_INTERFACE_DEFINED__ */

#ifndef __IWebBrowserApp_FWD_DEFINED__
#define __IWebBrowserApp_FWD_DEFINED__
typedef struct IWebBrowserApp IWebBrowserApp;
#endif

/*****************************************************************************
 * IWebBrowserApp interface
 */
#ifndef __IWebBrowserApp_INTERFACE_DEFINED__
#define __IWebBrowserApp_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebBrowserApp, 0x0002df05, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IWebBrowserApp : public IWebBrowser
{
    virtual HRESULT STDMETHODCALLTYPE Quit(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClientToWindow(
        int* pcx,
        int* pcy) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutProperty(
        BSTR szProperty,
        VARIANT vtValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProperty(
        BSTR szProperty,
        VARIANT* pvtValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR* Name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HWND(
        long* pHWND) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FullName(
        BSTR* FullName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Path(
        BSTR* Path) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Visible(
        VARIANT_BOOL* pBool) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Visible(
        VARIANT_BOOL Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StatusBar(
        VARIANT_BOOL* pBool) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_StatusBar(
        VARIANT_BOOL Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StatusText(
        BSTR* StatusText) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_StatusText(
        BSTR StatusText) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ToolBar(
        int* Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ToolBar(
        int Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MenuBar(
        VARIANT_BOOL* Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MenuBar(
        VARIANT_BOOL Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FullScreen(
        VARIANT_BOOL* pbFullScreen) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FullScreen(
        VARIANT_BOOL bFullScreen) = 0;

};
#else
typedef struct IWebBrowserAppVtbl IWebBrowserAppVtbl;
struct IWebBrowserApp {
    const IWebBrowserAppVtbl* lpVtbl;
};
struct IWebBrowserAppVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWebBrowserApp* This,
        UINT* pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWebBrowserApp* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo** ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWebBrowserApp* This,
        REFIID riid,
        LPOLESTR* rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID* rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWebBrowserApp* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS* pDispParams,
        VARIANT* pVarResult,
        EXCEPINFO* pExcepInfo,
        UINT* puArgErr);

    /*** IWebBrowser methods ***/
    HRESULT (STDMETHODCALLTYPE *GoBack)(
        IWebBrowserApp* This);

    HRESULT (STDMETHODCALLTYPE *GoForward)(
        IWebBrowserApp* This);

    HRESULT (STDMETHODCALLTYPE *GoHome)(
        IWebBrowserApp* This);

    HRESULT (STDMETHODCALLTYPE *GoSearch)(
        IWebBrowserApp* This);

    HRESULT (STDMETHODCALLTYPE *Navigate)(
        IWebBrowserApp* This,
        BSTR URL,
        VARIANT* Flags,
        VARIANT* TargetFrameName,
        VARIANT* PostData,
        VARIANT* Headers);

    HRESULT (STDMETHODCALLTYPE *Refresh)(
        IWebBrowserApp* This);

    HRESULT (STDMETHODCALLTYPE *Refresh2)(
        IWebBrowserApp* This,
        VARIANT* Level);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IWebBrowserApp* This);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IWebBrowserApp* This,
        IDispatch** ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IWebBrowserApp* This,
        IDispatch** ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_Container)(
        IWebBrowserApp* This,
        IDispatch** ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_Document)(
        IWebBrowserApp* This,
        IDispatch** ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_TopLevelContainer)(
        IWebBrowserApp* This,
        VARIANT_BOOL* pBool);

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IWebBrowserApp* This,
        BSTR* Type);

    HRESULT (STDMETHODCALLTYPE *get_Left)(
        IWebBrowserApp* This,
        long* pl);

    HRESULT (STDMETHODCALLTYPE *put_Left)(
        IWebBrowserApp* This,
        long Left);

    HRESULT (STDMETHODCALLTYPE *get_Top)(
        IWebBrowserApp* This,
        long* pl);

    HRESULT (STDMETHODCALLTYPE *put_Top)(
        IWebBrowserApp* This,
        long Top);

    HRESULT (STDMETHODCALLTYPE *get_Width)(
        IWebBrowserApp* This,
        long* pl);

    HRESULT (STDMETHODCALLTYPE *put_Width)(
        IWebBrowserApp* This,
        long Width);

    HRESULT (STDMETHODCALLTYPE *get_Height)(
        IWebBrowserApp* This,
        long* pl);

    HRESULT (STDMETHODCALLTYPE *put_Height)(
        IWebBrowserApp* This,
        long Height);

    HRESULT (STDMETHODCALLTYPE *get_LocationName)(
        IWebBrowserApp* This,
        BSTR* LocationName);

    HRESULT (STDMETHODCALLTYPE *get_LocationURL)(
        IWebBrowserApp* This,
        BSTR* LocationURL);

    HRESULT (STDMETHODCALLTYPE *get_Busy)(
        IWebBrowserApp* This,
        VARIANT_BOOL* pBool);

    /*** IWebBrowserApp methods ***/
    HRESULT (STDMETHODCALLTYPE *Quit)(
        IWebBrowserApp* This);

    HRESULT (STDMETHODCALLTYPE *ClientToWindow)(
        IWebBrowserApp* This,
        int* pcx,
        int* pcy);

    HRESULT (STDMETHODCALLTYPE *PutProperty)(
        IWebBrowserApp* This,
        BSTR szProperty,
        VARIANT vtValue);

    HRESULT (STDMETHODCALLTYPE *GetProperty)(
        IWebBrowserApp* This,
        BSTR szProperty,
        VARIANT* pvtValue);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IWebBrowserApp* This,
        BSTR* Name);

    HRESULT (STDMETHODCALLTYPE *get_HWND)(
        IWebBrowserApp* This,
        long* pHWND);

    HRESULT (STDMETHODCALLTYPE *get_FullName)(
        IWebBrowserApp* This,
        BSTR* FullName);

    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IWebBrowserApp* This,
        BSTR* Path);

    HRESULT (STDMETHODCALLTYPE *get_Visible)(
        IWebBrowserApp* This,
        VARIANT_BOOL* pBool);

    HRESULT (STDMETHODCALLTYPE *put_Visible)(
        IWebBrowserApp* This,
        VARIANT_BOOL Value);

    HRESULT (STDMETHODCALLTYPE *get_StatusBar)(
        IWebBrowserApp* This,
        VARIANT_BOOL* pBool);

    HRESULT (STDMETHODCALLTYPE *put_StatusBar)(
        IWebBrowserApp* This,
        VARIANT_BOOL Value);

    HRESULT (STDMETHODCALLTYPE *get_StatusText)(
        IWebBrowserApp* This,
        BSTR* StatusText);

    HRESULT (STDMETHODCALLTYPE *put_StatusText)(
        IWebBrowserApp* This,
        BSTR StatusText);

    HRESULT (STDMETHODCALLTYPE *get_ToolBar)(
        IWebBrowserApp* This,
        int* Value);

    HRESULT (STDMETHODCALLTYPE *put_ToolBar)(
        IWebBrowserApp* This,
        int Value);

    HRESULT (STDMETHODCALLTYPE *get_MenuBar)(
        IWebBrowserApp* This,
        VARIANT_BOOL* Value);

    HRESULT (STDMETHODCALLTYPE *put_MenuBar)(
        IWebBrowserApp* This,
        VARIANT_BOOL Value);

    HRESULT (STDMETHODCALLTYPE *get_FullScreen)(
        IWebBrowserApp* This,
        VARIANT_BOOL* pbFullScreen);

    HRESULT (STDMETHODCALLTYPE *put_FullScreen)(
        IWebBrowserApp* This,
        VARIANT_BOOL bFullScreen);

};

/*** IUnknown methods ***/
#define IWebBrowserApp_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IWebBrowserApp_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IWebBrowserApp_Release(p) (p)->lpVtbl->Release(p)
/*** IDispatch methods ***/
#define IWebBrowserApp_GetTypeInfoCount(p,a) (p)->lpVtbl->GetTypeInfoCount(p,a)
#define IWebBrowserApp_GetTypeInfo(p,a,b,c) (p)->lpVtbl->GetTypeInfo(p,a,b,c)
#define IWebBrowserApp_GetIDsOfNames(p,a,b,c,d,e) (p)->lpVtbl->GetIDsOfNames(p,a,b,c,d,e)
#define IWebBrowserApp_Invoke(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->Invoke(p,a,b,c,d,e,f,g,h)
/*** IWebBrowser methods ***/
#define IWebBrowserApp_GoBack(p) (p)->lpVtbl->GoBack(p)
#define IWebBrowserApp_GoForward(p) (p)->lpVtbl->GoForward(p)
#define IWebBrowserApp_GoHome(p) (p)->lpVtbl->GoHome(p)
#define IWebBrowserApp_GoSearch(p) (p)->lpVtbl->GoSearch(p)
#define IWebBrowserApp_Navigate(p,a,b,c,d,e) (p)->lpVtbl->Navigate(p,a,b,c,d,e)
#define IWebBrowserApp_Refresh(p) (p)->lpVtbl->Refresh(p)
#define IWebBrowserApp_Refresh2(p,a) (p)->lpVtbl->Refresh2(p,a)
#define IWebBrowserApp_Stop(p) (p)->lpVtbl->Stop(p)
#define IWebBrowserApp_get_Application(p,a) (p)->lpVtbl->get_Application(p,a)
#define IWebBrowserApp_get_Parent(p,a) (p)->lpVtbl->get_Parent(p,a)
#define IWebBrowserApp_get_Container(p,a) (p)->lpVtbl->get_Container(p,a)
#define IWebBrowserApp_get_Document(p,a) (p)->lpVtbl->get_Document(p,a)
#define IWebBrowserApp_get_TopLevelContainer(p,a) (p)->lpVtbl->get_TopLevelContainer(p,a)
#define IWebBrowserApp_get_Type(p,a) (p)->lpVtbl->get_Type(p,a)
#define IWebBrowserApp_get_Left(p,a) (p)->lpVtbl->get_Left(p,a)
#define IWebBrowserApp_put_Left(p,a) (p)->lpVtbl->put_Left(p,a)
#define IWebBrowserApp_get_Top(p,a) (p)->lpVtbl->get_Top(p,a)
#define IWebBrowserApp_put_Top(p,a) (p)->lpVtbl->put_Top(p,a)
#define IWebBrowserApp_get_Width(p,a) (p)->lpVtbl->get_Width(p,a)
#define IWebBrowserApp_put_Width(p,a) (p)->lpVtbl->put_Width(p,a)
#define IWebBrowserApp_get_Height(p,a) (p)->lpVtbl->get_Height(p,a)
#define IWebBrowserApp_put_Height(p,a) (p)->lpVtbl->put_Height(p,a)
#define IWebBrowserApp_get_LocationName(p,a) (p)->lpVtbl->get_LocationName(p,a)
#define IWebBrowserApp_get_LocationURL(p,a) (p)->lpVtbl->get_LocationURL(p,a)
#define IWebBrowserApp_get_Busy(p,a) (p)->lpVtbl->get_Busy(p,a)
/*** IWebBrowserApp methods ***/
#define IWebBrowserApp_Quit(p) (p)->lpVtbl->Quit(p)
#define IWebBrowserApp_ClientToWindow(p,a,b) (p)->lpVtbl->ClientToWindow(p,a,b)
#define IWebBrowserApp_PutProperty(p,a,b) (p)->lpVtbl->PutProperty(p,a,b)
#define IWebBrowserApp_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b)
#define IWebBrowserApp_get_Name(p,a) (p)->lpVtbl->get_Name(p,a)
#define IWebBrowserApp_get_HWND(p,a) (p)->lpVtbl->get_HWND(p,a)
#define IWebBrowserApp_get_FullName(p,a) (p)->lpVtbl->get_FullName(p,a)
#define IWebBrowserApp_get_Path(p,a) (p)->lpVtbl->get_Path(p,a)
#define IWebBrowserApp_get_Visible(p,a) (p)->lpVtbl->get_Visible(p,a)
#define IWebBrowserApp_put_Visible(p,a) (p)->lpVtbl->put_Visible(p,a)
#define IWebBrowserApp_get_StatusBar(p,a) (p)->lpVtbl->get_StatusBar(p,a)
#define IWebBrowserApp_put_StatusBar(p,a) (p)->lpVtbl->put_StatusBar(p,a)
#define IWebBrowserApp_get_StatusText(p,a) (p)->lpVtbl->get_StatusText(p,a)
#define IWebBrowserApp_put_StatusText(p,a) (p)->lpVtbl->put_StatusText(p,a)
#define IWebBrowserApp_get_ToolBar(p,a) (p)->lpVtbl->get_ToolBar(p,a)
#define IWebBrowserApp_put_ToolBar(p,a) (p)->lpVtbl->put_ToolBar(p,a)
#define IWebBrowserApp_get_MenuBar(p,a) (p)->lpVtbl->get_MenuBar(p,a)
#define IWebBrowserApp_put_MenuBar(p,a) (p)->lpVtbl->put_MenuBar(p,a)
#define IWebBrowserApp_get_FullScreen(p,a) (p)->lpVtbl->get_FullScreen(p,a)
#define IWebBrowserApp_put_FullScreen(p,a) (p)->lpVtbl->put_FullScreen(p,a)

#endif

#define IWebBrowserApp_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IDispatch methods ***/ \
    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ UINT* pctinfo) PURE; \
    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) PURE; \
    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) PURE; \
    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) PURE; \
    /*** IWebBrowser methods ***/ \
    STDMETHOD_(HRESULT,GoBack)(THIS) PURE; \
    STDMETHOD_(HRESULT,GoForward)(THIS) PURE; \
    STDMETHOD_(HRESULT,GoHome)(THIS) PURE; \
    STDMETHOD_(HRESULT,GoSearch)(THIS) PURE; \
    STDMETHOD_(HRESULT,Navigate)(THIS_ BSTR URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers) PURE; \
    STDMETHOD_(HRESULT,Refresh)(THIS) PURE; \
    STDMETHOD_(HRESULT,Refresh2)(THIS_ VARIANT* Level) PURE; \
    STDMETHOD_(HRESULT,Stop)(THIS) PURE; \
    STDMETHOD_(HRESULT,get_Application)(THIS_ IDispatch** ppDisp) PURE; \
    STDMETHOD_(HRESULT,get_Parent)(THIS_ IDispatch** ppDisp) PURE; \
    STDMETHOD_(HRESULT,get_Container)(THIS_ IDispatch** ppDisp) PURE; \
    STDMETHOD_(HRESULT,get_Document)(THIS_ IDispatch** ppDisp) PURE; \
    STDMETHOD_(HRESULT,get_TopLevelContainer)(THIS_ VARIANT_BOOL* pBool) PURE; \
    STDMETHOD_(HRESULT,get_Type)(THIS_ BSTR* Type) PURE; \
    STDMETHOD_(HRESULT,get_Left)(THIS_ long* pl) PURE; \
    STDMETHOD_(HRESULT,put_Left)(THIS_ long Left) PURE; \
    STDMETHOD_(HRESULT,get_Top)(THIS_ long* pl) PURE; \
    STDMETHOD_(HRESULT,put_Top)(THIS_ long Top) PURE; \
    STDMETHOD_(HRESULT,get_Width)(THIS_ long* pl) PURE; \
    STDMETHOD_(HRESULT,put_Width)(THIS_ long Width) PURE; \
    STDMETHOD_(HRESULT,get_Height)(THIS_ long* pl) PURE; \
    STDMETHOD_(HRESULT,put_Height)(THIS_ long Height) PURE; \
    STDMETHOD_(HRESULT,get_LocationName)(THIS_ BSTR* LocationName) PURE; \
    STDMETHOD_(HRESULT,get_LocationURL)(THIS_ BSTR* LocationURL) PURE; \
    STDMETHOD_(HRESULT,get_Busy)(THIS_ VARIANT_BOOL* pBool) PURE; \
    /*** IWebBrowserApp methods ***/ \
    STDMETHOD_(HRESULT,Quit)(THIS) PURE; \
    STDMETHOD_(HRESULT,ClientToWindow)(THIS_ int* pcx, int* pcy) PURE; \
    STDMETHOD_(HRESULT,PutProperty)(THIS_ BSTR szProperty, VARIANT vtValue) PURE; \
    STDMETHOD_(HRESULT,GetProperty)(THIS_ BSTR szProperty, VARIANT* pvtValue) PURE; \
    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR* Name) PURE; \
    STDMETHOD_(HRESULT,get_HWND)(THIS_ long* pHWND) PURE; \
    STDMETHOD_(HRESULT,get_FullName)(THIS_ BSTR* FullName) PURE; \
    STDMETHOD_(HRESULT,get_Path)(THIS_ BSTR* Path) PURE; \
    STDMETHOD_(HRESULT,get_Visible)(THIS_ VARIANT_BOOL* pBool) PURE; \
    STDMETHOD_(HRESULT,put_Visible)(THIS_ VARIANT_BOOL Value) PURE; \
    STDMETHOD_(HRESULT,get_StatusBar)(THIS_ VARIANT_BOOL* pBool) PURE; \
    STDMETHOD_(HRESULT,put_StatusBar)(THIS_ VARIANT_BOOL Value) PURE; \
    STDMETHOD_(HRESULT,get_StatusText)(THIS_ BSTR* StatusText) PURE; \
    STDMETHOD_(HRESULT,put_StatusText)(THIS_ BSTR StatusText) PURE; \
    STDMETHOD_(HRESULT,get_ToolBar)(THIS_ int* Value) PURE; \
    STDMETHOD_(HRESULT,put_ToolBar)(THIS_ int Value) PURE; \
    STDMETHOD_(HRESULT,get_MenuBar)(THIS_ VARIANT_BOOL* Value) PURE; \
    STDMETHOD_(HRESULT,put_MenuBar)(THIS_ VARIANT_BOOL Value) PURE; \
    STDMETHOD_(HRESULT,get_FullScreen)(THIS_ VARIANT_BOOL* pbFullScreen) PURE; \
    STDMETHOD_(HRESULT,put_FullScreen)(THIS_ VARIANT_BOOL bFullScreen) PURE;

HRESULT CALLBACK IWebBrowserApp_Quit_Proxy(
    IWebBrowserApp* This);
void __RPC_STUB IWebBrowserApp_Quit_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_ClientToWindow_Proxy(
    IWebBrowserApp* This,
    int* pcx,
    int* pcy);
void __RPC_STUB IWebBrowserApp_ClientToWindow_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_PutProperty_Proxy(
    IWebBrowserApp* This,
    BSTR szProperty,
    VARIANT vtValue);
void __RPC_STUB IWebBrowserApp_PutProperty_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_GetProperty_Proxy(
    IWebBrowserApp* This,
    BSTR szProperty,
    VARIANT* pvtValue);
void __RPC_STUB IWebBrowserApp_GetProperty_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_Name_Proxy(
    IWebBrowserApp* This,
    BSTR* Name);
void __RPC_STUB IWebBrowserApp_get_Name_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_HWND_Proxy(
    IWebBrowserApp* This,
    long* pHWND);
void __RPC_STUB IWebBrowserApp_get_HWND_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_FullName_Proxy(
    IWebBrowserApp* This,
    BSTR* FullName);
void __RPC_STUB IWebBrowserApp_get_FullName_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_Path_Proxy(
    IWebBrowserApp* This,
    BSTR* Path);
void __RPC_STUB IWebBrowserApp_get_Path_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_Visible_Proxy(
    IWebBrowserApp* This,
    VARIANT_BOOL* pBool);
void __RPC_STUB IWebBrowserApp_get_Visible_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_put_Visible_Proxy(
    IWebBrowserApp* This,
    VARIANT_BOOL Value);
void __RPC_STUB IWebBrowserApp_put_Visible_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_StatusBar_Proxy(
    IWebBrowserApp* This,
    VARIANT_BOOL* pBool);
void __RPC_STUB IWebBrowserApp_get_StatusBar_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_put_StatusBar_Proxy(
    IWebBrowserApp* This,
    VARIANT_BOOL Value);
void __RPC_STUB IWebBrowserApp_put_StatusBar_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_StatusText_Proxy(
    IWebBrowserApp* This,
    BSTR* StatusText);
void __RPC_STUB IWebBrowserApp_get_StatusText_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_put_StatusText_Proxy(
    IWebBrowserApp* This,
    BSTR StatusText);
void __RPC_STUB IWebBrowserApp_put_StatusText_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_ToolBar_Proxy(
    IWebBrowserApp* This,
    int* Value);
void __RPC_STUB IWebBrowserApp_get_ToolBar_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_put_ToolBar_Proxy(
    IWebBrowserApp* This,
    int Value);
void __RPC_STUB IWebBrowserApp_put_ToolBar_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_MenuBar_Proxy(
    IWebBrowserApp* This,
    VARIANT_BOOL* Value);
void __RPC_STUB IWebBrowserApp_get_MenuBar_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_put_MenuBar_Proxy(
    IWebBrowserApp* This,
    VARIANT_BOOL Value);
void __RPC_STUB IWebBrowserApp_put_MenuBar_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_get_FullScreen_Proxy(
    IWebBrowserApp* This,
    VARIANT_BOOL* pbFullScreen);
void __RPC_STUB IWebBrowserApp_get_FullScreen_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IWebBrowserApp_put_FullScreen_Proxy(
    IWebBrowserApp* This,
    VARIANT_BOOL bFullScreen);
void __RPC_STUB IWebBrowserApp_put_FullScreen_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWebBrowserApp_INTERFACE_DEFINED__ */

DEFINE_GUID(CLSID_WebBrowser, 0x8856f961, 0x340a, 0x11d0, 0xa9, 0x6b, 0x00, 0xc0, 0x4f, 0xd7, 0x05, 0xa2);
#ifdef __cplusplus
}
#endif
#endif /* __WIDL_EXDISP_H */
