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

#ifndef __WIDL_ACTIVSCP_H
#define __WIDL_ACTIVSCP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <ocidl.h>
#include <oleidl.h>
#include <oaidl.h>
typedef enum tagSCRIPTSTATE {
    SCRIPTSTATE_UNINITIALIZED = 0,
    SCRIPTSTATE_STARTED = 1,
    SCRIPTSTATE_CONNECTED = 2,
    SCRIPTSTATE_DISCONNECTED = 3,
    SCRIPTSTATE_CLOSED = 4,
    SCRIPTSTATE_INITIALIZED = 5
} SCRIPTSTATE;

typedef enum tagSCRIPTTHREADSTATE {
    SCRIPTTHREADSTATE_NOTINSCRIPT = 0,
    SCRIPTTHREADSTATE_RUNNING = 1
} SCRIPTTHREADSTATE;

typedef DWORD SCRIPTTHREADID;

#define SCRIPTTHREADID_CURRENT ((SCRIPTTHREADID)-1)
#define SCRIPTTHREADID_BASE ((SCRIPTTHREADID)-2)
#define SCRIPTTHREADID_ALL ((SCRIPTTHREADID)-3)
#define SCRIPTITEM_ISVISIBLE           0x00000002
#define SCRIPTITEM_ISSOURCE            0x00000004
#define SCRIPTITEM_GLOBALMEMBERS       0x00000008
#define SCRIPTITEM_ISPERSISTENT        0x00000040
#define SCRIPTITEM_CODEONLY            0x00000200
#define SCRIPTITEM_NOCODE              0x00000400
#define SCRIPTITEM_ALL_FLAGS           (SCRIPTITEM_ISSOURCE | \
                                        SCRIPTITEM_ISVISIBLE | \
                                        SCRIPTITEM_ISPERSISTENT | \
                                        SCRIPTITEM_GLOBALMEMBERS | \
                                        SCRIPTITEM_NOCODE | \
                                        SCRIPTITEM_CODEONLY)
#define SCRIPTTYPELIB_ISCONTROL        0x00000010
#define SCRIPTTYPELIB_ISPERSISTENT     0x00000040
#define SCRIPTTYPELIB_ALL_FLAGS        (SCRIPTTEXT_ISCONTROL | SCRIPTTYPELIB_ISPERSISTENT)
#define SCRIPTTEXT_DELAYEXECUTION      0x00000001
#define SCRIPTTEXT_ISVISIBLE           0x00000002
#define SCRIPTTEXT_ISEXPRESSION        0x00000020
#define SCRIPTTEXT_ISPERSISTENT        0x00000040
#define SCRIPTTEXT_HOSTMANAGESSOURCE   0x00000080
#define SCRIPTTEXT_ALL_FLAGS           (SCRIPTTEXT_DELAYEXECUTION | \
                                        SCRIPTTEXT_ISVISIBLE | \
                                        SCRIPTTEXT_ISEXPRESSION | \
                                        SCRIPTTEXT_ISPERSISTENT | \
                                        SCRIPTTEXT_HOSTMANAGESSOURCE)
#define SCRIPTPROC_HOSTMANAGESSOURCE   0x00000080
#define SCRIPTPROC_IMPLICIT_THIS       0x00000100
#define SCRIPTPROC_IMPLICIT_PARENTS    0x00000200
#define SCRIPTPROC_ALL_FLAGS           (SCRIPTPROC_HOSTMANAGESSOURCE | \
                                        SCRIPTPROC_IMPLICIT_THIS | \
                                        SCRIPTPROC_IMPLICIT_PARENTS)
#define SCRIPTINFO_IUNKNOWN            0x00000001
#define SCRIPTINFO_ITYPEINFO           0x00000002
#define SCRIPTINFO_ALL_FLAGS           (SCRIPTINFO_IUNKNOWN | SCRIPTINFO_ITYPEINFO)
#define SCRIPTINTERRUPT_DEBUG          0x00000001
#define SCRIPTINTERRUPT_RAISEEXCEPTION 0x00000002
#define SCRIPTINTERRUPT_ALL_FLAGS      (SCRIPTINTERRUPT_DEBUG | SCRIPTINTERRUPT_RAISEEXCEPTION)
#define SCRIPTSTAT_STATEMENT_COUNT      1
#define SCRIPTSTAT_INSTRUCTION_COUNT    2
#define SCRIPTSTAT_INTSTRUCTION_TIME    3
#define SCRIPTSTAT_TOTAL_TIME           4
#ifndef __IActiveScriptError_FWD_DEFINED__
#define __IActiveScriptError_FWD_DEFINED__
typedef struct IActiveScriptError IActiveScriptError;
#endif

/*****************************************************************************
 * IActiveScriptError interface
 */
#ifndef __IActiveScriptError_INTERFACE_DEFINED__
#define __IActiveScriptError_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptError, 0xeae1ba61, 0xa4ed, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IActiveScriptError : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetExceptionInfo(
        EXCEPINFO* pexcepinfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSourcePosition(
        DWORD* pdwSourceContext,
        ULONG* pulLineNumber,
        LONG* plCharacterPosition) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSourceLineText(
        BSTR* pbstrSourceLine) = 0;

};
#else
typedef struct IActiveScriptErrorVtbl IActiveScriptErrorVtbl;
struct IActiveScriptError {
    const IActiveScriptErrorVtbl* lpVtbl;
};
struct IActiveScriptErrorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptError methods ***/
    HRESULT (STDMETHODCALLTYPE *GetExceptionInfo)(
        IActiveScriptError* This,
        EXCEPINFO* pexcepinfo);

    HRESULT (STDMETHODCALLTYPE *GetSourcePosition)(
        IActiveScriptError* This,
        DWORD* pdwSourceContext,
        ULONG* pulLineNumber,
        LONG* plCharacterPosition);

    HRESULT (STDMETHODCALLTYPE *GetSourceLineText)(
        IActiveScriptError* This,
        BSTR* pbstrSourceLine);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IActiveScriptError_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IActiveScriptError_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IActiveScriptError_Release(p) (p)->lpVtbl->Release(p)
