/*** Autogenerated by WIDL 10.8 from include/activscp.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 __activscp_h__
#define __activscp_h__

/* Forward declarations */

#ifndef __IActiveScriptSite_FWD_DEFINED__
#define __IActiveScriptSite_FWD_DEFINED__
typedef interface IActiveScriptSite IActiveScriptSite;
#ifdef __cplusplus
interface IActiveScriptSite;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptError_FWD_DEFINED__
#define __IActiveScriptError_FWD_DEFINED__
typedef interface IActiveScriptError IActiveScriptError;
#ifdef __cplusplus
interface IActiveScriptError;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptError64_FWD_DEFINED__
#define __IActiveScriptError64_FWD_DEFINED__
typedef interface IActiveScriptError64 IActiveScriptError64;
#ifdef __cplusplus
interface IActiveScriptError64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteWindow_FWD_DEFINED__
#define __IActiveScriptSiteWindow_FWD_DEFINED__
typedef interface IActiveScriptSiteWindow IActiveScriptSiteWindow;
#ifdef __cplusplus
interface IActiveScriptSiteWindow;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteUIControl_FWD_DEFINED__
#define __IActiveScriptSiteUIControl_FWD_DEFINED__
typedef interface IActiveScriptSiteUIControl IActiveScriptSiteUIControl;
#ifdef __cplusplus
interface IActiveScriptSiteUIControl;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteInterruptPoll_FWD_DEFINED__
#define __IActiveScriptSiteInterruptPoll_FWD_DEFINED__
typedef interface IActiveScriptSiteInterruptPoll IActiveScriptSiteInterruptPoll;
#ifdef __cplusplus
interface IActiveScriptSiteInterruptPoll;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScript_FWD_DEFINED__
#define __IActiveScript_FWD_DEFINED__
typedef interface IActiveScript IActiveScript;
#ifdef __cplusplus
interface IActiveScript;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParse32_FWD_DEFINED__
#define __IActiveScriptParse32_FWD_DEFINED__
typedef interface IActiveScriptParse32 IActiveScriptParse32;
#ifdef __cplusplus
interface IActiveScriptParse32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParse64_FWD_DEFINED__
#define __IActiveScriptParse64_FWD_DEFINED__
typedef interface IActiveScriptParse64 IActiveScriptParse64;
#ifdef __cplusplus
interface IActiveScriptParse64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedureOld32_FWD_DEFINED__
#define __IActiveScriptParseProcedureOld32_FWD_DEFINED__
typedef interface IActiveScriptParseProcedureOld32 IActiveScriptParseProcedureOld32;
#ifdef __cplusplus
interface IActiveScriptParseProcedureOld32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedureOld64_FWD_DEFINED__
#define __IActiveScriptParseProcedureOld64_FWD_DEFINED__
typedef interface IActiveScriptParseProcedureOld64 IActiveScriptParseProcedureOld64;
#ifdef __cplusplus
interface IActiveScriptParseProcedureOld64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedure32_FWD_DEFINED__
#define __IActiveScriptParseProcedure32_FWD_DEFINED__
typedef interface IActiveScriptParseProcedure32 IActiveScriptParseProcedure32;
#ifdef __cplusplus
interface IActiveScriptParseProcedure32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedure64_FWD_DEFINED__
#define __IActiveScriptParseProcedure64_FWD_DEFINED__
typedef interface IActiveScriptParseProcedure64 IActiveScriptParseProcedure64;
#ifdef __cplusplus
interface IActiveScriptParseProcedure64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedure2_32_FWD_DEFINED__
#define __IActiveScriptParseProcedure2_32_FWD_DEFINED__
typedef interface IActiveScriptParseProcedure2_32 IActiveScriptParseProcedure2_32;
#ifdef __cplusplus
interface IActiveScriptParseProcedure2_32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedure2_64_FWD_DEFINED__
#define __IActiveScriptParseProcedure2_64_FWD_DEFINED__
typedef interface IActiveScriptParseProcedure2_64 IActiveScriptParseProcedure2_64;
#ifdef __cplusplus
interface IActiveScriptParseProcedure2_64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptEncode_FWD_DEFINED__
#define __IActiveScriptEncode_FWD_DEFINED__
typedef interface IActiveScriptEncode IActiveScriptEncode;
#ifdef __cplusplus
interface IActiveScriptEncode;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptHostEncode_FWD_DEFINED__
#define __IActiveScriptHostEncode_FWD_DEFINED__
typedef interface IActiveScriptHostEncode IActiveScriptHostEncode;
#ifdef __cplusplus
interface IActiveScriptHostEncode;
#endif /* __cplusplus */
#endif

#ifndef __IBindEventHandler_FWD_DEFINED__
#define __IBindEventHandler_FWD_DEFINED__
typedef interface IBindEventHandler IBindEventHandler;
#ifdef __cplusplus
interface IBindEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptStats_FWD_DEFINED__
#define __IActiveScriptStats_FWD_DEFINED__
typedef interface IActiveScriptStats IActiveScriptStats;
#ifdef __cplusplus
interface IActiveScriptStats;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptProperty_FWD_DEFINED__
#define __IActiveScriptProperty_FWD_DEFINED__
typedef interface IActiveScriptProperty IActiveScriptProperty;
#ifdef __cplusplus
interface IActiveScriptProperty;
#endif /* __cplusplus */
#endif

#ifndef __ITridentEventSink_FWD_DEFINED__
#define __ITridentEventSink_FWD_DEFINED__
typedef interface ITridentEventSink ITridentEventSink;
#ifdef __cplusplus
interface ITridentEventSink;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptGarbageCollector_FWD_DEFINED__
#define __IActiveScriptGarbageCollector_FWD_DEFINED__
typedef interface IActiveScriptGarbageCollector IActiveScriptGarbageCollector;
#ifdef __cplusplus
interface IActiveScriptGarbageCollector;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSIPInfo_FWD_DEFINED__
#define __IActiveScriptSIPInfo_FWD_DEFINED__
typedef interface IActiveScriptSIPInfo IActiveScriptSIPInfo;
#ifdef __cplusplus
interface IActiveScriptSIPInfo;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteTraceInfo_FWD_DEFINED__
#define __IActiveScriptSiteTraceInfo_FWD_DEFINED__
typedef interface IActiveScriptSiteTraceInfo IActiveScriptSiteTraceInfo;
#ifdef __cplusplus
interface IActiveScriptSiteTraceInfo;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptTraceInfo_FWD_DEFINED__
#define __IActiveScriptTraceInfo_FWD_DEFINED__
typedef interface IActiveScriptTraceInfo IActiveScriptTraceInfo;
#ifdef __cplusplus
interface IActiveScriptTraceInfo;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptStringCompare_FWD_DEFINED__
#define __IActiveScriptStringCompare_FWD_DEFINED__
typedef interface IActiveScriptStringCompare IActiveScriptStringCompare;
#ifdef __cplusplus
interface IActiveScriptStringCompare;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <ocidl.h>
#include <oleidl.h>
#include <oaidl.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.
 */

#ifndef __ActivScp_h
#define __ActivScp_h

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)


#ifndef _NO_SCRIPT_GUIDS

DEFINE_GUID(CATID_ActiveScript, 0xf0b7a1a1, 0x9847, 0x11cf, 0x8f, 0x20, 0x00, 0x80, 0x5f, 0x2c, 0xd0, 0x64);
DEFINE_GUID(CATID_ActiveScriptParse, 0xf0b7a1a2, 0x9847, 0x11cf, 0x8f, 0x20, 0x00, 0x80, 0x5f, 0x2c, 0xd0, 0x64);
DEFINE_GUID(CATID_ActiveScriptEncode, 0xf0b7a1a3, 0x9847, 0x11cf, 0x8f, 0x20, 0x00, 0x80, 0x5f, 0x2c, 0xd0, 0x64);
DEFINE_GUID(OID_VBSSIP, 0x1629f04e, 0x2799, 0x4db5, 0x8f, 0xe5, 0xac, 0xe1, 0x0f, 0x17, 0xeb, 0xab);
DEFINE_GUID(OID_JSSIP,  0x6c9e010, 0x38ce, 0x11d4, 0xa2, 0xa3, 0x00, 0x10, 0x4b, 0xd3, 0x50, 0x90);
DEFINE_GUID(OID_WSFSIP, 0x1a610570, 0x38ce, 0x11d4, 0xa2, 0xa3, 0x00, 0x10, 0x4b, 0xd3, 0x50, 0x90);
#endif

#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 (SCRIPTTYPELIB_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_ISXDOMAIN 0x00000100

#define SCRIPTTEXT_ALL_FLAGS (SCRIPTTEXT_DELAYEXECUTION | SCRIPTTEXT_ISVISIBLE | SCRIPTTEXT_ISEXPRESSION | SCRIPTTEXT_ISPERSISTENT | SCRIPTTEXT_HOSTMANAGESSOURCE | SCRIPTTEXT_ISXDOMAIN)

#define SCRIPTPROC_ISEXPRESSION 0x00000020
#define SCRIPTPROC_HOSTMANAGESSOURCE 0x00000080
#define SCRIPTPROC_IMPLICIT_THIS 0x00000100
#define SCRIPTPROC_IMPLICIT_PARENTS 0x00000200
#define SCRIPTPROC_ISXDOMAIN 0x00000400

#define SCRIPTPROC_ALL_FLAGS (SCRIPTPROC_HOSTMANAGESSOURCE | SCRIPTPROC_ISEXPRESSION | SCRIPTPROC_IMPLICIT_THIS | SCRIPTPROC_IMPLICIT_PARENTS | SCRIPTPROC_ISXDOMAIN)

#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 0x1
#define SCRIPTSTAT_INSTRUCTION_COUNT 0x2
#define SCRIPTSTAT_INTSTRUCTION_TIME 0x3
#define SCRIPTSTAT_TOTAL_TIME 0x4

#define SCRIPT_ENCODE_SECTION 0x1

#define SCRIPT_ENCODE_DEFAULT_LANGUAGE 0x1
#define SCRIPT_ENCODE_NO_ASP_LANGUAGE 0x2

#define SCRIPTPROP_NAME 0x0
#define SCRIPTPROP_MAJORVERSION 0x1
#define SCRIPTPROP_MINORVERSION 0x2
#define SCRIPTPROP_BUILDNUMBER 0x3

#define SCRIPTPROP_DELAYEDEVENTSINKING 0x1000
#define SCRIPTPROP_CATCHEXCEPTION 0x1001
#define SCRIPTPROP_CONVERSIONLCID 0x1002
#define SCRIPTPROP_HOSTSTACKREQUIRED 0x1003

