/*** Autogenerated by WIDL 10.11 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__ */