/*** IActiveScriptError methods ***/
#define IActiveScriptError_GetExceptionInfo(p,a) (p)->lpVtbl->GetExceptionInfo(p,a)
#define IActiveScriptError_GetSourcePosition(p,a,b,c) (p)->lpVtbl->GetSourcePosition(p,a,b,c)
#define IActiveScriptError_GetSourceLineText(p,a) (p)->lpVtbl->GetSourceLineText(p,a)
#endif

#endif

#define IActiveScriptError_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IActiveScriptError methods ***/ \
    STDMETHOD_(HRESULT,GetExceptionInfo)(THIS_ EXCEPINFO* pexcepinfo) PURE; \
    STDMETHOD_(HRESULT,GetSourcePosition)(THIS_ DWORD* pdwSourceContext, ULONG* pulLineNumber, LONG* plCharacterPosition) PURE; \
    STDMETHOD_(HRESULT,GetSourceLineText)(THIS_ BSTR* pbstrSourceLine) PURE;

HRESULT CALLBACK IActiveScriptError_GetExceptionInfo_Proxy(
    IActiveScriptError* This,
    EXCEPINFO* pexcepinfo);
void __RPC_STUB IActiveScriptError_GetExceptionInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptError_GetSourcePosition_Proxy(
    IActiveScriptError* This,
    DWORD* pdwSourceContext,
    ULONG* pulLineNumber,
    LONG* plCharacterPosition);
void __RPC_STUB IActiveScriptError_GetSourcePosition_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptError_GetSourceLineText_Proxy(
    IActiveScriptError* This,
    BSTR* pbstrSourceLine);
void __RPC_STUB IActiveScriptError_GetSourceLineText_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActiveScriptError_INTERFACE_DEFINED__ */

#ifndef __IActiveScriptSite_FWD_DEFINED__
#define __IActiveScriptSite_FWD_DEFINED__
typedef struct IActiveScriptSite IActiveScriptSite;
#endif

/*****************************************************************************
 * IActiveScriptSite interface
 */
#ifndef __IActiveScriptSite_INTERFACE_DEFINED__
#define __IActiveScriptSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptSite, 0xdb01a1e3, 0xa42b, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IActiveScriptSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetLCID(
        LCID* plcid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemInfo(
        LPCOLESTR pstrName,
        DWORD dwReturnMask,
        IUnknown** ppiunkItem,
        ITypeInfo** ppti) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocVersionString(
        BSTR* pbstrVersion) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnScriptTerminate(
        const VARIANT* pvarResult,
        const EXCEPINFO* pexcepinfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnStateChange(
        SCRIPTSTATE ssScriptState) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnScriptError(
        IActiveScriptError* pscripterror) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnEnterScript(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnLeaveScript(
        ) = 0;

};
#else
typedef struct IActiveScriptSiteVtbl IActiveScriptSiteVtbl;
struct IActiveScriptSite {
    const IActiveScriptSiteVtbl* lpVtbl;
};
struct IActiveScriptSiteVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptSite methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLCID)(
        IActiveScriptSite* This,
        LCID* plcid);

    HRESULT (STDMETHODCALLTYPE *GetItemInfo)(
        IActiveScriptSite* This,
        LPCOLESTR pstrName,
        DWORD dwReturnMask,
        IUnknown** ppiunkItem,
        ITypeInfo** ppti);

    HRESULT (STDMETHODCALLTYPE *GetDocVersionString)(
        IActiveScriptSite* This,
        BSTR* pbstrVersion);

    HRESULT (STDMETHODCALLTYPE *OnScriptTerminate)(
        IActiveScriptSite* This,
        const VARIANT* pvarResult,
        const EXCEPINFO* pexcepinfo);

    HRESULT (STDMETHODCALLTYPE *OnStateChange)(
        IActiveScriptSite* This,
        SCRIPTSTATE ssScriptState);

    HRESULT (STDMETHODCALLTYPE *OnScriptError)(
        IActiveScriptSite* This,
        IActiveScriptError* pscripterror);

    HRESULT (STDMETHODCALLTYPE *OnEnterScript)(
        IActiveScriptSite* This);

    HRESULT (STDMETHODCALLTYPE *OnLeaveScript)(
        IActiveScriptSite* This);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IActiveScriptSite_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IActiveScriptSite_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IActiveScriptSite_Release(p) (p)->lpVtbl->Release(p)
/*** IActiveScriptSite methods ***/
#define IActiveScriptSite_GetLCID(p,a) (p)->lpVtbl->GetLCID(p,a)
#define IActiveScriptSite_GetItemInfo(p,a,b,c,d) (p)->lpVtbl->GetItemInfo(p,a,b,c,d)
#define IActiveScriptSite_GetDocVersionString(p,a) (p)->lpVtbl->GetDocVersionString(p,a)
#define IActiveScriptSite_OnScriptTerminate(p,a,b) (p)->lpVtbl->OnScriptTerminate(p,a,b)
#define IActiveScriptSite_OnStateChange(p,a) (p)->lpVtbl->OnStateChange(p,a)
#define IActiveScriptSite_OnScriptError(p,a) (p)->lpVtbl->OnScriptError(p,a)
#define IActiveScriptSite_OnEnterScript(p) (p)->lpVtbl->OnEnterScript(p)
#define IActiveScriptSite_OnLeaveScript(p) (p)->lpVtbl->OnLeaveScript(p)
#endif