#define SCRIPTPROP_DEBUGGER 0x1100
#define SCRIPTPROP_JITDEBUG 0x1101

#define SCRIPTPROP_GCCONTROLSOFTCLOSE 0x2000

#define SCRIPTPROP_INTEGERMODE 0x3000
#define SCRIPTPROP_STRINGCOMPAREINSTANCE 0x3001

#define SCRIPTPROP_INVOKEVERSIONING 0x4000

#define SCRIPTPROP_HACK_FIBERSUPPORT 0x70000000
#define SCRIPTPROP_HACK_TRIDENTEVENTSINK 0x70000001
#define SCRIPTPROP_ABBREVIATE_GLOBALNAME_RESOLUTION 0x70000002
#define SCRIPTPROP_HOSTKEEPALIVE 0x70000004

#define SCRIPT_E_RECORDED __MSABI_LONG(0x86664004)
#define SCRIPT_E_REPORTED __MSABI_LONG(0x80020101)
#define SCRIPT_E_PROPAGATE __MSABI_LONG(0x80020102)

typedef enum tagSCRIPTLANGUAGEVERSION {
    SCRIPTLANGUAGEVERSION_DEFAULT = 0,
    SCRIPTLANGUAGEVERSION_5_7 = 1,
    SCRIPTLANGUAGEVERSION_5_8 = 2,
    SCRIPTLANGUAGEVERSION_MAX = 255
} SCRIPTLANGUAGEVERSION;

typedef enum tagSCRIPTSTATE {
    SCRIPTSTATE_UNINITIALIZED = 0,
    SCRIPTSTATE_INITIALIZED = 5,
    SCRIPTSTATE_STARTED = 1,
    SCRIPTSTATE_CONNECTED = 2,
    SCRIPTSTATE_DISCONNECTED = 3,
    SCRIPTSTATE_CLOSED = 4
} SCRIPTSTATE;

typedef enum tagSCRIPTTRACEINFO {
    SCRIPTTRACEINFO_SCRIPTSTART = 0,
    SCRIPTTRACEINFO_SCRIPTEND = 1,
    SCRIPTTRACEINFO_COMCALLSTART = 2,
    SCRIPTTRACEINFO_COMCALLEND = 3,
    SCRIPTTRACEINFO_CREATEOBJSTART = 4,
    SCRIPTTRACEINFO_CREATEOBJEND = 5,
    SCRIPTTRACEINFO_GETOBJSTART = 6,
    SCRIPTTRACEINFO_GETOBJEND = 7
} SCRIPTTRACEINFO;

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

typedef enum tagSCRIPTGCTYPE {
    SCRIPTGCTYPE_NORMAL = 0,
    SCRIPTGCTYPE_EXHAUSTIVE = 1
} SCRIPTGCTYPE;

typedef enum tagSCRIPTUICITEM {
    SCRIPTUICITEM_INPUTBOX = 1,
    SCRIPTUICITEM_MSGBOX = 2
} SCRIPTUICITEM;

typedef enum tagSCRIPTUICHANDLING {
    SCRIPTUICHANDLING_ALLOW = 0,
    SCRIPTUICHANDLING_NOUIERROR = 1,
    SCRIPTUICHANDLING_NOUIDEFAULT = 2
} SCRIPTUICHANDLING;

typedef DWORD SCRIPTTHREADID;

#define SCRIPTTHREADID_CURRENT ((SCRIPTTHREADID)-1)
#define SCRIPTTHREADID_BASE    ((SCRIPTTHREADID)-2)
#define SCRIPTTHREADID_ALL     ((SCRIPTTHREADID)-3)

#ifndef __IActiveScriptSite_FWD_DEFINED__
#define __IActiveScriptSite_FWD_DEFINED__
typedef interface IActiveScriptSite IActiveScriptSite;
#ifdef __cplusplus
interface IActiveScriptSite;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptError_FWD_DEFINED__
#define __IActiveScriptError_FWD_DEFINED__
typedef interface IActiveScriptError IActiveScriptError;
#ifdef __cplusplus
interface IActiveScriptError;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptError64_FWD_DEFINED__
#define __IActiveScriptError64_FWD_DEFINED__
typedef interface IActiveScriptError64 IActiveScriptError64;
#ifdef __cplusplus
interface IActiveScriptError64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteWindow_FWD_DEFINED__
#define __IActiveScriptSiteWindow_FWD_DEFINED__
typedef interface IActiveScriptSiteWindow IActiveScriptSiteWindow;
#ifdef __cplusplus
interface IActiveScriptSiteWindow;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteUIControl_FWD_DEFINED__
#define __IActiveScriptSiteUIControl_FWD_DEFINED__
typedef interface IActiveScriptSiteUIControl IActiveScriptSiteUIControl;
#ifdef __cplusplus
interface IActiveScriptSiteUIControl;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteInterruptPoll_FWD_DEFINED__
#define __IActiveScriptSiteInterruptPoll_FWD_DEFINED__
typedef interface IActiveScriptSiteInterruptPoll IActiveScriptSiteInterruptPoll;
#ifdef __cplusplus
interface IActiveScriptSiteInterruptPoll;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScript_FWD_DEFINED__
#define __IActiveScript_FWD_DEFINED__
typedef interface IActiveScript IActiveScript;
#ifdef __cplusplus
interface IActiveScript;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParse32_FWD_DEFINED__
#define __IActiveScriptParse32_FWD_DEFINED__
typedef interface IActiveScriptParse32 IActiveScriptParse32;
#ifdef __cplusplus
interface IActiveScriptParse32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParse64_FWD_DEFINED__
#define __IActiveScriptParse64_FWD_DEFINED__
typedef interface IActiveScriptParse64 IActiveScriptParse64;
#ifdef __cplusplus
interface IActiveScriptParse64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedureOld32_FWD_DEFINED__
#define __IActiveScriptParseProcedureOld32_FWD_DEFINED__
typedef interface IActiveScriptParseProcedureOld32 IActiveScriptParseProcedureOld32;
#ifdef __cplusplus
interface IActiveScriptParseProcedureOld32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedureOld64_FWD_DEFINED__
#define __IActiveScriptParseProcedureOld64_FWD_DEFINED__
typedef interface IActiveScriptParseProcedureOld64 IActiveScriptParseProcedureOld64;
#ifdef __cplusplus
interface IActiveScriptParseProcedureOld64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedure32_FWD_DEFINED__
#define __IActiveScriptParseProcedure32_FWD_DEFINED__
typedef interface IActiveScriptParseProcedure32 IActiveScriptParseProcedure32;
#ifdef __cplusplus
interface IActiveScriptParseProcedure32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedure64_FWD_DEFINED__
#define __IActiveScriptParseProcedure64_FWD_DEFINED__
typedef interface IActiveScriptParseProcedure64 IActiveScriptParseProcedure64;
#ifdef __cplusplus
interface IActiveScriptParseProcedure64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedure2_32_FWD_DEFINED__
#define __IActiveScriptParseProcedure2_32_FWD_DEFINED__
typedef interface IActiveScriptParseProcedure2_32 IActiveScriptParseProcedure2_32;
#ifdef __cplusplus
interface IActiveScriptParseProcedure2_32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptParseProcedure2_64_FWD_DEFINED__
#define __IActiveScriptParseProcedure2_64_FWD_DEFINED__
typedef interface IActiveScriptParseProcedure2_64 IActiveScriptParseProcedure2_64;
#ifdef __cplusplus
interface IActiveScriptParseProcedure2_64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptEncode_FWD_DEFINED__
#define __IActiveScriptEncode_FWD_DEFINED__
typedef interface IActiveScriptEncode IActiveScriptEncode;
#ifdef __cplusplus
interface IActiveScriptEncode;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptHostEncode_FWD_DEFINED__
#define __IActiveScriptHostEncode_FWD_DEFINED__
typedef interface IActiveScriptHostEncode IActiveScriptHostEncode;
#ifdef __cplusplus
interface IActiveScriptHostEncode;
#endif /* __cplusplus */
#endif

#ifndef __IBindEventHandler_FWD_DEFINED__
#define __IBindEventHandler_FWD_DEFINED__
typedef interface IBindEventHandler IBindEventHandler;
#ifdef __cplusplus
interface IBindEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptStats_FWD_DEFINED__
#define __IActiveScriptStats_FWD_DEFINED__
typedef interface IActiveScriptStats IActiveScriptStats;
#ifdef __cplusplus
interface IActiveScriptStats;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptProperty_FWD_DEFINED__
#define __IActiveScriptProperty_FWD_DEFINED__
typedef interface IActiveScriptProperty IActiveScriptProperty;
#ifdef __cplusplus
interface IActiveScriptProperty;
#endif /* __cplusplus */
#endif

#ifndef __ITridentEventSink_FWD_DEFINED__
#define __ITridentEventSink_FWD_DEFINED__
typedef interface ITridentEventSink ITridentEventSink;
#ifdef __cplusplus
interface ITridentEventSink;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptGarbageCollector_FWD_DEFINED__
#define __IActiveScriptGarbageCollector_FWD_DEFINED__
typedef interface IActiveScriptGarbageCollector IActiveScriptGarbageCollector;
#ifdef __cplusplus
interface IActiveScriptGarbageCollector;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSIPInfo_FWD_DEFINED__
#define __IActiveScriptSIPInfo_FWD_DEFINED__
typedef interface IActiveScriptSIPInfo IActiveScriptSIPInfo;
#ifdef __cplusplus
interface IActiveScriptSIPInfo;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptStringCompare_FWD_DEFINED__
#define __IActiveScriptStringCompare_FWD_DEFINED__
typedef interface IActiveScriptStringCompare IActiveScriptStringCompare;
#ifdef __cplusplus
interface IActiveScriptStringCompare;
#endif /* __cplusplus */
#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)
MIDL_INTERFACE("db01a1e3-a42b-11cf-8f20-00805f2cd064")
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;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptSite, 0xdb01a1e3, 0xa42b, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
#endif
#else
typedef 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
} IActiveScriptSiteVtbl;