#endif

#define IActiveScriptSite_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IActiveScriptSite methods ***/ \
    STDMETHOD_(HRESULT,GetLCID)(THIS_ LCID* plcid) PURE; \
    STDMETHOD_(HRESULT,GetItemInfo)(THIS_ LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown** ppiunkItem, ITypeInfo** ppti) PURE; \
    STDMETHOD_(HRESULT,GetDocVersionString)(THIS_ BSTR* pbstrVersion) PURE; \
    STDMETHOD_(HRESULT,OnScriptTerminate)(THIS_ const VARIANT* pvarResult, const EXCEPINFO* pexcepinfo) PURE; \
    STDMETHOD_(HRESULT,OnStateChange)(THIS_ SCRIPTSTATE ssScriptState) PURE; \
    STDMETHOD_(HRESULT,OnScriptError)(THIS_ IActiveScriptError* pscripterror) PURE; \
    STDMETHOD_(HRESULT,OnEnterScript)(THIS) PURE; \
    STDMETHOD_(HRESULT,OnLeaveScript)(THIS) PURE;

HRESULT CALLBACK IActiveScriptSite_GetLCID_Proxy(
    IActiveScriptSite* This,
    LCID* plcid);
void __RPC_STUB IActiveScriptSite_GetLCID_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptSite_GetItemInfo_Proxy(
    IActiveScriptSite* This,
    LPCOLESTR pstrName,
    DWORD dwReturnMask,
    IUnknown** ppiunkItem,
    ITypeInfo** ppti);
void __RPC_STUB IActiveScriptSite_GetItemInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptSite_GetDocVersionString_Proxy(
    IActiveScriptSite* This,
    BSTR* pbstrVersion);
void __RPC_STUB IActiveScriptSite_GetDocVersionString_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptSite_OnScriptTerminate_Proxy(
    IActiveScriptSite* This,
    const VARIANT* pvarResult,
    const EXCEPINFO* pexcepinfo);
void __RPC_STUB IActiveScriptSite_OnScriptTerminate_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptSite_OnStateChange_Proxy(
    IActiveScriptSite* This,
    SCRIPTSTATE ssScriptState);
void __RPC_STUB IActiveScriptSite_OnStateChange_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptSite_OnScriptError_Proxy(
    IActiveScriptSite* This,
    IActiveScriptError* pscripterror);
void __RPC_STUB IActiveScriptSite_OnScriptError_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptSite_OnEnterScript_Proxy(
    IActiveScriptSite* This);
void __RPC_STUB IActiveScriptSite_OnEnterScript_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptSite_OnLeaveScript_Proxy(
    IActiveScriptSite* This);
void __RPC_STUB IActiveScriptSite_OnLeaveScript_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActiveScriptSite_INTERFACE_DEFINED__ */

typedef IActiveScriptSite *PIActiveScriptSite;
#ifndef __IActiveScriptSiteWindow_FWD_DEFINED__
#define __IActiveScriptSiteWindow_FWD_DEFINED__
typedef struct IActiveScriptSiteWindow IActiveScriptSiteWindow;
#endif

/*****************************************************************************
 * IActiveScriptSiteWindow interface
 */
#ifndef __IActiveScriptSiteWindow_INTERFACE_DEFINED__
#define __IActiveScriptSiteWindow_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptSiteWindow, 0xd10f6761, 0x83e9, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IActiveScriptSiteWindow : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetWindow(
        HWND* phwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableModeless(
        BOOL fEnable) = 0;

};
#else
typedef struct IActiveScriptSiteWindowVtbl IActiveScriptSiteWindowVtbl;
struct IActiveScriptSiteWindow {
    const IActiveScriptSiteWindowVtbl* lpVtbl;
};
struct IActiveScriptSiteWindowVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptSiteWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IActiveScriptSiteWindow* This,
        HWND* phwnd);

    HRESULT (STDMETHODCALLTYPE *EnableModeless)(
        IActiveScriptSiteWindow* This,
        BOOL fEnable);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IActiveScriptSiteWindow_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IActiveScriptSiteWindow_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IActiveScriptSiteWindow_Release(p) (p)->lpVtbl->Release(p)
/*** IActiveScriptSiteWindow methods ***/
#define IActiveScriptSiteWindow_GetWindow(p,a) (p)->lpVtbl->GetWindow(p,a)
#define IActiveScriptSiteWindow_EnableModeless(p,a) (p)->lpVtbl->EnableModeless(p,a)
#endif

#endif

#define IActiveScriptSiteWindow_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IActiveScriptSiteWindow methods ***/ \
    STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND* phwnd) PURE; \
    STDMETHOD_(HRESULT,EnableModeless)(THIS_ BOOL fEnable) PURE;

HRESULT CALLBACK IActiveScriptSiteWindow_GetWindow_Proxy(
    IActiveScriptSiteWindow* This,
    HWND* phwnd);
void __RPC_STUB IActiveScriptSiteWindow_GetWindow_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptSiteWindow_EnableModeless_Proxy(
    IActiveScriptSiteWindow* This,
    BOOL fEnable);
void __RPC_STUB IActiveScriptSiteWindow_EnableModeless_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActiveScriptSiteWindow_INTERFACE_DEFINED__ */

#ifndef __IActiveScriptSiteInterruptPoll_FWD_DEFINED__
#define __IActiveScriptSiteInterruptPoll_FWD_DEFINED__
typedef struct IActiveScriptSiteInterruptPoll IActiveScriptSiteInterruptPoll;
#endif

/*****************************************************************************
 * IActiveScriptSiteInterruptPoll interface
 */
#ifndef __IActiveScriptSiteInterruptPoll_INTERFACE_DEFINED__
#define __IActiveScriptSiteInterruptPoll_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptSiteInterruptPoll, 0x539698a0, 0xcdca, 0x11cf, 0xa5,0xeb, 0x00,0xaa,0x00,0x47,0xa0,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IActiveScriptSiteInterruptPoll : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryContinue(
        ) = 0;

};
#else
typedef struct IActiveScriptSiteInterruptPollVtbl IActiveScriptSiteInterruptPollVtbl;
struct IActiveScriptSiteInterruptPoll {
    const IActiveScriptSiteInterruptPollVtbl* lpVtbl;
};
struct IActiveScriptSiteInterruptPollVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptSiteInterruptPoll methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryContinue)(
        IActiveScriptSiteInterruptPoll* This);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IActiveScriptSiteInterruptPoll_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IActiveScriptSiteInterruptPoll_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IActiveScriptSiteInterruptPoll_Release(p) (p)->lpVtbl->Release(p)
/*** IActiveScriptSiteInterruptPoll methods ***/
#define IActiveScriptSiteInterruptPoll_QueryContinue(p) (p)->lpVtbl->QueryContinue(p)
#endif

#endif

#define IActiveScriptSiteInterruptPoll_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IActiveScriptSiteInterruptPoll methods ***/ \
    STDMETHOD_(HRESULT,QueryContinue)(THIS) PURE;

HRESULT CALLBACK IActiveScriptSiteInterruptPoll_QueryContinue_Proxy(
    IActiveScriptSiteInterruptPoll* This);
void __RPC_STUB IActiveScriptSiteInterruptPoll_QueryContinue_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActiveScriptSiteInterruptPoll_INTERFACE_DEFINED__ */

#ifndef __IActiveScript_FWD_DEFINED__
#define __IActiveScript_FWD_DEFINED__
typedef struct IActiveScript IActiveScript;
#endif

/*****************************************************************************
 * IActiveScript interface
 */