interface IActiveScriptSite {
    CONST_VTBL IActiveScriptSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptSite_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptSite methods ***/
#define IActiveScriptSite_GetLCID(This,plcid) (This)->lpVtbl->GetLCID(This,plcid)
#define IActiveScriptSite_GetItemInfo(This,pstrName,dwReturnMask,ppiunkItem,ppti) (This)->lpVtbl->GetItemInfo(This,pstrName,dwReturnMask,ppiunkItem,ppti)
#define IActiveScriptSite_GetDocVersionString(This,pbstrVersion) (This)->lpVtbl->GetDocVersionString(This,pbstrVersion)
#define IActiveScriptSite_OnScriptTerminate(This,pvarResult,pexcepinfo) (This)->lpVtbl->OnScriptTerminate(This,pvarResult,pexcepinfo)
#define IActiveScriptSite_OnStateChange(This,ssScriptState) (This)->lpVtbl->OnStateChange(This,ssScriptState)
#define IActiveScriptSite_OnScriptError(This,pscripterror) (This)->lpVtbl->OnScriptError(This,pscripterror)
#define IActiveScriptSite_OnEnterScript(This) (This)->lpVtbl->OnEnterScript(This)
#define IActiveScriptSite_OnLeaveScript(This) (This)->lpVtbl->OnLeaveScript(This)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptSite_QueryInterface(IActiveScriptSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptSite_AddRef(IActiveScriptSite* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptSite_Release(IActiveScriptSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSite methods ***/
static inline HRESULT IActiveScriptSite_GetLCID(IActiveScriptSite* This,LCID *plcid) {
    return This->lpVtbl->GetLCID(This,plcid);
}
static inline HRESULT IActiveScriptSite_GetItemInfo(IActiveScriptSite* This,LPCOLESTR pstrName,DWORD dwReturnMask,IUnknown **ppiunkItem,ITypeInfo **ppti) {
    return This->lpVtbl->GetItemInfo(This,pstrName,dwReturnMask,ppiunkItem,ppti);
}
static inline HRESULT IActiveScriptSite_GetDocVersionString(IActiveScriptSite* This,BSTR *pbstrVersion) {
    return This->lpVtbl->GetDocVersionString(This,pbstrVersion);
}
static inline HRESULT IActiveScriptSite_OnScriptTerminate(IActiveScriptSite* This,const VARIANT *pvarResult,const EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->OnScriptTerminate(This,pvarResult,pexcepinfo);
}
static inline HRESULT IActiveScriptSite_OnStateChange(IActiveScriptSite* This,SCRIPTSTATE ssScriptState) {
    return This->lpVtbl->OnStateChange(This,ssScriptState);
}
static inline HRESULT IActiveScriptSite_OnScriptError(IActiveScriptSite* This,IActiveScriptError *pscripterror) {
    return This->lpVtbl->OnScriptError(This,pscripterror);
}
static inline HRESULT IActiveScriptSite_OnEnterScript(IActiveScriptSite* This) {
    return This->lpVtbl->OnEnterScript(This);
}
static inline HRESULT IActiveScriptSite_OnLeaveScript(IActiveScriptSite* This) {
    return This->lpVtbl->OnLeaveScript(This);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptSite_INTERFACE_DEFINED__ */


/*****************************************************************************
 * 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)
MIDL_INTERFACE("eae1ba61-a4ed-11cf-8f20-00805f2cd064")
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;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptError, 0xeae1ba61, 0xa4ed, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
#endif
#else
typedef 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
} IActiveScriptErrorVtbl;

interface IActiveScriptError {
    CONST_VTBL IActiveScriptErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptError_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptError methods ***/
#define IActiveScriptError_GetExceptionInfo(This,pexcepinfo) (This)->lpVtbl->GetExceptionInfo(This,pexcepinfo)
#define IActiveScriptError_GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition) (This)->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition)
#define IActiveScriptError_GetSourceLineText(This,pbstrSourceLine) (This)->lpVtbl->GetSourceLineText(This,pbstrSourceLine)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptError_QueryInterface(IActiveScriptError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptError_AddRef(IActiveScriptError* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptError_Release(IActiveScriptError* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptError methods ***/
static inline HRESULT IActiveScriptError_GetExceptionInfo(IActiveScriptError* This,EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->GetExceptionInfo(This,pexcepinfo);
}
static inline HRESULT IActiveScriptError_GetSourcePosition(IActiveScriptError* This,DWORD *pdwSourceContext,ULONG *pulLineNumber,LONG *plCharacterPosition) {
    return This->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition);
}
static inline HRESULT IActiveScriptError_GetSourceLineText(IActiveScriptError* This,BSTR *pbstrSourceLine) {
    return This->lpVtbl->GetSourceLineText(This,pbstrSourceLine);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IActiveScriptError_RemoteGetExceptionInfo_Proxy(
    IActiveScriptError* This,
    EXCEPINFO *pexcepinfo);
void __RPC_STUB IActiveScriptError_RemoteGetExceptionInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IActiveScriptError_GetExceptionInfo_Proxy(
    IActiveScriptError* This,
    EXCEPINFO *pexcepinfo);
HRESULT __RPC_STUB IActiveScriptError_GetExceptionInfo_Stub(
    IActiveScriptError* This,
    EXCEPINFO *pexcepinfo);

#endif  /* __IActiveScriptError_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptError64 interface
 */
#ifndef __IActiveScriptError64_INTERFACE_DEFINED__
#define __IActiveScriptError64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptError64, 0xb21fb2a1, 0x5b8f, 0x4963, 0x8c,0x21, 0x21,0x45,0x0f,0x84,0xed,0x7f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b21fb2a1-5b8f-4963-8c21-21450f84ed7f")
IActiveScriptError64 : public IActiveScriptError
{
    virtual HRESULT STDMETHODCALLTYPE GetSourcePosition64(
        DWORDLONG *pdwSourceContext,
        ULONG *pulLineNumber,
        LONG *plCharacterPosition) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptError64, 0xb21fb2a1, 0x5b8f, 0x4963, 0x8c,0x21, 0x21,0x45,0x0f,0x84,0xed,0x7f)
#endif
#else
typedef struct IActiveScriptError64Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IActiveScriptError64 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSourcePosition64)(
        IActiveScriptError64 *This,
        DWORDLONG *pdwSourceContext,
        ULONG *pulLineNumber,
        LONG *plCharacterPosition);

    END_INTERFACE
} IActiveScriptError64Vtbl;

interface IActiveScriptError64 {
    CONST_VTBL IActiveScriptError64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptError64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptError64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptError64_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptError methods ***/
#define IActiveScriptError64_GetExceptionInfo(This,pexcepinfo) (This)->lpVtbl->GetExceptionInfo(This,pexcepinfo)
#define IActiveScriptError64_GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition) (This)->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition)
#define IActiveScriptError64_GetSourceLineText(This,pbstrSourceLine) (This)->lpVtbl->GetSourceLineText(This,pbstrSourceLine)
/*** IActiveScriptError64 methods ***/
#define IActiveScriptError64_GetSourcePosition64(This,pdwSourceContext,pulLineNumber,plCharacterPosition) (This)->lpVtbl->GetSourcePosition64(This,pdwSourceContext,pulLineNumber,plCharacterPosition)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptError64_QueryInterface(IActiveScriptError64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptError64_AddRef(IActiveScriptError64* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptError64_Release(IActiveScriptError64* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptError methods ***/
static inline HRESULT IActiveScriptError64_GetExceptionInfo(IActiveScriptError64* This,EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->GetExceptionInfo(This,pexcepinfo);
}
static inline HRESULT IActiveScriptError64_GetSourcePosition(IActiveScriptError64* This,DWORD *pdwSourceContext,ULONG *pulLineNumber,LONG *plCharacterPosition) {
    return This->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition);
}
static inline HRESULT IActiveScriptError64_GetSourceLineText(IActiveScriptError64* This,BSTR *pbstrSourceLine) {
    return This->lpVtbl->GetSourceLineText(This,pbstrSourceLine);
}
/*** IActiveScriptError64 methods ***/
static inline HRESULT IActiveScriptError64_GetSourcePosition64(IActiveScriptError64* This,DWORDLONG *pdwSourceContext,ULONG *pulLineNumber,LONG *plCharacterPosition) {
    return This->lpVtbl->GetSourcePosition64(This,pdwSourceContext,pulLineNumber,plCharacterPosition);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptError64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * 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)
MIDL_INTERFACE("d10f6761-83e9-11cf-8f20-00805f2cd064")
IActiveScriptSiteWindow : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetWindow(
        HWND *phwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableModeless(
        WINBOOL fEnable) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptSiteWindow, 0xd10f6761, 0x83e9, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
#endif
#else
typedef 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,
        WINBOOL fEnable);

    END_INTERFACE
} IActiveScriptSiteWindowVtbl;

interface IActiveScriptSiteWindow {
    CONST_VTBL IActiveScriptSiteWindowVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptSiteWindow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptSiteWindow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptSiteWindow_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptSiteWindow methods ***/
#define IActiveScriptSiteWindow_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IActiveScriptSiteWindow_EnableModeless(This,fEnable) (This)->lpVtbl->EnableModeless(This,fEnable)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptSiteWindow_Release(IActiveScriptSiteWindow* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteWindow methods ***/
static inline HRESULT IActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow* This,WINBOOL fEnable) {
    return This->lpVtbl->EnableModeless(This,fEnable);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptSiteWindow_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptSiteUIControl interface
 */
#ifndef __IActiveScriptSiteUIControl_INTERFACE_DEFINED__
#define __IActiveScriptSiteUIControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptSiteUIControl, 0xaedae97e, 0xd7ee, 0x4796, 0xb9,0x60, 0x7f,0x09,0x2a,0xe8,0x44,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aedae97e-d7ee-4796-b960-7f092ae844ab")
IActiveScriptSiteUIControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetUIBehavior(
        SCRIPTUICITEM UicItem,
        SCRIPTUICHANDLING *pUicHandling) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptSiteUIControl, 0xaedae97e, 0xd7ee, 0x4796, 0xb9,0x60, 0x7f,0x09,0x2a,0xe8,0x44,0xab)
#endif
#else
typedef struct IActiveScriptSiteUIControlVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptSiteUIControl methods ***/
    HRESULT (STDMETHODCALLTYPE *GetUIBehavior)(
        IActiveScriptSiteUIControl *This,
        SCRIPTUICITEM UicItem,
        SCRIPTUICHANDLING *pUicHandling);

    END_INTERFACE
} IActiveScriptSiteUIControlVtbl;