#ifndef __IActiveScript_INTERFACE_DEFINED__
#define __IActiveScript_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScript, 0xbb1a2ae1, 0xa4f9, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IActiveScript : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetScriptSite(
        IActiveScriptSite* pass) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptSite(
        REFIID riid,
        void** ppvObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetScriptState(
        SCRIPTSTATE ss) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptState(
        SCRIPTSTATE* pssState) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddNamedItem(
        LPCOLESTR pstrName,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddTypeLib(
        REFGUID rguidTypeLib,
        DWORD dwMajor,
        DWORD dwMinor,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptDispatch(
        LPCOLESTR pstrItemName,
        IDispatch** ppdisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentScriptThreadID(
        SCRIPTTHREADID* pstidThread) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptThreadID(
        DWORD dwWin32ThreadId,
        SCRIPTTHREADID* pstidThread) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptThreadState(
        SCRIPTTHREADID stidThread,
        SCRIPTTHREADSTATE* pstsState) = 0;

    virtual HRESULT STDMETHODCALLTYPE InterruptScriptThread(
        SCRIPTTHREADID stidThread,
        const EXCEPINFO* pexcepinfo,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IActiveScript** ppscript) = 0;

};
#else
typedef struct IActiveScriptVtbl IActiveScriptVtbl;
struct IActiveScript {
    const IActiveScriptVtbl* lpVtbl;
};
struct IActiveScriptVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScript methods ***/
    HRESULT (STDMETHODCALLTYPE *SetScriptSite)(
        IActiveScript* This,
        IActiveScriptSite* pass);

    HRESULT (STDMETHODCALLTYPE *GetScriptSite)(
        IActiveScript* This,
        REFIID riid,
        void** ppvObject);

    HRESULT (STDMETHODCALLTYPE *SetScriptState)(
        IActiveScript* This,
        SCRIPTSTATE ss);

    HRESULT (STDMETHODCALLTYPE *GetScriptState)(
        IActiveScript* This,
        SCRIPTSTATE* pssState);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IActiveScript* This);

    HRESULT (STDMETHODCALLTYPE *AddNamedItem)(
        IActiveScript* This,
        LPCOLESTR pstrName,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *AddTypeLib)(
        IActiveScript* This,
        REFGUID rguidTypeLib,
        DWORD dwMajor,
        DWORD dwMinor,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetScriptDispatch)(
        IActiveScript* This,
        LPCOLESTR pstrItemName,
        IDispatch** ppdisp);

    HRESULT (STDMETHODCALLTYPE *GetCurrentScriptThreadID)(
        IActiveScript* This,
        SCRIPTTHREADID* pstidThread);

    HRESULT (STDMETHODCALLTYPE *GetScriptThreadID)(
        IActiveScript* This,
        DWORD dwWin32ThreadId,
        SCRIPTTHREADID* pstidThread);

    HRESULT (STDMETHODCALLTYPE *GetScriptThreadState)(
        IActiveScript* This,
        SCRIPTTHREADID stidThread,
        SCRIPTTHREADSTATE* pstsState);

    HRESULT (STDMETHODCALLTYPE *InterruptScriptThread)(
        IActiveScript* This,
        SCRIPTTHREADID stidThread,
        const EXCEPINFO* pexcepinfo,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IActiveScript* This,
        IActiveScript** ppscript);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IActiveScript_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IActiveScript_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IActiveScript_Release(p) (p)->lpVtbl->Release(p)
/*** IActiveScript methods ***/
#define IActiveScript_SetScriptSite(p,a) (p)->lpVtbl->SetScriptSite(p,a)
#define IActiveScript_GetScriptSite(p,a,b) (p)->lpVtbl->GetScriptSite(p,a,b)
#define IActiveScript_SetScriptState(p,a) (p)->lpVtbl->SetScriptState(p,a)
#define IActiveScript_GetScriptState(p,a) (p)->lpVtbl->GetScriptState(p,a)
#define IActiveScript_Close(p) (p)->lpVtbl->Close(p)
#define IActiveScript_AddNamedItem(p,a,b) (p)->lpVtbl->AddNamedItem(p,a,b)
#define IActiveScript_AddTypeLib(p,a,b,c,d) (p)->lpVtbl->AddTypeLib(p,a,b,c,d)
#define IActiveScript_GetScriptDispatch(p,a,b) (p)->lpVtbl->GetScriptDispatch(p,a,b)
#define IActiveScript_GetCurrentScriptThreadID(p,a) (p)->lpVtbl->GetCurrentScriptThreadID(p,a)
#define IActiveScript_GetScriptThreadID(p,a,b) (p)->lpVtbl->GetScriptThreadID(p,a,b)
#define IActiveScript_GetScriptThreadState(p,a,b) (p)->lpVtbl->GetScriptThreadState(p,a,b)
#define IActiveScript_InterruptScriptThread(p,a,b,c) (p)->lpVtbl->InterruptScriptThread(p,a,b,c)
#define IActiveScript_Clone(p,a) (p)->lpVtbl->Clone(p,a)
#endif

#endif

#define IActiveScript_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IActiveScript methods ***/ \
    STDMETHOD_(HRESULT,SetScriptSite)(THIS_ IActiveScriptSite* pass) PURE; \
    STDMETHOD_(HRESULT,GetScriptSite)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(HRESULT,SetScriptState)(THIS_ SCRIPTSTATE ss) PURE; \
    STDMETHOD_(HRESULT,GetScriptState)(THIS_ SCRIPTSTATE* pssState) PURE; \
    STDMETHOD_(HRESULT,Close)(THIS) PURE; \
    STDMETHOD_(HRESULT,AddNamedItem)(THIS_ LPCOLESTR pstrName, DWORD dwFlags) PURE; \
    STDMETHOD_(HRESULT,AddTypeLib)(THIS_ REFGUID rguidTypeLib, DWORD dwMajor, DWORD dwMinor, DWORD dwFlags) PURE; \
    STDMETHOD_(HRESULT,GetScriptDispatch)(THIS_ LPCOLESTR pstrItemName, IDispatch** ppdisp) PURE; \
    STDMETHOD_(HRESULT,GetCurrentScriptThreadID)(THIS_ SCRIPTTHREADID* pstidThread) PURE; \
    STDMETHOD_(HRESULT,GetScriptThreadID)(THIS_ DWORD dwWin32ThreadId, SCRIPTTHREADID* pstidThread) PURE; \
    STDMETHOD_(HRESULT,GetScriptThreadState)(THIS_ SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE* pstsState) PURE; \
    STDMETHOD_(HRESULT,InterruptScriptThread)(THIS_ SCRIPTTHREADID stidThread, const EXCEPINFO* pexcepinfo, DWORD dwFlags) PURE; \
    STDMETHOD_(HRESULT,Clone)(THIS_ IActiveScript** ppscript) PURE;

HRESULT CALLBACK IActiveScript_SetScriptSite_Proxy(
    IActiveScript* This,
    IActiveScriptSite* pass);
void __RPC_STUB IActiveScript_SetScriptSite_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_GetScriptSite_Proxy(
    IActiveScript* This,
    REFIID riid,
    void** ppvObject);
void __RPC_STUB IActiveScript_GetScriptSite_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_SetScriptState_Proxy(
    IActiveScript* This,
    SCRIPTSTATE ss);
void __RPC_STUB IActiveScript_SetScriptState_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_GetScriptState_Proxy(
    IActiveScript* This,
    SCRIPTSTATE* pssState);
void __RPC_STUB IActiveScript_GetScriptState_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_Close_Proxy(
    IActiveScript* This);
void __RPC_STUB IActiveScript_Close_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_AddNamedItem_Proxy(
    IActiveScript* This,
    LPCOLESTR pstrName,
    DWORD dwFlags);
void __RPC_STUB IActiveScript_AddNamedItem_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_AddTypeLib_Proxy(
    IActiveScript* This,
    REFGUID rguidTypeLib,
    DWORD dwMajor,
    DWORD dwMinor,
    DWORD dwFlags);
void __RPC_STUB IActiveScript_AddTypeLib_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_GetScriptDispatch_Proxy(
    IActiveScript* This,
    LPCOLESTR pstrItemName,
    IDispatch** ppdisp);
void __RPC_STUB IActiveScript_GetScriptDispatch_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_GetCurrentScriptThreadID_Proxy(
    IActiveScript* This,
    SCRIPTTHREADID* pstidThread);
void __RPC_STUB IActiveScript_GetCurrentScriptThreadID_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_GetScriptThreadID_Proxy(
    IActiveScript* This,
    DWORD dwWin32ThreadId,
    SCRIPTTHREADID* pstidThread);
void __RPC_STUB IActiveScript_GetScriptThreadID_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_GetScriptThreadState_Proxy(
    IActiveScript* This,
    SCRIPTTHREADID stidThread,
    SCRIPTTHREADSTATE* pstsState);
void __RPC_STUB IActiveScript_GetScriptThreadState_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_InterruptScriptThread_Proxy(
    IActiveScript* This,
    SCRIPTTHREADID stidThread,
    const EXCEPINFO* pexcepinfo,
    DWORD dwFlags);
void __RPC_STUB IActiveScript_InterruptScriptThread_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScript_Clone_Proxy(
    IActiveScript* This,
    IActiveScript** ppscript);
void __RPC_STUB IActiveScript_Clone_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActiveScript_INTERFACE_DEFINED__ */

typedef IActiveScript *PIActiveScript;
#ifndef __IActiveScriptParse_FWD_DEFINED__
#define __IActiveScriptParse_FWD_DEFINED__
typedef struct IActiveScriptParse IActiveScriptParse;
#endif

/*****************************************************************************
 * IActiveScriptParse interface
 */
#ifndef __IActiveScriptParse_INTERFACE_DEFINED__
#define __IActiveScriptParse_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParse, 0xbb1a2ae2, 0xa4f9, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IActiveScriptParse : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitNew(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddScriptlet(
        LPCOLESTR pstrDefaultName,
        LPCOLESTR pstrCode,
        LPCOLESTR pstrItemName,
        LPCOLESTR pstrSubItemName,
        LPCOLESTR pstrEventName,
        LPCOLESTR pstrDelimiter,
        DWORD dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        BSTR* pbstrName,
        EXCEPINFO* pexcepinfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE ParseScriptText(
        LPCOLESTR pstrCode,
        LPCOLESTR pstrItemName,
        IUnknown* punkContext,
        LPCOLESTR pstrDelimiter,
        DWORD dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        VARIANT* pvarResult,
        EXCEPINFO* pexcepinfo) = 0;

};
#else
typedef struct IActiveScriptParseVtbl IActiveScriptParseVtbl;
struct IActiveScriptParse {
    const IActiveScriptParseVtbl* lpVtbl;
};
struct IActiveScriptParseVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptParse methods ***/
    HRESULT (STDMETHODCALLTYPE *InitNew)(
        IActiveScriptParse* This);

    HRESULT (STDMETHODCALLTYPE *AddScriptlet)(
        IActiveScriptParse* This,
        LPCOLESTR pstrDefaultName,
        LPCOLESTR pstrCode,
        LPCOLESTR pstrItemName,
        LPCOLESTR pstrSubItemName,
        LPCOLESTR pstrEventName,
        LPCOLESTR pstrDelimiter,
        DWORD dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        BSTR* pbstrName,
        EXCEPINFO* pexcepinfo);

    HRESULT (STDMETHODCALLTYPE *ParseScriptText)(
        IActiveScriptParse* This,
        LPCOLESTR pstrCode,
        LPCOLESTR pstrItemName,
        IUnknown* punkContext,
        LPCOLESTR pstrDelimiter,
        DWORD dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        VARIANT* pvarResult,
        EXCEPINFO* pexcepinfo);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IActiveScriptParse_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IActiveScriptParse_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IActiveScriptParse_Release(p) (p)->lpVtbl->Release(p)
/*** IActiveScriptParse methods ***/
#define IActiveScriptParse_InitNew(p) (p)->lpVtbl->InitNew(p)
#define IActiveScriptParse_AddScriptlet(p,a,b,c,d,e,f,g,h,i,j,k) (p)->lpVtbl->AddScriptlet(p,a,b,c,d,e,f,g,h,i,j,k)
#define IActiveScriptParse_ParseScriptText(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->ParseScriptText(p,a,b,c,d,e,f,g,h,i)
#endif

#endif

#define IActiveScriptParse_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IActiveScriptParse methods ***/ \
    STDMETHOD_(HRESULT,InitNew)(THIS) PURE; \
    STDMETHOD_(HRESULT,AddScriptlet)(THIS_ LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, BSTR* pbstrName, EXCEPINFO* pexcepinfo) PURE; \
    STDMETHOD_(HRESULT,ParseScriptText)(THIS_ LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown* punkContext, LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, VARIANT* pvarResult, EXCEPINFO* pexcepinfo) PURE;

HRESULT CALLBACK IActiveScriptParse_InitNew_Proxy(
    IActiveScriptParse* This);
void __RPC_STUB IActiveScriptParse_InitNew_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptParse_AddScriptlet_Proxy(
    IActiveScriptParse* This,
    LPCOLESTR pstrDefaultName,
    LPCOLESTR pstrCode,
    LPCOLESTR pstrItemName,
    LPCOLESTR pstrSubItemName,
    LPCOLESTR pstrEventName,
    LPCOLESTR pstrDelimiter,
    DWORD dwSourceContextCookie,
    ULONG ulStartingLineNumber,
    DWORD dwFlags,
    BSTR* pbstrName,
    EXCEPINFO* pexcepinfo);
void __RPC_STUB IActiveScriptParse_AddScriptlet_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptParse_ParseScriptText_Proxy(
    IActiveScriptParse* This,
    LPCOLESTR pstrCode,
    LPCOLESTR pstrItemName,
    IUnknown* punkContext,
    LPCOLESTR pstrDelimiter,
    DWORD dwSourceContextCookie,
    ULONG ulStartingLineNumber,
    DWORD dwFlags,
    VARIANT* pvarResult,
    EXCEPINFO* pexcepinfo);
void __RPC_STUB IActiveScriptParse_ParseScriptText_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActiveScriptParse_INTERFACE_DEFINED__ */

typedef IActiveScriptParse *PIActiveScriptParse;
#ifndef __IActiveScriptParseProcedureOld_FWD_DEFINED__
#define __IActiveScriptParseProcedureOld_FWD_DEFINED__
typedef struct IActiveScriptParseProcedureOld IActiveScriptParseProcedureOld;
#endif

/*****************************************************************************
 * IActiveScriptParseProcedureOld interface
 */
#ifndef __IActiveScriptParseProcedureOld_INTERFACE_DEFINED__
#define __IActiveScriptParseProcedureOld_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParseProcedureOld, 0x1cff0050, 0x6fdd, 0x11d0, 0x93,0x28, 0x00,0xa0,0xc9,0x0d,0xca,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IActiveScriptParseProcedureOld : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ParseProcedureText(
        LPCOLESTR pstrCode,
        LPCOLESTR pstrFormalParams,
        LPCOLESTR pstrItemName,
        IUnknown* punkContext,
        LPCOLESTR pstrDelimiter,
        DWORD dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        IDispatch** ppdisp) = 0;

};
#else
typedef struct IActiveScriptParseProcedureOldVtbl IActiveScriptParseProcedureOldVtbl;
struct IActiveScriptParseProcedureOld {
    const IActiveScriptParseProcedureOldVtbl* lpVtbl;
};
struct IActiveScriptParseProcedureOldVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptParseProcedureOld methods ***/
    HRESULT (STDMETHODCALLTYPE *ParseProcedureText)(
        IActiveScriptParseProcedureOld* This,
        LPCOLESTR pstrCode,
        LPCOLESTR pstrFormalParams,
        LPCOLESTR pstrItemName,
        IUnknown* punkContext,
        LPCOLESTR pstrDelimiter,
        DWORD dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        IDispatch** ppdisp);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IActiveScriptParseProcedureOld_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IActiveScriptParseProcedureOld_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IActiveScriptParseProcedureOld_Release(p) (p)->lpVtbl->Release(p)