interface IActiveScriptSiteUIControl {
    CONST_VTBL IActiveScriptSiteUIControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptSiteUIControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptSiteUIControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptSiteUIControl_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptSiteUIControl methods ***/
#define IActiveScriptSiteUIControl_GetUIBehavior(This,UicItem,pUicHandling) (This)->lpVtbl->GetUIBehavior(This,UicItem,pUicHandling)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptSiteUIControl_QueryInterface(IActiveScriptSiteUIControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptSiteUIControl_AddRef(IActiveScriptSiteUIControl* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptSiteUIControl_Release(IActiveScriptSiteUIControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteUIControl methods ***/
static inline HRESULT IActiveScriptSiteUIControl_GetUIBehavior(IActiveScriptSiteUIControl* This,SCRIPTUICITEM UicItem,SCRIPTUICHANDLING *pUicHandling) {
    return This->lpVtbl->GetUIBehavior(This,UicItem,pUicHandling);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptSiteUIControl_INTERFACE_DEFINED__ */


/*****************************************************************************
 * 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)
MIDL_INTERFACE("539698a0-cdca-11cf-a5eb-00aa0047a063")
IActiveScriptSiteInterruptPoll : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryContinue(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptSiteInterruptPoll, 0x539698a0, 0xcdca, 0x11cf, 0xa5,0xeb, 0x00,0xaa,0x00,0x47,0xa0,0x63)
#endif
#else
typedef 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
} IActiveScriptSiteInterruptPollVtbl;

interface IActiveScriptSiteInterruptPoll {
    CONST_VTBL IActiveScriptSiteInterruptPollVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptSiteInterruptPoll_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptSiteInterruptPoll_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptSiteInterruptPoll_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptSiteInterruptPoll methods ***/
#define IActiveScriptSiteInterruptPoll_QueryContinue(This) (This)->lpVtbl->QueryContinue(This)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptSiteInterruptPoll_QueryInterface(IActiveScriptSiteInterruptPoll* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptSiteInterruptPoll_AddRef(IActiveScriptSiteInterruptPoll* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptSiteInterruptPoll_Release(IActiveScriptSiteInterruptPoll* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteInterruptPoll methods ***/
static inline HRESULT IActiveScriptSiteInterruptPoll_QueryContinue(IActiveScriptSiteInterruptPoll* This) {
    return This->lpVtbl->QueryContinue(This);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptSiteInterruptPoll_INTERFACE_DEFINED__ */


/*****************************************************************************
 * 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)
MIDL_INTERFACE("bb1a2ae1-a4f9-11cf-8f20-00805f2cd064")
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;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScript, 0xbb1a2ae1, 0xa4f9, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
#endif
#else
typedef 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
} IActiveScriptVtbl;

interface IActiveScript {
    CONST_VTBL IActiveScriptVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScript_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScript_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScript_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScript methods ***/
#define IActiveScript_SetScriptSite(This,pass) (This)->lpVtbl->SetScriptSite(This,pass)
#define IActiveScript_GetScriptSite(This,riid,ppvObject) (This)->lpVtbl->GetScriptSite(This,riid,ppvObject)
#define IActiveScript_SetScriptState(This,ss) (This)->lpVtbl->SetScriptState(This,ss)
#define IActiveScript_GetScriptState(This,pssState) (This)->lpVtbl->GetScriptState(This,pssState)
#define IActiveScript_Close(This) (This)->lpVtbl->Close(This)
#define IActiveScript_AddNamedItem(This,pstrName,dwFlags) (This)->lpVtbl->AddNamedItem(This,pstrName,dwFlags)
#define IActiveScript_AddTypeLib(This,rguidTypeLib,dwMajor,dwMinor,dwFlags) (This)->lpVtbl->AddTypeLib(This,rguidTypeLib,dwMajor,dwMinor,dwFlags)
#define IActiveScript_GetScriptDispatch(This,pstrItemName,ppdisp) (This)->lpVtbl->GetScriptDispatch(This,pstrItemName,ppdisp)
#define IActiveScript_GetCurrentScriptThreadID(This,pstidThread) (This)->lpVtbl->GetCurrentScriptThreadID(This,pstidThread)
#define IActiveScript_GetScriptThreadID(This,dwWin32ThreadId,pstidThread) (This)->lpVtbl->GetScriptThreadID(This,dwWin32ThreadId,pstidThread)
#define IActiveScript_GetScriptThreadState(This,stidThread,pstsState) (This)->lpVtbl->GetScriptThreadState(This,stidThread,pstsState)
#define IActiveScript_InterruptScriptThread(This,stidThread,pexcepinfo,dwFlags) (This)->lpVtbl->InterruptScriptThread(This,stidThread,pexcepinfo,dwFlags)
#define IActiveScript_Clone(This,ppscript) (This)->lpVtbl->Clone(This,ppscript)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScript_QueryInterface(IActiveScript* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScript_AddRef(IActiveScript* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScript_Release(IActiveScript* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScript methods ***/
static inline HRESULT IActiveScript_SetScriptSite(IActiveScript* This,IActiveScriptSite *pass) {
    return This->lpVtbl->SetScriptSite(This,pass);
}
static inline HRESULT IActiveScript_GetScriptSite(IActiveScript* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->GetScriptSite(This,riid,ppvObject);
}
static inline HRESULT IActiveScript_SetScriptState(IActiveScript* This,SCRIPTSTATE ss) {
    return This->lpVtbl->SetScriptState(This,ss);
}
static inline HRESULT IActiveScript_GetScriptState(IActiveScript* This,SCRIPTSTATE *pssState) {
    return This->lpVtbl->GetScriptState(This,pssState);
}
static inline HRESULT IActiveScript_Close(IActiveScript* This) {
    return This->lpVtbl->Close(This);
}
static inline HRESULT IActiveScript_AddNamedItem(IActiveScript* This,LPCOLESTR pstrName,DWORD dwFlags) {
    return This->lpVtbl->AddNamedItem(This,pstrName,dwFlags);
}
static inline HRESULT IActiveScript_AddTypeLib(IActiveScript* This,REFGUID rguidTypeLib,DWORD dwMajor,DWORD dwMinor,DWORD dwFlags) {
    return This->lpVtbl->AddTypeLib(This,rguidTypeLib,dwMajor,dwMinor,dwFlags);
}
static inline HRESULT IActiveScript_GetScriptDispatch(IActiveScript* This,LPCOLESTR pstrItemName,IDispatch **ppdisp) {
    return This->lpVtbl->GetScriptDispatch(This,pstrItemName,ppdisp);
}
static inline HRESULT IActiveScript_GetCurrentScriptThreadID(IActiveScript* This,SCRIPTTHREADID *pstidThread) {
    return This->lpVtbl->GetCurrentScriptThreadID(This,pstidThread);
}
static inline HRESULT IActiveScript_GetScriptThreadID(IActiveScript* This,DWORD dwWin32ThreadId,SCRIPTTHREADID *pstidThread) {
    return This->lpVtbl->GetScriptThreadID(This,dwWin32ThreadId,pstidThread);
}
static inline HRESULT IActiveScript_GetScriptThreadState(IActiveScript* This,SCRIPTTHREADID stidThread,SCRIPTTHREADSTATE *pstsState) {
    return This->lpVtbl->GetScriptThreadState(This,stidThread,pstsState);
}
static inline HRESULT IActiveScript_InterruptScriptThread(IActiveScript* This,SCRIPTTHREADID stidThread,const EXCEPINFO *pexcepinfo,DWORD dwFlags) {
    return This->lpVtbl->InterruptScriptThread(This,stidThread,pexcepinfo,dwFlags);
}
static inline HRESULT IActiveScript_Clone(IActiveScript* This,IActiveScript **ppscript) {
    return This->lpVtbl->Clone(This,ppscript);
}
#endif
#endif

#endif


#endif  /* __IActiveScript_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptParse32 interface
 */
#ifndef __IActiveScriptParse32_INTERFACE_DEFINED__
#define __IActiveScriptParse32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParse32, 0xbb1a2ae2, 0xa4f9, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bb1a2ae2-a4f9-11cf-8f20-00805f2cd064")
IActiveScriptParse32 : 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;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptParse32, 0xbb1a2ae2, 0xa4f9, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
#endif
#else
typedef struct IActiveScriptParse32Vtbl {
    BEGIN_INTERFACE

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *AddScriptlet)(
        IActiveScriptParse32 *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)(
        IActiveScriptParse32 *This,
        LPCOLESTR pstrCode,
        LPCOLESTR pstrItemName,
        IUnknown *punkContext,
        LPCOLESTR pstrDelimiter,
        DWORD dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        VARIANT *pvarResult,
        EXCEPINFO *pexcepinfo);

    END_INTERFACE
} IActiveScriptParse32Vtbl;

interface IActiveScriptParse32 {
    CONST_VTBL IActiveScriptParse32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptParse32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptParse32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptParse32_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptParse32 methods ***/
#define IActiveScriptParse32_InitNew(This) (This)->lpVtbl->InitNew(This)
#define IActiveScriptParse32_AddScriptlet(This,pstrDefaultName,pstrCode,pstrItemName,pstrSubItemName,pstrEventName,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pbstrName,pexcepinfo) (This)->lpVtbl->AddScriptlet(This,pstrDefaultName,pstrCode,pstrItemName,pstrSubItemName,pstrEventName,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pbstrName,pexcepinfo)
#define IActiveScriptParse32_ParseScriptText(This,pstrCode,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pvarResult,pexcepinfo) (This)->lpVtbl->ParseScriptText(This,pstrCode,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pvarResult,pexcepinfo)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptParse32_QueryInterface(IActiveScriptParse32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptParse32_AddRef(IActiveScriptParse32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptParse32_Release(IActiveScriptParse32* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptParse32 methods ***/
static inline HRESULT IActiveScriptParse32_InitNew(IActiveScriptParse32* This) {
    return This->lpVtbl->InitNew(This);
}
static inline HRESULT IActiveScriptParse32_AddScriptlet(IActiveScriptParse32* This,LPCOLESTR pstrDefaultName,LPCOLESTR pstrCode,LPCOLESTR pstrItemName,LPCOLESTR pstrSubItemName,LPCOLESTR pstrEventName,LPCOLESTR pstrDelimiter,DWORD dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,BSTR *pbstrName,EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->AddScriptlet(This,pstrDefaultName,pstrCode,pstrItemName,pstrSubItemName,pstrEventName,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pbstrName,pexcepinfo);
}
static inline HRESULT IActiveScriptParse32_ParseScriptText(IActiveScriptParse32* This,LPCOLESTR pstrCode,LPCOLESTR pstrItemName,IUnknown *punkContext,LPCOLESTR pstrDelimiter,DWORD dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,VARIANT *pvarResult,EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->ParseScriptText(This,pstrCode,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pvarResult,pexcepinfo);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptParse32_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptParse64 interface
 */
#ifndef __IActiveScriptParse64_INTERFACE_DEFINED__
#define __IActiveScriptParse64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParse64, 0xc7ef7658, 0xe1ee, 0x480e, 0x97,0xea, 0xd5,0x2c,0xb4,0xd7,0x6d,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c7ef7658-e1ee-480e-97ea-d52cb4d76d17")
IActiveScriptParse64 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitNew(
        ) = 0;

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

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptParse64, 0xc7ef7658, 0xe1ee, 0x480e, 0x97,0xea, 0xd5,0x2c,0xb4,0xd7,0x6d,0x17)
#endif
#else
typedef struct IActiveScriptParse64Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    END_INTERFACE
} IActiveScriptParse64Vtbl;

interface IActiveScriptParse64 {
    CONST_VTBL IActiveScriptParse64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptParse64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptParse64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptParse64_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptParse64 methods ***/
#define IActiveScriptParse64_InitNew(This) (This)->lpVtbl->InitNew(This)
#define IActiveScriptParse64_AddScriptlet(This,pstrDefaultName,pstrCode,pstrItemName,pstrSubItemName,pstrEventName,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pbstrName,pexcepinfo) (This)->lpVtbl->AddScriptlet(This,pstrDefaultName,pstrCode,pstrItemName,pstrSubItemName,pstrEventName,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pbstrName,pexcepinfo)
#define IActiveScriptParse64_ParseScriptText(This,pstrCode,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pvarResult,pexcepinfo) (This)->lpVtbl->ParseScriptText(This,pstrCode,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pvarResult,pexcepinfo)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptParse64_QueryInterface(IActiveScriptParse64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptParse64_AddRef(IActiveScriptParse64* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptParse64_Release(IActiveScriptParse64* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptParse64 methods ***/
static inline HRESULT IActiveScriptParse64_InitNew(IActiveScriptParse64* This) {
    return This->lpVtbl->InitNew(This);
}
static inline HRESULT IActiveScriptParse64_AddScriptlet(IActiveScriptParse64* This,LPCOLESTR pstrDefaultName,LPCOLESTR pstrCode,LPCOLESTR pstrItemName,LPCOLESTR pstrSubItemName,LPCOLESTR pstrEventName,LPCOLESTR pstrDelimiter,DWORDLONG dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,BSTR *pbstrName,EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->AddScriptlet(This,pstrDefaultName,pstrCode,pstrItemName,pstrSubItemName,pstrEventName,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pbstrName,pexcepinfo);
}
static inline HRESULT IActiveScriptParse64_ParseScriptText(IActiveScriptParse64* This,LPCOLESTR pstrCode,LPCOLESTR pstrItemName,IUnknown *punkContext,LPCOLESTR pstrDelimiter,DWORDLONG dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,VARIANT *pvarResult,EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->ParseScriptText(This,pstrCode,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,pvarResult,pexcepinfo);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptParse64_INTERFACE_DEFINED__ */


#ifdef _WIN64
#define IActiveScriptParse IActiveScriptParse64
#define IID_IActiveScriptParse IID_IActiveScriptParse64
#else
#define IActiveScriptParse     IActiveScriptParse32
#define IID_IActiveScriptParse IID_IActiveScriptParse32
#endif

typedef IActiveScriptParse *PIActiveScriptParse;

/*****************************************************************************
 * IActiveScriptParseProcedureOld32 interface
 */
#ifndef __IActiveScriptParseProcedureOld32_INTERFACE_DEFINED__
#define __IActiveScriptParseProcedureOld32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParseProcedureOld32, 0x1cff0050, 0x6fdd, 0x11d0, 0x93,0x28, 0x00,0xa0,0xc9,0x0d,0xca,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1cff0050-6fdd-11d0-9328-00a0c90dcaa9")
IActiveScriptParseProcedureOld32 : 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;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptParseProcedureOld32, 0x1cff0050, 0x6fdd, 0x11d0, 0x93,0x28, 0x00,0xa0,0xc9,0x0d,0xca,0xa9)
#endif
#else
typedef struct IActiveScriptParseProcedureOld32Vtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IActiveScriptParseProcedureOld32Vtbl;

interface IActiveScriptParseProcedureOld32 {
    CONST_VTBL IActiveScriptParseProcedureOld32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptParseProcedureOld32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptParseProcedureOld32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptParseProcedureOld32_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptParseProcedureOld32 methods ***/
#define IActiveScriptParseProcedureOld32_ParseProcedureText(This,pstrCode,pstrFormalParams,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp) (This)->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptParseProcedureOld32_QueryInterface(IActiveScriptParseProcedureOld32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptParseProcedureOld32_AddRef(IActiveScriptParseProcedureOld32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptParseProcedureOld32_Release(IActiveScriptParseProcedureOld32* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptParseProcedureOld32 methods ***/
static inline HRESULT IActiveScriptParseProcedureOld32_ParseProcedureText(IActiveScriptParseProcedureOld32* This,LPCOLESTR pstrCode,LPCOLESTR pstrFormalParams,LPCOLESTR pstrItemName,IUnknown *punkContext,LPCOLESTR pstrDelimiter,DWORD dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,IDispatch **ppdisp) {
    return This->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptParseProcedureOld32_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptParseProcedureOld64 interface
 */
#ifndef __IActiveScriptParseProcedureOld64_INTERFACE_DEFINED__
#define __IActiveScriptParseProcedureOld64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParseProcedureOld64, 0x21f57128, 0x08c9, 0x4638, 0xba,0x12, 0x22,0xd1,0x5d,0x88,0xdc,0x5c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("21f57128-08c9-4638-ba12-22d15d88dc5c")
IActiveScriptParseProcedureOld64 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ParseProcedureText(
        LPCOLESTR pstrCode,
        LPCOLESTR pstrFormalParams,
        LPCOLESTR pstrItemName,
        IUnknown *punkContext,
        LPCOLESTR pstrDelimiter,
        DWORDLONG dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        IDispatch **ppdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptParseProcedureOld64, 0x21f57128, 0x08c9, 0x4638, 0xba,0x12, 0x22,0xd1,0x5d,0x88,0xdc,0x5c)
#endif
#else
typedef struct IActiveScriptParseProcedureOld64Vtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IActiveScriptParseProcedureOld64Vtbl;

interface IActiveScriptParseProcedureOld64 {
    CONST_VTBL IActiveScriptParseProcedureOld64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptParseProcedureOld64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptParseProcedureOld64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptParseProcedureOld64_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptParseProcedureOld64 methods ***/
#define IActiveScriptParseProcedureOld64_ParseProcedureText(This,pstrCode,pstrFormalParams,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp) (This)->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptParseProcedureOld64_QueryInterface(IActiveScriptParseProcedureOld64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptParseProcedureOld64_AddRef(IActiveScriptParseProcedureOld64* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptParseProcedureOld64_Release(IActiveScriptParseProcedureOld64* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptParseProcedureOld64 methods ***/
static inline HRESULT IActiveScriptParseProcedureOld64_ParseProcedureText(IActiveScriptParseProcedureOld64* This,LPCOLESTR pstrCode,LPCOLESTR pstrFormalParams,LPCOLESTR pstrItemName,IUnknown *punkContext,LPCOLESTR pstrDelimiter,DWORDLONG dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,IDispatch **ppdisp) {
    return This->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptParseProcedureOld64_INTERFACE_DEFINED__ */


#ifdef _WIN64
#define IActiveScriptParseProcedureOld IActiveScriptParseProcedureOld64
#define IID_IActiveScriptParseProcedureOld IID_IActiveScriptParseProcedureOld64
#else
#define     IActiveScriptParseProcedureOld IActiveScriptParseProcedureOld32
#define IID_IActiveScriptParseProcedureOld IID_IActiveScriptParseProcedureOld32
#endif

typedef IActiveScriptParseProcedureOld *PIActiveScriptParseProcedureOld;

/*****************************************************************************
 * IActiveScriptParseProcedure32 interface
 */
#ifndef __IActiveScriptParseProcedure32_INTERFACE_DEFINED__
#define __IActiveScriptParseProcedure32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParseProcedure32, 0xaa5b6a80, 0xb834, 0x11d0, 0x93,0x2f, 0x00,0xa0,0xc9,0x0d,0xca,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aa5b6a80-b834-11d0-932f-00a0c90dcaa9")
IActiveScriptParseProcedure32 : 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;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptParseProcedure32, 0xaa5b6a80, 0xb834, 0x11d0, 0x93,0x2f, 0x00,0xa0,0xc9,0x0d,0xca,0xa9)
#endif
#else
typedef struct IActiveScriptParseProcedure32Vtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IActiveScriptParseProcedure32Vtbl;

interface IActiveScriptParseProcedure32 {
    CONST_VTBL IActiveScriptParseProcedure32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptParseProcedure32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptParseProcedure32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptParseProcedure32_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptParseProcedure32 methods ***/
#define IActiveScriptParseProcedure32_ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp) (This)->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptParseProcedure32_QueryInterface(IActiveScriptParseProcedure32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptParseProcedure32_AddRef(IActiveScriptParseProcedure32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptParseProcedure32_Release(IActiveScriptParseProcedure32* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptParseProcedure32 methods ***/
static inline HRESULT IActiveScriptParseProcedure32_ParseProcedureText(IActiveScriptParseProcedure32* This,LPCOLESTR pstrCode,LPCOLESTR pstrFormalParams,LPCOLESTR pstrProcedureName,LPCOLESTR pstrItemName,IUnknown *punkContext,LPCOLESTR pstrDelimiter,DWORD dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,IDispatch **ppdisp) {
    return This->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptParseProcedure32_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptParseProcedure64 interface
 */
#ifndef __IActiveScriptParseProcedure64_INTERFACE_DEFINED__
#define __IActiveScriptParseProcedure64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParseProcedure64, 0xc64713b6, 0xe029, 0x4cc5, 0x92,0x00, 0x43,0x8b,0x72,0x89,0x0b,0x6a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c64713b6-e029-4cc5-9200-438b72890b6a")
IActiveScriptParseProcedure64 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ParseProcedureText(
        LPCOLESTR pstrCode,
        LPCOLESTR pstrFormalParams,
        LPCOLESTR pstrProcedureName,
        LPCOLESTR pstrItemName,
        IUnknown *punkContext,
        LPCOLESTR pstrDelimiter,
        DWORDLONG dwSourceContextCookie,
        ULONG ulStartingLineNumber,
        DWORD dwFlags,
        IDispatch **ppdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptParseProcedure64, 0xc64713b6, 0xe029, 0x4cc5, 0x92,0x00, 0x43,0x8b,0x72,0x89,0x0b,0x6a)
#endif
#else
typedef struct IActiveScriptParseProcedure64Vtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IActiveScriptParseProcedure64Vtbl;

interface IActiveScriptParseProcedure64 {
    CONST_VTBL IActiveScriptParseProcedure64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptParseProcedure64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptParseProcedure64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptParseProcedure64_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptParseProcedure64 methods ***/
#define IActiveScriptParseProcedure64_ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp) (This)->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptParseProcedure64_QueryInterface(IActiveScriptParseProcedure64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptParseProcedure64_AddRef(IActiveScriptParseProcedure64* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptParseProcedure64_Release(IActiveScriptParseProcedure64* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptParseProcedure64 methods ***/
static inline HRESULT IActiveScriptParseProcedure64_ParseProcedureText(IActiveScriptParseProcedure64* This,LPCOLESTR pstrCode,LPCOLESTR pstrFormalParams,LPCOLESTR pstrProcedureName,LPCOLESTR pstrItemName,IUnknown *punkContext,LPCOLESTR pstrDelimiter,DWORDLONG dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,IDispatch **ppdisp) {
    return This->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptParseProcedure64_INTERFACE_DEFINED__ */


#ifdef _WIN64
#define IActiveScriptParseProcedure IActiveScriptParseProcedure64
#define IID_IActiveScriptParseProcedure IID_IActiveScriptParseProcedure64
#else
#define IActiveScriptParseProcedure IActiveScriptParseProcedure32
#define IID_IActiveScriptParseProcedure IID_IActiveScriptParseProcedure32
#endif

typedef IActiveScriptParseProcedure *PIActiveScriptParseProcedure;

/*****************************************************************************
 * IActiveScriptParseProcedure2_32 interface
 */
#ifndef __IActiveScriptParseProcedure2_32_INTERFACE_DEFINED__
#define __IActiveScriptParseProcedure2_32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParseProcedure2_32, 0x71ee5b20, 0xfb04, 0x11d1, 0xb3,0xa8, 0x00,0xa0,0xc9,0x11,0xe8,0xb2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71ee5b20-fb04-11d1-b3a8-00a0c911e8b2")
IActiveScriptParseProcedure2_32 : public IActiveScriptParseProcedure32
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptParseProcedure2_32, 0x71ee5b20, 0xfb04, 0x11d1, 0xb3,0xa8, 0x00,0xa0,0xc9,0x11,0xe8,0xb2)
#endif
#else
typedef struct IActiveScriptParseProcedure2_32Vtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IActiveScriptParseProcedure2_32Vtbl;

interface IActiveScriptParseProcedure2_32 {
    CONST_VTBL IActiveScriptParseProcedure2_32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptParseProcedure2_32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptParseProcedure2_32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptParseProcedure2_32_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptParseProcedure32 methods ***/
#define IActiveScriptParseProcedure2_32_ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp) (This)->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptParseProcedure2_32_QueryInterface(IActiveScriptParseProcedure2_32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptParseProcedure2_32_AddRef(IActiveScriptParseProcedure2_32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptParseProcedure2_32_Release(IActiveScriptParseProcedure2_32* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptParseProcedure32 methods ***/
static inline HRESULT IActiveScriptParseProcedure2_32_ParseProcedureText(IActiveScriptParseProcedure2_32* This,LPCOLESTR pstrCode,LPCOLESTR pstrFormalParams,LPCOLESTR pstrProcedureName,LPCOLESTR pstrItemName,IUnknown *punkContext,LPCOLESTR pstrDelimiter,DWORD dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,IDispatch **ppdisp) {
    return This->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptParseProcedure2_32_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptParseProcedure2_64 interface
 */
#ifndef __IActiveScriptParseProcedure2_64_INTERFACE_DEFINED__
#define __IActiveScriptParseProcedure2_64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptParseProcedure2_64, 0xfe7c4271, 0x210c, 0x448d, 0x9f,0x54, 0x76,0xda,0xb7,0x04,0x7b,0x28);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fe7c4271-210c-448d-9f54-76dab7047b28")
IActiveScriptParseProcedure2_64 : public IActiveScriptParseProcedure64
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptParseProcedure2_64, 0xfe7c4271, 0x210c, 0x448d, 0x9f,0x54, 0x76,0xda,0xb7,0x04,0x7b,0x28)
#endif
#else
typedef struct IActiveScriptParseProcedure2_64Vtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IActiveScriptParseProcedure2_64Vtbl;

interface IActiveScriptParseProcedure2_64 {
    CONST_VTBL IActiveScriptParseProcedure2_64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptParseProcedure2_64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptParseProcedure2_64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptParseProcedure2_64_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptParseProcedure64 methods ***/
#define IActiveScriptParseProcedure2_64_ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp) (This)->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptParseProcedure2_64_QueryInterface(IActiveScriptParseProcedure2_64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptParseProcedure2_64_AddRef(IActiveScriptParseProcedure2_64* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptParseProcedure2_64_Release(IActiveScriptParseProcedure2_64* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptParseProcedure64 methods ***/
static inline HRESULT IActiveScriptParseProcedure2_64_ParseProcedureText(IActiveScriptParseProcedure2_64* This,LPCOLESTR pstrCode,LPCOLESTR pstrFormalParams,LPCOLESTR pstrProcedureName,LPCOLESTR pstrItemName,IUnknown *punkContext,LPCOLESTR pstrDelimiter,DWORDLONG dwSourceContextCookie,ULONG ulStartingLineNumber,DWORD dwFlags,IDispatch **ppdisp) {
    return This->lpVtbl->ParseProcedureText(This,pstrCode,pstrFormalParams,pstrProcedureName,pstrItemName,punkContext,pstrDelimiter,dwSourceContextCookie,ulStartingLineNumber,dwFlags,ppdisp);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptParseProcedure2_64_INTERFACE_DEFINED__ */


#ifdef _WIN64
#define IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_64
#define IID_IActiveScriptParseProcedure2 IID_IActiveScriptParseProcedure2_64
#else
#define IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_32
#define IID_IActiveScriptParseProcedure2 IID_IActiveScriptParseProcedure2_32
#endif

typedef IActiveScriptParseProcedure2 *PIActiveScriptParseProcedure2;

/*****************************************************************************
 * IActiveScriptEncode interface
 */
#ifndef __IActiveScriptEncode_INTERFACE_DEFINED__
#define __IActiveScriptEncode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptEncode, 0xbb1a2ae3, 0xa4f9, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bb1a2ae3-a4f9-11cf-8f20-00805f2cd064")
IActiveScriptEncode : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EncodeSection(
        LPCOLESTR pchIn,
        DWORD cchIn,
        LPOLESTR pchOut,
        DWORD cchOut,
        DWORD *pcchRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE DecodeScript(
        LPCOLESTR pchIn,
        DWORD cchIn,
        LPOLESTR pchOut,
        DWORD cchOut,
        DWORD *pcchRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEncodeProgId(
        BSTR *pbstrOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptEncode, 0xbb1a2ae3, 0xa4f9, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
#endif
#else
typedef struct IActiveScriptEncodeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptEncode methods ***/
    HRESULT (STDMETHODCALLTYPE *EncodeSection)(
        IActiveScriptEncode *This,
        LPCOLESTR pchIn,
        DWORD cchIn,
        LPOLESTR pchOut,
        DWORD cchOut,
        DWORD *pcchRet);

    HRESULT (STDMETHODCALLTYPE *DecodeScript)(
        IActiveScriptEncode *This,
        LPCOLESTR pchIn,
        DWORD cchIn,
        LPOLESTR pchOut,
        DWORD cchOut,
        DWORD *pcchRet);

    HRESULT (STDMETHODCALLTYPE *GetEncodeProgId)(
        IActiveScriptEncode *This,
        BSTR *pbstrOut);

    END_INTERFACE
} IActiveScriptEncodeVtbl;

interface IActiveScriptEncode {
    CONST_VTBL IActiveScriptEncodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptEncode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptEncode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptEncode_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptEncode methods ***/
#define IActiveScriptEncode_EncodeSection(This,pchIn,cchIn,pchOut,cchOut,pcchRet) (This)->lpVtbl->EncodeSection(This,pchIn,cchIn,pchOut,cchOut,pcchRet)
#define IActiveScriptEncode_DecodeScript(This,pchIn,cchIn,pchOut,cchOut,pcchRet) (This)->lpVtbl->DecodeScript(This,pchIn,cchIn,pchOut,cchOut,pcchRet)
#define IActiveScriptEncode_GetEncodeProgId(This,pbstrOut) (This)->lpVtbl->GetEncodeProgId(This,pbstrOut)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptEncode_QueryInterface(IActiveScriptEncode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptEncode_AddRef(IActiveScriptEncode* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptEncode_Release(IActiveScriptEncode* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptEncode methods ***/
static inline HRESULT IActiveScriptEncode_EncodeSection(IActiveScriptEncode* This,LPCOLESTR pchIn,DWORD cchIn,LPOLESTR pchOut,DWORD cchOut,DWORD *pcchRet) {
    return This->lpVtbl->EncodeSection(This,pchIn,cchIn,pchOut,cchOut,pcchRet);
}
static inline HRESULT IActiveScriptEncode_DecodeScript(IActiveScriptEncode* This,LPCOLESTR pchIn,DWORD cchIn,LPOLESTR pchOut,DWORD cchOut,DWORD *pcchRet) {
    return This->lpVtbl->DecodeScript(This,pchIn,cchIn,pchOut,cchOut,pcchRet);
}
static inline HRESULT IActiveScriptEncode_GetEncodeProgId(IActiveScriptEncode* This,BSTR *pbstrOut) {
    return This->lpVtbl->GetEncodeProgId(This,pbstrOut);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptEncode_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptHostEncode interface
 */
#ifndef __IActiveScriptHostEncode_INTERFACE_DEFINED__
#define __IActiveScriptHostEncode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptHostEncode, 0xbee9b76e, 0xcfe3, 0x11d1, 0xb7,0x47, 0x00,0xc0,0x4f,0xc2,0xb0,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bee9b76e-cfe3-11d1-b747-00c04fc2b085")
IActiveScriptHostEncode : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EncodeScriptHostFile(
        BSTR bstrInFile,
        BSTR *pbstrOutFile,
        ULONG cFlags,
        BSTR bstrDefaultLang) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptHostEncode, 0xbee9b76e, 0xcfe3, 0x11d1, 0xb7,0x47, 0x00,0xc0,0x4f,0xc2,0xb0,0x85)
#endif
#else
typedef struct IActiveScriptHostEncodeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptHostEncode methods ***/
    HRESULT (STDMETHODCALLTYPE *EncodeScriptHostFile)(
        IActiveScriptHostEncode *This,
        BSTR bstrInFile,
        BSTR *pbstrOutFile,
        ULONG cFlags,
        BSTR bstrDefaultLang);

    END_INTERFACE
} IActiveScriptHostEncodeVtbl;

interface IActiveScriptHostEncode {
    CONST_VTBL IActiveScriptHostEncodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptHostEncode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptHostEncode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptHostEncode_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptHostEncode methods ***/
#define IActiveScriptHostEncode_EncodeScriptHostFile(This,bstrInFile,pbstrOutFile,cFlags,bstrDefaultLang) (This)->lpVtbl->EncodeScriptHostFile(This,bstrInFile,pbstrOutFile,cFlags,bstrDefaultLang)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptHostEncode_QueryInterface(IActiveScriptHostEncode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptHostEncode_AddRef(IActiveScriptHostEncode* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptHostEncode_Release(IActiveScriptHostEncode* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptHostEncode methods ***/
static inline HRESULT IActiveScriptHostEncode_EncodeScriptHostFile(IActiveScriptHostEncode* This,BSTR bstrInFile,BSTR *pbstrOutFile,ULONG cFlags,BSTR bstrDefaultLang) {
    return This->lpVtbl->EncodeScriptHostFile(This,bstrInFile,pbstrOutFile,cFlags,bstrDefaultLang);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptHostEncode_INTERFACE_DEFINED__ */


/*****************************************************************************
 * 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)
MIDL_INTERFACE("63cdbcb0-c1b1-11d0-9336-00a0c90dcaa9")
IBindEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE BindHandler(
        LPCOLESTR pstrEvent,
        IDispatch *pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBindEventHandler, 0x63cdbcb0, 0xc1b1, 0x11d0, 0x93,0x36, 0x00,0xa0,0xc9,0x0d,0xca,0xa9)
#endif
#else
typedef 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
} IBindEventHandlerVtbl;

interface IBindEventHandler {
    CONST_VTBL IBindEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBindEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBindEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBindEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IBindEventHandler methods ***/
#define IBindEventHandler_BindHandler(This,pstrEvent,pdisp) (This)->lpVtbl->BindHandler(This,pstrEvent,pdisp)
#else
/*** IUnknown methods ***/
static inline HRESULT IBindEventHandler_QueryInterface(IBindEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IBindEventHandler_AddRef(IBindEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IBindEventHandler_Release(IBindEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IBindEventHandler methods ***/
static inline HRESULT IBindEventHandler_BindHandler(IBindEventHandler* This,LPCOLESTR pstrEvent,IDispatch *pdisp) {
    return This->lpVtbl->BindHandler(This,pstrEvent,pdisp);
}
#endif
#endif

#endif


#endif  /* __IBindEventHandler_INTERFACE_DEFINED__ */


/*****************************************************************************
 * 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)
MIDL_INTERFACE("b8da6310-e19b-11d0-933c-00a0c90dcaa9")
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;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptStats, 0xb8da6310, 0xe19b, 0x11d0, 0x93,0x3c, 0x00,0xa0,0xc9,0x0d,0xca,0xa9)
#endif
#else
typedef 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
} IActiveScriptStatsVtbl;

interface IActiveScriptStats {
    CONST_VTBL IActiveScriptStatsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptStats_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptStats_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptStats_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptStats methods ***/
#define IActiveScriptStats_GetStat(This,stid,pluHi,pluLo) (This)->lpVtbl->GetStat(This,stid,pluHi,pluLo)
#define IActiveScriptStats_GetStatEx(This,guid,pluHi,pluLo) (This)->lpVtbl->GetStatEx(This,guid,pluHi,pluLo)
#define IActiveScriptStats_ResetStats(This) (This)->lpVtbl->ResetStats(This)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptStats_QueryInterface(IActiveScriptStats* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptStats_AddRef(IActiveScriptStats* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptStats_Release(IActiveScriptStats* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptStats methods ***/
static inline HRESULT IActiveScriptStats_GetStat(IActiveScriptStats* This,DWORD stid,ULONG *pluHi,ULONG *pluLo) {
    return This->lpVtbl->GetStat(This,stid,pluHi,pluLo);
}
static inline HRESULT IActiveScriptStats_GetStatEx(IActiveScriptStats* This,REFGUID guid,ULONG *pluHi,ULONG *pluLo) {
    return This->lpVtbl->GetStatEx(This,guid,pluHi,pluLo);
}
static inline HRESULT IActiveScriptStats_ResetStats(IActiveScriptStats* This) {
    return This->lpVtbl->ResetStats(This);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptStats_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptProperty interface
 */
#ifndef __IActiveScriptProperty_INTERFACE_DEFINED__
#define __IActiveScriptProperty_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptProperty, 0x4954e0d0, 0xfbc7, 0x11d1, 0x84,0x10, 0x00,0x60,0x08,0xc3,0xfb,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4954e0d0-fbc7-11d1-8410-006008c3fbfc")
IActiveScriptProperty : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetProperty(
        DWORD dwProperty,
        VARIANT *pvarIndex,
        VARIANT *pvarValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProperty(
        DWORD dwProperty,
        VARIANT *pvarIndex,
        VARIANT *pvarValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptProperty, 0x4954e0d0, 0xfbc7, 0x11d1, 0x84,0x10, 0x00,0x60,0x08,0xc3,0xfb,0xfc)
#endif
#else
typedef struct IActiveScriptPropertyVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptProperty methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProperty)(
        IActiveScriptProperty *This,
        DWORD dwProperty,
        VARIANT *pvarIndex,
        VARIANT *pvarValue);

    HRESULT (STDMETHODCALLTYPE *SetProperty)(
        IActiveScriptProperty *This,
        DWORD dwProperty,
        VARIANT *pvarIndex,
        VARIANT *pvarValue);

    END_INTERFACE
} IActiveScriptPropertyVtbl;

interface IActiveScriptProperty {
    CONST_VTBL IActiveScriptPropertyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptProperty_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptProperty methods ***/
#define IActiveScriptProperty_GetProperty(This,dwProperty,pvarIndex,pvarValue) (This)->lpVtbl->GetProperty(This,dwProperty,pvarIndex,pvarValue)
#define IActiveScriptProperty_SetProperty(This,dwProperty,pvarIndex,pvarValue) (This)->lpVtbl->SetProperty(This,dwProperty,pvarIndex,pvarValue)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptProperty_QueryInterface(IActiveScriptProperty* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptProperty_AddRef(IActiveScriptProperty* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptProperty_Release(IActiveScriptProperty* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptProperty methods ***/
static inline HRESULT IActiveScriptProperty_GetProperty(IActiveScriptProperty* This,DWORD dwProperty,VARIANT *pvarIndex,VARIANT *pvarValue) {
    return This->lpVtbl->GetProperty(This,dwProperty,pvarIndex,pvarValue);
}
static inline HRESULT IActiveScriptProperty_SetProperty(IActiveScriptProperty* This,DWORD dwProperty,VARIANT *pvarIndex,VARIANT *pvarValue) {
    return This->lpVtbl->SetProperty(This,dwProperty,pvarIndex,pvarValue);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptProperty_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITridentEventSink interface
 */
#ifndef __ITridentEventSink_INTERFACE_DEFINED__
#define __ITridentEventSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITridentEventSink, 0x1dc9ca50, 0x06ef, 0x11d2, 0x84,0x15, 0x00,0x60,0x08,0xc3,0xfb,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1dc9ca50-06ef-11d2-8415-006008c3fbfc")
ITridentEventSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FireEvent(
        LPCOLESTR pstrEvent,
        DISPPARAMS *pdp,
        VARIANT *pvarRes,
        EXCEPINFO *pei) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITridentEventSink, 0x1dc9ca50, 0x06ef, 0x11d2, 0x84,0x15, 0x00,0x60,0x08,0xc3,0xfb,0xfc)
#endif
#else
typedef struct ITridentEventSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITridentEventSink methods ***/
    HRESULT (STDMETHODCALLTYPE *FireEvent)(
        ITridentEventSink *This,
        LPCOLESTR pstrEvent,
        DISPPARAMS *pdp,
        VARIANT *pvarRes,
        EXCEPINFO *pei);

    END_INTERFACE
} ITridentEventSinkVtbl;

interface ITridentEventSink {
    CONST_VTBL ITridentEventSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITridentEventSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITridentEventSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITridentEventSink_Release(This) (This)->lpVtbl->Release(This)
/*** ITridentEventSink methods ***/
#define ITridentEventSink_FireEvent(This,pstrEvent,pdp,pvarRes,pei) (This)->lpVtbl->FireEvent(This,pstrEvent,pdp,pvarRes,pei)
#else
/*** IUnknown methods ***/
static inline HRESULT ITridentEventSink_QueryInterface(ITridentEventSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITridentEventSink_AddRef(ITridentEventSink* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITridentEventSink_Release(ITridentEventSink* This) {
    return This->lpVtbl->Release(This);
}
/*** ITridentEventSink methods ***/
static inline HRESULT ITridentEventSink_FireEvent(ITridentEventSink* This,LPCOLESTR pstrEvent,DISPPARAMS *pdp,VARIANT *pvarRes,EXCEPINFO *pei) {
    return This->lpVtbl->FireEvent(This,pstrEvent,pdp,pvarRes,pei);
}
#endif
#endif

#endif


#endif  /* __ITridentEventSink_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptGarbageCollector interface
 */
#ifndef __IActiveScriptGarbageCollector_INTERFACE_DEFINED__
#define __IActiveScriptGarbageCollector_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptGarbageCollector, 0x6aa2c4a0, 0x2b53, 0x11d4, 0xa2,0xa0, 0x00,0x10,0x4b,0xd3,0x50,0x90);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6aa2c4a0-2b53-11d4-a2a0-00104bd35090")
IActiveScriptGarbageCollector : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CollectGarbage(
        SCRIPTGCTYPE scriptgctype) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptGarbageCollector, 0x6aa2c4a0, 0x2b53, 0x11d4, 0xa2,0xa0, 0x00,0x10,0x4b,0xd3,0x50,0x90)
#endif
#else
typedef struct IActiveScriptGarbageCollectorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptGarbageCollector methods ***/
    HRESULT (STDMETHODCALLTYPE *CollectGarbage)(
        IActiveScriptGarbageCollector *This,
        SCRIPTGCTYPE scriptgctype);

    END_INTERFACE
} IActiveScriptGarbageCollectorVtbl;

interface IActiveScriptGarbageCollector {
    CONST_VTBL IActiveScriptGarbageCollectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptGarbageCollector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptGarbageCollector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptGarbageCollector_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptGarbageCollector methods ***/
#define IActiveScriptGarbageCollector_CollectGarbage(This,scriptgctype) (This)->lpVtbl->CollectGarbage(This,scriptgctype)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptGarbageCollector_QueryInterface(IActiveScriptGarbageCollector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptGarbageCollector_AddRef(IActiveScriptGarbageCollector* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptGarbageCollector_Release(IActiveScriptGarbageCollector* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptGarbageCollector methods ***/
static inline HRESULT IActiveScriptGarbageCollector_CollectGarbage(IActiveScriptGarbageCollector* This,SCRIPTGCTYPE scriptgctype) {
    return This->lpVtbl->CollectGarbage(This,scriptgctype);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptGarbageCollector_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptSIPInfo interface
 */
#ifndef __IActiveScriptSIPInfo_INTERFACE_DEFINED__
#define __IActiveScriptSIPInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptSIPInfo, 0x764651d0, 0x38de, 0x11d4, 0xa2,0xa3, 0x00,0x10,0x4b,0xd3,0x50,0x90);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("764651d0-38de-11d4-a2a3-00104bd35090")
IActiveScriptSIPInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSIPOID(
        GUID *poid_sip) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptSIPInfo, 0x764651d0, 0x38de, 0x11d4, 0xa2,0xa3, 0x00,0x10,0x4b,0xd3,0x50,0x90)
#endif
#else
typedef struct IActiveScriptSIPInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptSIPInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSIPOID)(
        IActiveScriptSIPInfo *This,
        GUID *poid_sip);

    END_INTERFACE
} IActiveScriptSIPInfoVtbl;

interface IActiveScriptSIPInfo {
    CONST_VTBL IActiveScriptSIPInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptSIPInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptSIPInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptSIPInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptSIPInfo methods ***/
#define IActiveScriptSIPInfo_GetSIPOID(This,poid_sip) (This)->lpVtbl->GetSIPOID(This,poid_sip)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptSIPInfo_QueryInterface(IActiveScriptSIPInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptSIPInfo_AddRef(IActiveScriptSIPInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptSIPInfo_Release(IActiveScriptSIPInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSIPInfo methods ***/
static inline HRESULT IActiveScriptSIPInfo_GetSIPOID(IActiveScriptSIPInfo* This,GUID *poid_sip) {
    return This->lpVtbl->GetSIPOID(This,poid_sip);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptSIPInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptSiteTraceInfo interface
 */
#ifndef __IActiveScriptSiteTraceInfo_INTERFACE_DEFINED__
#define __IActiveScriptSiteTraceInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptSiteTraceInfo, 0x4b7272ae, 0x1955, 0x4bfe, 0x98,0xb0, 0x78,0x06,0x21,0x88,0x85,0x69);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4b7272ae-1955-4bfe-98b0-780621888569")
IActiveScriptSiteTraceInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SendScriptTraceInfo(
        SCRIPTTRACEINFO stiEventType,
        GUID guidContextID,
        DWORD dwScriptContextCookie,
        LONG lScriptStatementStart,
        LONG lScriptStatementEnd,
        DWORD64 dwReserved) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptSiteTraceInfo, 0x4b7272ae, 0x1955, 0x4bfe, 0x98,0xb0, 0x78,0x06,0x21,0x88,0x85,0x69)
#endif
#else
typedef struct IActiveScriptSiteTraceInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptSiteTraceInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *SendScriptTraceInfo)(
        IActiveScriptSiteTraceInfo *This,
        SCRIPTTRACEINFO stiEventType,
        GUID guidContextID,
        DWORD dwScriptContextCookie,
        LONG lScriptStatementStart,
        LONG lScriptStatementEnd,
        DWORD64 dwReserved);

    END_INTERFACE
} IActiveScriptSiteTraceInfoVtbl;

interface IActiveScriptSiteTraceInfo {
    CONST_VTBL IActiveScriptSiteTraceInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptSiteTraceInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptSiteTraceInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptSiteTraceInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptSiteTraceInfo methods ***/
#define IActiveScriptSiteTraceInfo_SendScriptTraceInfo(This,stiEventType,guidContextID,dwScriptContextCookie,lScriptStatementStart,lScriptStatementEnd,dwReserved) (This)->lpVtbl->SendScriptTraceInfo(This,stiEventType,guidContextID,dwScriptContextCookie,lScriptStatementStart,lScriptStatementEnd,dwReserved)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptSiteTraceInfo_QueryInterface(IActiveScriptSiteTraceInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptSiteTraceInfo_AddRef(IActiveScriptSiteTraceInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptSiteTraceInfo_Release(IActiveScriptSiteTraceInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteTraceInfo methods ***/
static inline HRESULT IActiveScriptSiteTraceInfo_SendScriptTraceInfo(IActiveScriptSiteTraceInfo* This,SCRIPTTRACEINFO stiEventType,GUID guidContextID,DWORD dwScriptContextCookie,LONG lScriptStatementStart,LONG lScriptStatementEnd,DWORD64 dwReserved) {
    return This->lpVtbl->SendScriptTraceInfo(This,stiEventType,guidContextID,dwScriptContextCookie,lScriptStatementStart,lScriptStatementEnd,dwReserved);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptSiteTraceInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptTraceInfo interface
 */
#ifndef __IActiveScriptTraceInfo_INTERFACE_DEFINED__
#define __IActiveScriptTraceInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptTraceInfo, 0xc35456e7, 0xbebf, 0x4a1b, 0x86,0xa9, 0x24,0xd5,0x6b,0xe8,0xb3,0x69);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c35456e7-bebf-4a1b-86a9-24d56be8b369")
IActiveScriptTraceInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartScriptTracing(
        IActiveScriptSiteTraceInfo *pSiteTraceInfo,
        GUID guidContextID) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopScriptTracing(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptTraceInfo, 0xc35456e7, 0xbebf, 0x4a1b, 0x86,0xa9, 0x24,0xd5,0x6b,0xe8,0xb3,0x69)
#endif
#else
typedef struct IActiveScriptTraceInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptTraceInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *StartScriptTracing)(
        IActiveScriptTraceInfo *This,
        IActiveScriptSiteTraceInfo *pSiteTraceInfo,
        GUID guidContextID);

    HRESULT (STDMETHODCALLTYPE *StopScriptTracing)(
        IActiveScriptTraceInfo *This);

    END_INTERFACE
} IActiveScriptTraceInfoVtbl;

interface IActiveScriptTraceInfo {
    CONST_VTBL IActiveScriptTraceInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptTraceInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptTraceInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptTraceInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptTraceInfo methods ***/
#define IActiveScriptTraceInfo_StartScriptTracing(This,pSiteTraceInfo,guidContextID) (This)->lpVtbl->StartScriptTracing(This,pSiteTraceInfo,guidContextID)
#define IActiveScriptTraceInfo_StopScriptTracing(This) (This)->lpVtbl->StopScriptTracing(This)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptTraceInfo_QueryInterface(IActiveScriptTraceInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptTraceInfo_AddRef(IActiveScriptTraceInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptTraceInfo_Release(IActiveScriptTraceInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptTraceInfo methods ***/
static inline HRESULT IActiveScriptTraceInfo_StartScriptTracing(IActiveScriptTraceInfo* This,IActiveScriptSiteTraceInfo *pSiteTraceInfo,GUID guidContextID) {
    return This->lpVtbl->StartScriptTracing(This,pSiteTraceInfo,guidContextID);
}
static inline HRESULT IActiveScriptTraceInfo_StopScriptTracing(IActiveScriptTraceInfo* This) {
    return This->lpVtbl->StopScriptTracing(This);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptTraceInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptStringCompare interface
 */
#ifndef __IActiveScriptStringCompare_INTERFACE_DEFINED__
#define __IActiveScriptStringCompare_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptStringCompare, 0x58562769, 0xed52, 0x42f7, 0x84,0x03, 0x49,0x63,0x51,0x4e,0x1f,0x11);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("58562769-ed52-42f7-8403-4963514e1f11")
IActiveScriptStringCompare : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StrComp(
        BSTR bszStr1,
        BSTR bszStr2,
        LONG *iRet) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptStringCompare, 0x58562769, 0xed52, 0x42f7, 0x84,0x03, 0x49,0x63,0x51,0x4e,0x1f,0x11)
#endif
#else
typedef struct IActiveScriptStringCompareVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptStringCompare methods ***/
    HRESULT (STDMETHODCALLTYPE *StrComp)(
        IActiveScriptStringCompare *This,
        BSTR bszStr1,
        BSTR bszStr2,
        LONG *iRet);

    END_INTERFACE
} IActiveScriptStringCompareVtbl;

interface IActiveScriptStringCompare {
    CONST_VTBL IActiveScriptStringCompareVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptStringCompare_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptStringCompare_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptStringCompare_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptStringCompare methods ***/
#define IActiveScriptStringCompare_StrComp(This,bszStr1,bszStr2,iRet) (This)->lpVtbl->StrComp(This,bszStr1,bszStr2,iRet)
#else
/*** IUnknown methods ***/
static inline HRESULT IActiveScriptStringCompare_QueryInterface(IActiveScriptStringCompare* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActiveScriptStringCompare_AddRef(IActiveScriptStringCompare* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActiveScriptStringCompare_Release(IActiveScriptStringCompare* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptStringCompare methods ***/
static inline HRESULT IActiveScriptStringCompare_StrComp(IActiveScriptStringCompare* This,BSTR bszStr1,BSTR bszStr2,LONG *iRet) {
    return This->lpVtbl->StrComp(This,bszStr1,bszStr2,iRet);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptStringCompare_INTERFACE_DEFINED__ */

#endif

#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
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 HWND_UserSize     (ULONG *, ULONG, HWND *);
unsigned char * __RPC_USER HWND_UserMarshal  (ULONG *, unsigned char *, HWND *);
unsigned char * __RPC_USER HWND_UserUnmarshal(ULONG *, unsigned char *, HWND *);
void            __RPC_USER HWND_UserFree     (ULONG *, HWND *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __activscp_h__ */