/*** IActiveScriptParseProcedureOld methods ***/
#define IActiveScriptParseProcedureOld_ParseProcedureText(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->ParseProcedureText(p,a,b,c,d,e,f,g,h,i)
#endif

#endif

#define IActiveScriptParseProcedureOld_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IActiveScriptParseProcedureOld methods ***/ \
    STDMETHOD_(HRESULT,ParseProcedureText)(THIS_ LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrItemName, IUnknown* punkContext, LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch** ppdisp) PURE;

HRESULT CALLBACK IActiveScriptParseProcedureOld_ParseProcedureText_Proxy(
    IActiveScriptParseProcedureOld* This,
    LPCOLESTR pstrCode,
    LPCOLESTR pstrFormalParams,
    LPCOLESTR pstrItemName,
    IUnknown* punkContext,
    LPCOLESTR pstrDelimiter,
    DWORD dwSourceContextCookie,
    ULONG ulStartingLineNumber,
    DWORD dwFlags,
    IDispatch** ppdisp);
void __RPC_STUB IActiveScriptParseProcedureOld_ParseProcedureText_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActiveScriptParseProcedureOld_INTERFACE_DEFINED__ */

#ifndef __IActiveScriptParseProcedure_FWD_DEFINED__
#define __IActiveScriptParseProcedure_FWD_DEFINED__
typedef struct IActiveScriptParseProcedure IActiveScriptParseProcedure;
#endif

/*****************************************************************************
 * IActiveScriptParseProcedure interface
 */
#ifndef __IActiveScriptParseProcedure_INTERFACE_DEFINED__
#define __IActiveScriptParseProcedure_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParseProcedure, 0xaa5b6a80, 0xb834, 0x11d0, 0x93,0x2f, 0x00,0xa0,0xc9,0x0d,0xca,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IActiveScriptParseProcedure : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ParseProcedureText(
        LPCOLESTR pstrCode,
        LPCOLESTR pstrFormalParams,
        LPCOLESTR pstrProcedureName,
        LPCOLESTR pstrItemName,
        IUnknown* punkContext,
        LPCOLESTR pstrDelimiter,
        DWORD dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        IDispatch** ppdisp) = 0;

};
#else
typedef struct IActiveScriptParseProcedureVtbl IActiveScriptParseProcedureVtbl;
struct IActiveScriptParseProcedure {
    const IActiveScriptParseProcedureVtbl* lpVtbl;
};
struct IActiveScriptParseProcedureVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptParseProcedure methods ***/
    HRESULT (STDMETHODCALLTYPE *ParseProcedureText)(
        IActiveScriptParseProcedure* This,
        LPCOLESTR pstrCode,
        LPCOLESTR pstrFormalParams,
        LPCOLESTR pstrProcedureName,
        LPCOLESTR pstrItemName,
        IUnknown* punkContext,
        LPCOLESTR pstrDelimiter,
        DWORD dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        IDispatch** ppdisp);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IActiveScriptParseProcedure_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IActiveScriptParseProcedure_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IActiveScriptParseProcedure_Release(p) (p)->lpVtbl->Release(p)
/*** IActiveScriptParseProcedure methods ***/
#define IActiveScriptParseProcedure_ParseProcedureText(p,a,b,c,d,e,f,g,h,i,j) (p)->lpVtbl->ParseProcedureText(p,a,b,c,d,e,f,g,h,i,j)
#endif

#endif

#define IActiveScriptParseProcedure_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IActiveScriptParseProcedure methods ***/ \
    STDMETHOD_(HRESULT,ParseProcedureText)(THIS_ LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName, LPCOLESTR pstrItemName, IUnknown* punkContext, LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch** ppdisp) PURE;

HRESULT CALLBACK IActiveScriptParseProcedure_ParseProcedureText_Proxy(
    IActiveScriptParseProcedure* This,
    LPCOLESTR pstrCode,
    LPCOLESTR pstrFormalParams,
    LPCOLESTR pstrProcedureName,
    LPCOLESTR pstrItemName,
    IUnknown* punkContext,
    LPCOLESTR pstrDelimiter,
    DWORD dwSourceContextCookie,
    ULONG ulStartingLineNumber,
    DWORD dwFlags,
    IDispatch** ppdisp);
void __RPC_STUB IActiveScriptParseProcedure_ParseProcedureText_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActiveScriptParseProcedure_INTERFACE_DEFINED__ */

#ifndef __IBindEventHandler_FWD_DEFINED__
#define __IBindEventHandler_FWD_DEFINED__
typedef struct IBindEventHandler IBindEventHandler;
#endif

/*****************************************************************************
 * IBindEventHandler interface
 */
#ifndef __IBindEventHandler_INTERFACE_DEFINED__
#define __IBindEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBindEventHandler, 0x63cdbcb0, 0xc1b1, 0x11d0, 0x93,0x36, 0x00,0xa0,0xc9,0x0d,0xca,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IBindEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE BindHandler(
        LPCOLESTR pstrEvent,
        IDispatch* pdisp) = 0;

};
#else
typedef struct IBindEventHandlerVtbl IBindEventHandlerVtbl;
struct IBindEventHandler {
    const IBindEventHandlerVtbl* lpVtbl;
};
struct IBindEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBindEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *BindHandler)(
        IBindEventHandler* This,
        LPCOLESTR pstrEvent,
        IDispatch* pdisp);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IBindEventHandler_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IBindEventHandler_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IBindEventHandler_Release(p) (p)->lpVtbl->Release(p)
/*** IBindEventHandler methods ***/
#define IBindEventHandler_BindHandler(p,a,b) (p)->lpVtbl->BindHandler(p,a,b)
#endif

#endif

#define IBindEventHandler_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IBindEventHandler methods ***/ \
    STDMETHOD_(HRESULT,BindHandler)(THIS_ LPCOLESTR pstrEvent, IDispatch* pdisp) PURE;

HRESULT CALLBACK IBindEventHandler_BindHandler_Proxy(
    IBindEventHandler* This,
    LPCOLESTR pstrEvent,
    IDispatch* pdisp);
void __RPC_STUB IBindEventHandler_BindHandler_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IBindEventHandler_INTERFACE_DEFINED__ */

#ifndef __IActiveScriptStats_FWD_DEFINED__
#define __IActiveScriptStats_FWD_DEFINED__
typedef struct IActiveScriptStats IActiveScriptStats;
#endif

/*****************************************************************************
 * IActiveScriptStats interface
 */
#ifndef __IActiveScriptStats_INTERFACE_DEFINED__
#define __IActiveScriptStats_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptStats, 0xb8da6310, 0xe19b, 0x11d0, 0x93,0x3c, 0x00,0xa0,0xc9,0x0d,0xca,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IActiveScriptStats : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStat(
        DWORD stid,
        ULONG* pluHi,
        ULONG* pluLo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatEx(
        REFGUID guid,
        ULONG* pluHi,
        ULONG* pluLo) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetStats(
        ) = 0;

};
#else
typedef struct IActiveScriptStatsVtbl IActiveScriptStatsVtbl;
struct IActiveScriptStats {
    const IActiveScriptStatsVtbl* lpVtbl;
};
struct IActiveScriptStatsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptStats methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStat)(
        IActiveScriptStats* This,
        DWORD stid,
        ULONG* pluHi,
        ULONG* pluLo);

    HRESULT (STDMETHODCALLTYPE *GetStatEx)(
        IActiveScriptStats* This,
        REFGUID guid,
        ULONG* pluHi,
        ULONG* pluLo);

    HRESULT (STDMETHODCALLTYPE *ResetStats)(
        IActiveScriptStats* This);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IActiveScriptStats_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IActiveScriptStats_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IActiveScriptStats_Release(p) (p)->lpVtbl->Release(p)
/*** IActiveScriptStats methods ***/
#define IActiveScriptStats_GetStat(p,a,b,c) (p)->lpVtbl->GetStat(p,a,b,c)
#define IActiveScriptStats_GetStatEx(p,a,b,c) (p)->lpVtbl->GetStatEx(p,a,b,c)
#define IActiveScriptStats_ResetStats(p) (p)->lpVtbl->ResetStats(p)
#endif

#endif

#define IActiveScriptStats_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IActiveScriptStats methods ***/ \
    STDMETHOD_(HRESULT,GetStat)(THIS_ DWORD stid, ULONG* pluHi, ULONG* pluLo) PURE; \
    STDMETHOD_(HRESULT,GetStatEx)(THIS_ REFGUID guid, ULONG* pluHi, ULONG* pluLo) PURE; \
    STDMETHOD_(HRESULT,ResetStats)(THIS) PURE;

HRESULT CALLBACK IActiveScriptStats_GetStat_Proxy(
    IActiveScriptStats* This,
    DWORD stid,
    ULONG* pluHi,
    ULONG* pluLo);
void __RPC_STUB IActiveScriptStats_GetStat_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptStats_GetStatEx_Proxy(
    IActiveScriptStats* This,
    REFGUID guid,
    ULONG* pluHi,
    ULONG* pluLo);
void __RPC_STUB IActiveScriptStats_GetStatEx_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptStats_ResetStats_Proxy(
    IActiveScriptStats* This);
void __RPC_STUB IActiveScriptStats_ResetStats_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActiveScriptStats_INTERFACE_DEFINED__ */

#ifdef __cplusplus
}
#endif
#endif /* __WIDL_ACTIVSCP_H */
