/*** Autogenerated by WIDL 6.3 from include/activdbg100.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 __activdbg100_h__
#define __activdbg100_h__

/* Forward declarations */

#ifndef __IDebugApplicationNode100_FWD_DEFINED__
#define __IDebugApplicationNode100_FWD_DEFINED__
typedef interface IDebugApplicationNode100 IDebugApplicationNode100;
#ifdef __cplusplus
interface IDebugApplicationNode100;
#endif /* __cplusplus */
#endif

#ifndef __IWebAppDiagnosticsSetup_FWD_DEFINED__
#define __IWebAppDiagnosticsSetup_FWD_DEFINED__
typedef interface IWebAppDiagnosticsSetup IWebAppDiagnosticsSetup;
#ifdef __cplusplus
interface IWebAppDiagnosticsSetup;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugApplication110_FWD_DEFINED__
#define __IRemoteDebugApplication110_FWD_DEFINED__
typedef interface IRemoteDebugApplication110 IRemoteDebugApplication110;
#ifdef __cplusplus
interface IRemoteDebugApplication110;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplication11032_FWD_DEFINED__
#define __IDebugApplication11032_FWD_DEFINED__
typedef interface IDebugApplication11032 IDebugApplication11032;
#ifdef __cplusplus
interface IDebugApplication11032;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplication11064_FWD_DEFINED__
#define __IDebugApplication11064_FWD_DEFINED__
typedef interface IDebugApplication11064 IDebugApplication11064;
#ifdef __cplusplus
interface IDebugApplication11064;
#endif /* __cplusplus */
#endif

#ifndef __IWebAppDiagnosticsObjectInitialization_FWD_DEFINED__
#define __IWebAppDiagnosticsObjectInitialization_FWD_DEFINED__
typedef interface IWebAppDiagnosticsObjectInitialization IWebAppDiagnosticsObjectInitialization;
#ifdef __cplusplus
interface IWebAppDiagnosticsObjectInitialization;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptWinRTErrorDebug_FWD_DEFINED__
#define __IActiveScriptWinRTErrorDebug_FWD_DEFINED__
typedef interface IActiveScriptWinRTErrorDebug IActiveScriptWinRTErrorDebug;
#ifdef __cplusplus
interface IActiveScriptWinRTErrorDebug;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptErrorDebug110_FWD_DEFINED__
#define __IActiveScriptErrorDebug110_FWD_DEFINED__
typedef interface IActiveScriptErrorDebug110 IActiveScriptErrorDebug110;
#ifdef __cplusplus
interface IActiveScriptErrorDebug110;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationThreadEvents110_FWD_DEFINED__
#define __IDebugApplicationThreadEvents110_FWD_DEFINED__
typedef interface IDebugApplicationThreadEvents110 IDebugApplicationThreadEvents110;
#ifdef __cplusplus
interface IDebugApplicationThreadEvents110;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationThread11032_FWD_DEFINED__
#define __IDebugApplicationThread11032_FWD_DEFINED__
typedef interface IDebugApplicationThread11032 IDebugApplicationThread11032;
#ifdef __cplusplus
interface IDebugApplicationThread11032;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationThread11064_FWD_DEFINED__
#define __IDebugApplicationThread11064_FWD_DEFINED__
typedef interface IDebugApplicationThread11064 IDebugApplicationThread11064;
#ifdef __cplusplus
interface IDebugApplicationThread11064;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugCriticalErrorEvent110_FWD_DEFINED__
#define __IRemoteDebugCriticalErrorEvent110_FWD_DEFINED__
typedef interface IRemoteDebugCriticalErrorEvent110 IRemoteDebugCriticalErrorEvent110;
#ifdef __cplusplus
interface IRemoteDebugCriticalErrorEvent110;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <activdbg.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __IWebAppDiagnosticsSetupEvent_FWD_DEFINED__
#define __IWebAppDiagnosticsSetupEvent_FWD_DEFINED__
typedef interface IWebAppDiagnosticsSetupEvent IWebAppDiagnosticsSetupEvent;
#ifdef __cplusplus
interface IWebAppDiagnosticsSetupEvent;
#endif /* __cplusplus */
#endif

typedef enum tagAPPLICATION_NODE_EVENT_FILTER {
    FILTER_EXCLUDE_NOTHING = 0x0,
    FILTER_EXCLUDE_ANONYMOUS_CODE = 0x1,
    FILTER_EXCLUDE_EVAL_CODE = 0x2
} APPLICATION_NODE_EVENT_FILTER;
typedef enum tagSCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND {
    ETK_FIRST_CHANCE = 0x0,
    ETK_USER_UNHANDLED = 0x1,
    ETK_UNHANDLED = 0x2
} SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND;
enum SCRIPT_DEBUGGER_OPTIONS {
    SDO_NONE = 0x0,
    SDO_ENABLE_FIRST_CHANCE_EXCEPTIONS = 0x1,
    SDO_ENABLE_WEB_WORKER_SUPPORT = 0x2,
    SDO_ENABLE_NONUSER_CODE_SUPPORT = 0x4
};
typedef struct tagTEXT_DOCUMENT_ARRAY {
    DWORD dwCount;
    IDebugDocumentText **Members;
} TEXT_DOCUMENT_ARRAY;
DEFINE_ENUM_FLAG_OPERATORS(SCRIPT_DEBUGGER_OPTIONS)
#ifndef DISABLE_ACTIVDBG_INTERFACE_WRAPPERS
#ifdef _WIN64
#define IDebugApplication110 IDebugApplication11064
#define IID_IDebugApplication110 IID_IDebugApplication11064
#define IDebugApplicationThread110 IDebugApplicationThread11064
#define IID_IDebugApplicationThread110 IID_IDebugApplicationThread11064
#else
#define IDebugApplication110 IDebugApplication11032
#define IID_IDebugApplication110 IID_IDebugApplication11032
#define IDebugApplicationThread110 IDebugApplicationThread11032
#define IID_IDebugApplicationThread110 IID_IDebugApplicationThread11032
#endif
#endif
/*****************************************************************************
 * IDebugApplicationNode100 interface
 */
#ifndef __IDebugApplicationNode100_INTERFACE_DEFINED__
#define __IDebugApplicationNode100_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplicationNode100, 0x90a7734e, 0x841b, 0x4f77, 0x93,0x84, 0xa2,0x89,0x1e,0x76,0xe7,0xe2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("90a7734e-841b-4f77-9384-a2891e76e7e2")
IDebugApplicationNode100 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetFilterForEventSink(
        DWORD dwCookie,
        APPLICATION_NODE_EVENT_FILTER filter) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExcludedDocuments(
        APPLICATION_NODE_EVENT_FILTER filter,
        TEXT_DOCUMENT_ARRAY *pDocuments) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryIsChildNode(
        IDebugDocument *pSearchKey) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplicationNode100, 0x90a7734e, 0x841b, 0x4f77, 0x93,0x84, 0xa2,0x89,0x1e,0x76,0xe7,0xe2)
#endif
#else
typedef struct IDebugApplicationNode100Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugApplicationNode100 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFilterForEventSink)(
        IDebugApplicationNode100 *This,
        DWORD dwCookie,
        APPLICATION_NODE_EVENT_FILTER filter);

    HRESULT (STDMETHODCALLTYPE *GetExcludedDocuments)(
        IDebugApplicationNode100 *This,
        APPLICATION_NODE_EVENT_FILTER filter,
        TEXT_DOCUMENT_ARRAY *pDocuments);

    HRESULT (STDMETHODCALLTYPE *QueryIsChildNode)(
        IDebugApplicationNode100 *This,
        IDebugDocument *pSearchKey);

    END_INTERFACE
} IDebugApplicationNode100Vtbl;

interface IDebugApplicationNode100 {
    CONST_VTBL IDebugApplicationNode100Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplicationNode100_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplicationNode100_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplicationNode100_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugApplicationNode100 methods ***/
#define IDebugApplicationNode100_SetFilterForEventSink(This,dwCookie,filter) (This)->lpVtbl->SetFilterForEventSink(This,dwCookie,filter)
#define IDebugApplicationNode100_GetExcludedDocuments(This,filter,pDocuments) (This)->lpVtbl->GetExcludedDocuments(This,filter,pDocuments)
#define IDebugApplicationNode100_QueryIsChildNode(This,pSearchKey) (This)->lpVtbl->QueryIsChildNode(This,pSearchKey)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplicationNode100_QueryInterface(IDebugApplicationNode100* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplicationNode100_AddRef(IDebugApplicationNode100* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplicationNode100_Release(IDebugApplicationNode100* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugApplicationNode100 methods ***/
static FORCEINLINE HRESULT IDebugApplicationNode100_SetFilterForEventSink(IDebugApplicationNode100* This,DWORD dwCookie,APPLICATION_NODE_EVENT_FILTER filter) {
    return This->lpVtbl->SetFilterForEventSink(This,dwCookie,filter);
}
static FORCEINLINE HRESULT IDebugApplicationNode100_GetExcludedDocuments(IDebugApplicationNode100* This,APPLICATION_NODE_EVENT_FILTER filter,TEXT_DOCUMENT_ARRAY *pDocuments) {
    return This->lpVtbl->GetExcludedDocuments(This,filter,pDocuments);
}
static FORCEINLINE HRESULT IDebugApplicationNode100_QueryIsChildNode(IDebugApplicationNode100* This,IDebugDocument *pSearchKey) {
    return This->lpVtbl->QueryIsChildNode(This,pSearchKey);
}
#endif
#endif

#endif


#endif  /* __IDebugApplicationNode100_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWebAppDiagnosticsSetup interface
 */
#ifndef __IWebAppDiagnosticsSetup_INTERFACE_DEFINED__
#define __IWebAppDiagnosticsSetup_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebAppDiagnosticsSetup, 0x379bfbe1, 0xc6c9, 0x432a, 0x93,0xe1, 0x6d,0x17,0x65,0x6c,0x53,0x8c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("379bfbe1-c6c9-432a-93e1-6d17656c538c")
IWebAppDiagnosticsSetup : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE DiagnosticsSupported(
        VARIANT_BOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateObjectWithSiteAtWebApp(
        REFCLSID rclsid,
        DWORD dwClsContext,
        REFIID riid,
        DWORD_PTR hPassToObject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebAppDiagnosticsSetup, 0x379bfbe1, 0xc6c9, 0x432a, 0x93,0xe1, 0x6d,0x17,0x65,0x6c,0x53,0x8c)
#endif
#else
typedef struct IWebAppDiagnosticsSetupVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWebAppDiagnosticsSetup methods ***/
    HRESULT (STDMETHODCALLTYPE *DiagnosticsSupported)(
        IWebAppDiagnosticsSetup *This,
        VARIANT_BOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *CreateObjectWithSiteAtWebApp)(
        IWebAppDiagnosticsSetup *This,
        REFCLSID rclsid,
        DWORD dwClsContext,
        REFIID riid,
        DWORD_PTR hPassToObject);

    END_INTERFACE
} IWebAppDiagnosticsSetupVtbl;

interface IWebAppDiagnosticsSetup {
    CONST_VTBL IWebAppDiagnosticsSetupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebAppDiagnosticsSetup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebAppDiagnosticsSetup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebAppDiagnosticsSetup_Release(This) (This)->lpVtbl->Release(This)
/*** IWebAppDiagnosticsSetup methods ***/
#define IWebAppDiagnosticsSetup_DiagnosticsSupported(This,pRetVal) (This)->lpVtbl->DiagnosticsSupported(This,pRetVal)
#define IWebAppDiagnosticsSetup_CreateObjectWithSiteAtWebApp(This,rclsid,dwClsContext,riid,hPassToObject) (This)->lpVtbl->CreateObjectWithSiteAtWebApp(This,rclsid,dwClsContext,riid,hPassToObject)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWebAppDiagnosticsSetup_QueryInterface(IWebAppDiagnosticsSetup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWebAppDiagnosticsSetup_AddRef(IWebAppDiagnosticsSetup* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWebAppDiagnosticsSetup_Release(IWebAppDiagnosticsSetup* This) {
    return This->lpVtbl->Release(This);
}
/*** IWebAppDiagnosticsSetup methods ***/
static FORCEINLINE HRESULT IWebAppDiagnosticsSetup_DiagnosticsSupported(IWebAppDiagnosticsSetup* This,VARIANT_BOOL *pRetVal) {
    return This->lpVtbl->DiagnosticsSupported(This,pRetVal);
}
static FORCEINLINE HRESULT IWebAppDiagnosticsSetup_CreateObjectWithSiteAtWebApp(IWebAppDiagnosticsSetup* This,REFCLSID rclsid,DWORD dwClsContext,REFIID riid,DWORD_PTR hPassToObject) {
    return This->lpVtbl->CreateObjectWithSiteAtWebApp(This,rclsid,dwClsContext,riid,hPassToObject);
}
#endif
#endif

#endif


#endif  /* __IWebAppDiagnosticsSetup_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRemoteDebugApplication110 interface
 */
#ifndef __IRemoteDebugApplication110_INTERFACE_DEFINED__
#define __IRemoteDebugApplication110_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRemoteDebugApplication110, 0xd5fe005b, 0x2836, 0x485e, 0xb1,0xf9, 0x89,0xd9,0x1a,0xa2,0x4f,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d5fe005b-2836-485e-b1f9-89d91aa24fd4")
IRemoteDebugApplication110 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetDebuggerOptions(
        enum SCRIPT_DEBUGGER_OPTIONS mask,
        enum SCRIPT_DEBUGGER_OPTIONS value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentDebuggerOptions(
        enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMainThread(
        IRemoteDebugApplicationThread **ppThread) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRemoteDebugApplication110, 0xd5fe005b, 0x2836, 0x485e, 0xb1,0xf9, 0x89,0xd9,0x1a,0xa2,0x4f,0xd4)
#endif
#else
typedef struct IRemoteDebugApplication110Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplication110 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDebuggerOptions)(
        IRemoteDebugApplication110 *This,
        enum SCRIPT_DEBUGGER_OPTIONS mask,
        enum SCRIPT_DEBUGGER_OPTIONS value);

    HRESULT (STDMETHODCALLTYPE *GetCurrentDebuggerOptions)(
        IRemoteDebugApplication110 *This,
        enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions);

    HRESULT (STDMETHODCALLTYPE *GetMainThread)(
        IRemoteDebugApplication110 *This,
        IRemoteDebugApplicationThread **ppThread);

    END_INTERFACE
} IRemoteDebugApplication110Vtbl;

interface IRemoteDebugApplication110 {
    CONST_VTBL IRemoteDebugApplication110Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRemoteDebugApplication110_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRemoteDebugApplication110_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRemoteDebugApplication110_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplication110 methods ***/
#define IRemoteDebugApplication110_SetDebuggerOptions(This,mask,value) (This)->lpVtbl->SetDebuggerOptions(This,mask,value)
#define IRemoteDebugApplication110_GetCurrentDebuggerOptions(This,pCurrentOptions) (This)->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions)
#define IRemoteDebugApplication110_GetMainThread(This,ppThread) (This)->lpVtbl->GetMainThread(This,ppThread)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRemoteDebugApplication110_QueryInterface(IRemoteDebugApplication110* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRemoteDebugApplication110_AddRef(IRemoteDebugApplication110* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRemoteDebugApplication110_Release(IRemoteDebugApplication110* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplication110 methods ***/
static FORCEINLINE HRESULT IRemoteDebugApplication110_SetDebuggerOptions(IRemoteDebugApplication110* This,enum SCRIPT_DEBUGGER_OPTIONS mask,enum SCRIPT_DEBUGGER_OPTIONS value) {
    return This->lpVtbl->SetDebuggerOptions(This,mask,value);
}
static FORCEINLINE HRESULT IRemoteDebugApplication110_GetCurrentDebuggerOptions(IRemoteDebugApplication110* This,enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions) {
    return This->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions);
}
static FORCEINLINE HRESULT IRemoteDebugApplication110_GetMainThread(IRemoteDebugApplication110* This,IRemoteDebugApplicationThread **ppThread) {
    return This->lpVtbl->GetMainThread(This,ppThread);
}
#endif
#endif

#endif


#endif  /* __IRemoteDebugApplication110_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplication11032 interface
 */
#ifndef __IDebugApplication11032_INTERFACE_DEFINED__
#define __IDebugApplication11032_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplication11032, 0xbdb3b5de, 0x89f2, 0x4e11, 0x84,0xa5, 0x97,0x44,0x5f,0x94,0x1c,0x7d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bdb3b5de-89f2-4e11-84a5-97445f941c7d")
IDebugApplication11032 : public IRemoteDebugApplication110
{
    virtual HRESULT STDMETHODCALLTYPE SynchronousCallInMainThread(
        IDebugThreadCall32 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3) = 0;

    virtual HRESULT STDMETHODCALLTYPE AsynchronousCallInMainThread(
        IDebugThreadCall32 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3) = 0;

    virtual HRESULT STDMETHODCALLTYPE CallableWaitForHandles(
        DWORD handleCount,
        const HANDLE *pHandles,
        DWORD *pIndex) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplication11032, 0xbdb3b5de, 0x89f2, 0x4e11, 0x84,0xa5, 0x97,0x44,0x5f,0x94,0x1c,0x7d)
#endif
#else
typedef struct IDebugApplication11032Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplication110 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDebuggerOptions)(
        IDebugApplication11032 *This,
        enum SCRIPT_DEBUGGER_OPTIONS mask,
        enum SCRIPT_DEBUGGER_OPTIONS value);

    HRESULT (STDMETHODCALLTYPE *GetCurrentDebuggerOptions)(
        IDebugApplication11032 *This,
        enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions);

    HRESULT (STDMETHODCALLTYPE *GetMainThread)(
        IDebugApplication11032 *This,
        IRemoteDebugApplicationThread **ppThread);

    /*** IDebugApplication11032 methods ***/
    HRESULT (STDMETHODCALLTYPE *SynchronousCallInMainThread)(
        IDebugApplication11032 *This,
        IDebugThreadCall32 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3);

    HRESULT (STDMETHODCALLTYPE *AsynchronousCallInMainThread)(
        IDebugApplication11032 *This,
        IDebugThreadCall32 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3);

    HRESULT (STDMETHODCALLTYPE *CallableWaitForHandles)(
        IDebugApplication11032 *This,
        DWORD handleCount,
        const HANDLE *pHandles,
        DWORD *pIndex);

    END_INTERFACE
} IDebugApplication11032Vtbl;

interface IDebugApplication11032 {
    CONST_VTBL IDebugApplication11032Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplication11032_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplication11032_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplication11032_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplication110 methods ***/
#define IDebugApplication11032_SetDebuggerOptions(This,mask,value) (This)->lpVtbl->SetDebuggerOptions(This,mask,value)
#define IDebugApplication11032_GetCurrentDebuggerOptions(This,pCurrentOptions) (This)->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions)
#define IDebugApplication11032_GetMainThread(This,ppThread) (This)->lpVtbl->GetMainThread(This,ppThread)
/*** IDebugApplication11032 methods ***/
#define IDebugApplication11032_SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3)
#define IDebugApplication11032_AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3)
#define IDebugApplication11032_CallableWaitForHandles(This,handleCount,pHandles,pIndex) (This)->lpVtbl->CallableWaitForHandles(This,handleCount,pHandles,pIndex)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplication11032_QueryInterface(IDebugApplication11032* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplication11032_AddRef(IDebugApplication11032* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplication11032_Release(IDebugApplication11032* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplication110 methods ***/
static FORCEINLINE HRESULT IDebugApplication11032_SetDebuggerOptions(IDebugApplication11032* This,enum SCRIPT_DEBUGGER_OPTIONS mask,enum SCRIPT_DEBUGGER_OPTIONS value) {
    return This->lpVtbl->SetDebuggerOptions(This,mask,value);
}
static FORCEINLINE HRESULT IDebugApplication11032_GetCurrentDebuggerOptions(IDebugApplication11032* This,enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions) {
    return This->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions);
}
static FORCEINLINE HRESULT IDebugApplication11032_GetMainThread(IDebugApplication11032* This,IRemoteDebugApplicationThread **ppThread) {
    return This->lpVtbl->GetMainThread(This,ppThread);
}
/*** IDebugApplication11032 methods ***/
static FORCEINLINE HRESULT IDebugApplication11032_SynchronousCallInMainThread(IDebugApplication11032* This,IDebugThreadCall32 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
    return This->lpVtbl->SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
static FORCEINLINE HRESULT IDebugApplication11032_AsynchronousCallInMainThread(IDebugApplication11032* This,IDebugThreadCall32 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
    return This->lpVtbl->AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
static FORCEINLINE HRESULT IDebugApplication11032_CallableWaitForHandles(IDebugApplication11032* This,DWORD handleCount,const HANDLE *pHandles,DWORD *pIndex) {
    return This->lpVtbl->CallableWaitForHandles(This,handleCount,pHandles,pIndex);
}
#endif
#endif

#endif


#endif  /* __IDebugApplication11032_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplication11064 interface
 */
#ifndef __IDebugApplication11064_INTERFACE_DEFINED__
#define __IDebugApplication11064_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplication11064, 0x2039d958, 0x4eeb, 0x496a, 0x87,0xbb, 0x2e,0x52,0x01,0xea,0xde,0xef);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2039d958-4eeb-496a-87bb-2e5201eadeef")
IDebugApplication11064 : public IRemoteDebugApplication110
{
    virtual HRESULT STDMETHODCALLTYPE SynchronousCallInMainThread(
        IDebugThreadCall64 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3) = 0;

    virtual HRESULT STDMETHODCALLTYPE AsynchronousCallInMainThread(
        IDebugThreadCall64 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3) = 0;

    virtual HRESULT STDMETHODCALLTYPE CallableWaitForHandles(
        DWORD handleCount,
        const HANDLE *pHandles,
        DWORD *pIndex) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplication11064, 0x2039d958, 0x4eeb, 0x496a, 0x87,0xbb, 0x2e,0x52,0x01,0xea,0xde,0xef)
#endif
#else
typedef struct IDebugApplication11064Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplication110 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDebuggerOptions)(
        IDebugApplication11064 *This,
        enum SCRIPT_DEBUGGER_OPTIONS mask,
        enum SCRIPT_DEBUGGER_OPTIONS value);

    HRESULT (STDMETHODCALLTYPE *GetCurrentDebuggerOptions)(
        IDebugApplication11064 *This,
        enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions);

    HRESULT (STDMETHODCALLTYPE *GetMainThread)(
        IDebugApplication11064 *This,
        IRemoteDebugApplicationThread **ppThread);

    /*** IDebugApplication11064 methods ***/
    HRESULT (STDMETHODCALLTYPE *SynchronousCallInMainThread)(
        IDebugApplication11064 *This,
        IDebugThreadCall64 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3);

    HRESULT (STDMETHODCALLTYPE *AsynchronousCallInMainThread)(
        IDebugApplication11064 *This,
        IDebugThreadCall64 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3);

    HRESULT (STDMETHODCALLTYPE *CallableWaitForHandles)(
        IDebugApplication11064 *This,
        DWORD handleCount,
        const HANDLE *pHandles,
        DWORD *pIndex);

    END_INTERFACE
} IDebugApplication11064Vtbl;

interface IDebugApplication11064 {
    CONST_VTBL IDebugApplication11064Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplication11064_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplication11064_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplication11064_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplication110 methods ***/
#define IDebugApplication11064_SetDebuggerOptions(This,mask,value) (This)->lpVtbl->SetDebuggerOptions(This,mask,value)
#define IDebugApplication11064_GetCurrentDebuggerOptions(This,pCurrentOptions) (This)->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions)
#define IDebugApplication11064_GetMainThread(This,ppThread) (This)->lpVtbl->GetMainThread(This,ppThread)
/*** IDebugApplication11064 methods ***/
#define IDebugApplication11064_SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3)
#define IDebugApplication11064_AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3)
#define IDebugApplication11064_CallableWaitForHandles(This,handleCount,pHandles,pIndex) (This)->lpVtbl->CallableWaitForHandles(This,handleCount,pHandles,pIndex)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplication11064_QueryInterface(IDebugApplication11064* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplication11064_AddRef(IDebugApplication11064* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplication11064_Release(IDebugApplication11064* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplication110 methods ***/
static FORCEINLINE HRESULT IDebugApplication11064_SetDebuggerOptions(IDebugApplication11064* This,enum SCRIPT_DEBUGGER_OPTIONS mask,enum SCRIPT_DEBUGGER_OPTIONS value) {
    return This->lpVtbl->SetDebuggerOptions(This,mask,value);
}
static FORCEINLINE HRESULT IDebugApplication11064_GetCurrentDebuggerOptions(IDebugApplication11064* This,enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions) {
    return This->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions);
}
static FORCEINLINE HRESULT IDebugApplication11064_GetMainThread(IDebugApplication11064* This,IRemoteDebugApplicationThread **ppThread) {
    return This->lpVtbl->GetMainThread(This,ppThread);
}
/*** IDebugApplication11064 methods ***/
static FORCEINLINE HRESULT IDebugApplication11064_SynchronousCallInMainThread(IDebugApplication11064* This,IDebugThreadCall64 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
    return This->lpVtbl->SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
static FORCEINLINE HRESULT IDebugApplication11064_AsynchronousCallInMainThread(IDebugApplication11064* This,IDebugThreadCall64 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
    return This->lpVtbl->AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
static FORCEINLINE HRESULT IDebugApplication11064_CallableWaitForHandles(IDebugApplication11064* This,DWORD handleCount,const HANDLE *pHandles,DWORD *pIndex) {
    return This->lpVtbl->CallableWaitForHandles(This,handleCount,pHandles,pIndex);
}
#endif
#endif

#endif


#endif  /* __IDebugApplication11064_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWebAppDiagnosticsObjectInitialization interface
 */
#ifndef __IWebAppDiagnosticsObjectInitialization_INTERFACE_DEFINED__
#define __IWebAppDiagnosticsObjectInitialization_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebAppDiagnosticsObjectInitialization, 0x16ff3a42, 0xa5f5, 0x432b, 0xb6,0x25, 0x8e,0x8e,0x16,0xf5,0x7e,0x15);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("16ff3a42-a5f5-432b-b625-8e8e16f57e15")
IWebAppDiagnosticsObjectInitialization : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        HANDLE_PTR hPassedHandle,
        IUnknown *pDebugApplication) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebAppDiagnosticsObjectInitialization, 0x16ff3a42, 0xa5f5, 0x432b, 0xb6,0x25, 0x8e,0x8e,0x16,0xf5,0x7e,0x15)
#endif
#else
typedef struct IWebAppDiagnosticsObjectInitializationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWebAppDiagnosticsObjectInitialization methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWebAppDiagnosticsObjectInitialization *This,
        HANDLE_PTR hPassedHandle,
        IUnknown *pDebugApplication);

    END_INTERFACE
} IWebAppDiagnosticsObjectInitializationVtbl;

interface IWebAppDiagnosticsObjectInitialization {
    CONST_VTBL IWebAppDiagnosticsObjectInitializationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebAppDiagnosticsObjectInitialization_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebAppDiagnosticsObjectInitialization_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebAppDiagnosticsObjectInitialization_Release(This) (This)->lpVtbl->Release(This)
/*** IWebAppDiagnosticsObjectInitialization methods ***/
#define IWebAppDiagnosticsObjectInitialization_Initialize(This,hPassedHandle,pDebugApplication) (This)->lpVtbl->Initialize(This,hPassedHandle,pDebugApplication)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWebAppDiagnosticsObjectInitialization_QueryInterface(IWebAppDiagnosticsObjectInitialization* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWebAppDiagnosticsObjectInitialization_AddRef(IWebAppDiagnosticsObjectInitialization* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWebAppDiagnosticsObjectInitialization_Release(IWebAppDiagnosticsObjectInitialization* This) {
    return This->lpVtbl->Release(This);
}
/*** IWebAppDiagnosticsObjectInitialization methods ***/
static FORCEINLINE HRESULT IWebAppDiagnosticsObjectInitialization_Initialize(IWebAppDiagnosticsObjectInitialization* This,HANDLE_PTR hPassedHandle,IUnknown *pDebugApplication) {
    return This->lpVtbl->Initialize(This,hPassedHandle,pDebugApplication);
}
#endif
#endif

#endif


#endif  /* __IWebAppDiagnosticsObjectInitialization_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IActiveScriptWinRTErrorDebug interface
 */
#ifndef __IActiveScriptWinRTErrorDebug_INTERFACE_DEFINED__
#define __IActiveScriptWinRTErrorDebug_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptWinRTErrorDebug, 0x73a3f82a, 0x0fe9, 0x4b33, 0xba,0x3b, 0xfe,0x09,0x5f,0x69,0x7e,0x0a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("73a3f82a-0fe9-4b33-ba3b-fe095f697e0a")
IActiveScriptWinRTErrorDebug : public IActiveScriptError
{
    virtual HRESULT STDMETHODCALLTYPE GetRestrictedErrorString(
        BSTR *errorString) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestrictedErrorReference(
        BSTR *referenceString) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCapabilitySid(
        BSTR *capabilitySid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptWinRTErrorDebug, 0x73a3f82a, 0x0fe9, 0x4b33, 0xba,0x3b, 0xfe,0x09,0x5f,0x69,0x7e,0x0a)
#endif
#else
typedef struct IActiveScriptWinRTErrorDebugVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IActiveScriptWinRTErrorDebug methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRestrictedErrorString)(
        IActiveScriptWinRTErrorDebug *This,
        BSTR *errorString);

    HRESULT (STDMETHODCALLTYPE *GetRestrictedErrorReference)(
        IActiveScriptWinRTErrorDebug *This,
        BSTR *referenceString);

    HRESULT (STDMETHODCALLTYPE *GetCapabilitySid)(
        IActiveScriptWinRTErrorDebug *This,
        BSTR *capabilitySid);

    END_INTERFACE
} IActiveScriptWinRTErrorDebugVtbl;

interface IActiveScriptWinRTErrorDebug {
    CONST_VTBL IActiveScriptWinRTErrorDebugVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptWinRTErrorDebug_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptWinRTErrorDebug_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptWinRTErrorDebug_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptError methods ***/
#define IActiveScriptWinRTErrorDebug_GetExceptionInfo(This,pexcepinfo) (This)->lpVtbl->GetExceptionInfo(This,pexcepinfo)
#define IActiveScriptWinRTErrorDebug_GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition) (This)->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition)
#define IActiveScriptWinRTErrorDebug_GetSourceLineText(This,pbstrSourceLine) (This)->lpVtbl->GetSourceLineText(This,pbstrSourceLine)
/*** IActiveScriptWinRTErrorDebug methods ***/
#define IActiveScriptWinRTErrorDebug_GetRestrictedErrorString(This,errorString) (This)->lpVtbl->GetRestrictedErrorString(This,errorString)
#define IActiveScriptWinRTErrorDebug_GetRestrictedErrorReference(This,referenceString) (This)->lpVtbl->GetRestrictedErrorReference(This,referenceString)
#define IActiveScriptWinRTErrorDebug_GetCapabilitySid(This,capabilitySid) (This)->lpVtbl->GetCapabilitySid(This,capabilitySid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_QueryInterface(IActiveScriptWinRTErrorDebug* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptWinRTErrorDebug_AddRef(IActiveScriptWinRTErrorDebug* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptWinRTErrorDebug_Release(IActiveScriptWinRTErrorDebug* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptError methods ***/
static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetExceptionInfo(IActiveScriptWinRTErrorDebug* This,EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->GetExceptionInfo(This,pexcepinfo);
}
static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetSourcePosition(IActiveScriptWinRTErrorDebug* This,DWORD *pdwSourceContext,ULONG *pulLineNumber,LONG *plCharacterPosition) {
    return This->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition);
}
static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetSourceLineText(IActiveScriptWinRTErrorDebug* This,BSTR *pbstrSourceLine) {
    return This->lpVtbl->GetSourceLineText(This,pbstrSourceLine);
}
/*** IActiveScriptWinRTErrorDebug methods ***/
static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetRestrictedErrorString(IActiveScriptWinRTErrorDebug* This,BSTR *errorString) {
    return This->lpVtbl->GetRestrictedErrorString(This,errorString);
}
static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetRestrictedErrorReference(IActiveScriptWinRTErrorDebug* This,BSTR *referenceString) {
    return This->lpVtbl->GetRestrictedErrorReference(This,referenceString);
}
static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetCapabilitySid(IActiveScriptWinRTErrorDebug* This,BSTR *capabilitySid) {
    return This->lpVtbl->GetCapabilitySid(This,capabilitySid);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptWinRTErrorDebug_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptErrorDebug110 interface
 */
#ifndef __IActiveScriptErrorDebug110_INTERFACE_DEFINED__
#define __IActiveScriptErrorDebug110_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptErrorDebug110, 0x516e42b6, 0x89a8, 0x4530, 0x93,0x7b, 0x5f,0x07,0x08,0x43,0x14,0x42);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("516e42b6-89a8-4530-937b-5f0708431442")
IActiveScriptErrorDebug110 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetExceptionThrownKind(
        SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND *pExceptionKind) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptErrorDebug110, 0x516e42b6, 0x89a8, 0x4530, 0x93,0x7b, 0x5f,0x07,0x08,0x43,0x14,0x42)
#endif
#else
typedef struct IActiveScriptErrorDebug110Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptErrorDebug110 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetExceptionThrownKind)(
        IActiveScriptErrorDebug110 *This,
        SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND *pExceptionKind);

    END_INTERFACE
} IActiveScriptErrorDebug110Vtbl;

interface IActiveScriptErrorDebug110 {
    CONST_VTBL IActiveScriptErrorDebug110Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptErrorDebug110_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptErrorDebug110_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptErrorDebug110_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptErrorDebug110 methods ***/
#define IActiveScriptErrorDebug110_GetExceptionThrownKind(This,pExceptionKind) (This)->lpVtbl->GetExceptionThrownKind(This,pExceptionKind)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptErrorDebug110_QueryInterface(IActiveScriptErrorDebug110* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptErrorDebug110_AddRef(IActiveScriptErrorDebug110* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptErrorDebug110_Release(IActiveScriptErrorDebug110* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptErrorDebug110 methods ***/
static FORCEINLINE HRESULT IActiveScriptErrorDebug110_GetExceptionThrownKind(IActiveScriptErrorDebug110* This,SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND *pExceptionKind) {
    return This->lpVtbl->GetExceptionThrownKind(This,pExceptionKind);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptErrorDebug110_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplicationThreadEvents110 interface
 */
#ifndef __IDebugApplicationThreadEvents110_INTERFACE_DEFINED__
#define __IDebugApplicationThreadEvents110_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplicationThreadEvents110, 0x84e5e468, 0xd5da, 0x48a8, 0x83,0xf4, 0x40,0x36,0x64,0x29,0x00,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("84e5e468-d5da-48a8-83f4-40366429007b")
IDebugApplicationThreadEvents110 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnSuspendForBreakPoint(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnResumeFromBreakPoint(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnThreadRequestComplete(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnBeginThreadRequest(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplicationThreadEvents110, 0x84e5e468, 0xd5da, 0x48a8, 0x83,0xf4, 0x40,0x36,0x64,0x29,0x00,0x7b)
#endif
#else
typedef struct IDebugApplicationThreadEvents110Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugApplicationThreadEvents110 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnSuspendForBreakPoint)(
        IDebugApplicationThreadEvents110 *This);

    HRESULT (STDMETHODCALLTYPE *OnResumeFromBreakPoint)(
        IDebugApplicationThreadEvents110 *This);

    HRESULT (STDMETHODCALLTYPE *OnThreadRequestComplete)(
        IDebugApplicationThreadEvents110 *This);

    HRESULT (STDMETHODCALLTYPE *OnBeginThreadRequest)(
        IDebugApplicationThreadEvents110 *This);

    END_INTERFACE
} IDebugApplicationThreadEvents110Vtbl;

interface IDebugApplicationThreadEvents110 {
    CONST_VTBL IDebugApplicationThreadEvents110Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplicationThreadEvents110_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplicationThreadEvents110_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplicationThreadEvents110_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugApplicationThreadEvents110 methods ***/
#define IDebugApplicationThreadEvents110_OnSuspendForBreakPoint(This) (This)->lpVtbl->OnSuspendForBreakPoint(This)
#define IDebugApplicationThreadEvents110_OnResumeFromBreakPoint(This) (This)->lpVtbl->OnResumeFromBreakPoint(This)
#define IDebugApplicationThreadEvents110_OnThreadRequestComplete(This) (This)->lpVtbl->OnThreadRequestComplete(This)
#define IDebugApplicationThreadEvents110_OnBeginThreadRequest(This) (This)->lpVtbl->OnBeginThreadRequest(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_QueryInterface(IDebugApplicationThreadEvents110* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplicationThreadEvents110_AddRef(IDebugApplicationThreadEvents110* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplicationThreadEvents110_Release(IDebugApplicationThreadEvents110* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugApplicationThreadEvents110 methods ***/
static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_OnSuspendForBreakPoint(IDebugApplicationThreadEvents110* This) {
    return This->lpVtbl->OnSuspendForBreakPoint(This);
}
static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_OnResumeFromBreakPoint(IDebugApplicationThreadEvents110* This) {
    return This->lpVtbl->OnResumeFromBreakPoint(This);
}
static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_OnThreadRequestComplete(IDebugApplicationThreadEvents110* This) {
    return This->lpVtbl->OnThreadRequestComplete(This);
}
static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_OnBeginThreadRequest(IDebugApplicationThreadEvents110* This) {
    return This->lpVtbl->OnBeginThreadRequest(This);
}
#endif
#endif

#endif


#endif  /* __IDebugApplicationThreadEvents110_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplicationThread11032 interface
 */
#ifndef __IDebugApplicationThread11032_INTERFACE_DEFINED__
#define __IDebugApplicationThread11032_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplicationThread11032, 0x2194ac5c, 0x6561, 0x404a, 0xa2,0xe9, 0xf5,0x7d,0x72,0xde,0x37,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2194ac5c-6561-404a-a2e9-f57d72de3702")
IDebugApplicationThread11032 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetActiveThreadRequestCount(
        UINT *puiThreadRequests) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSuspendedForBreakPoint(
        WINBOOL *pfIsSuspended) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsThreadCallable(
        WINBOOL *pfIsCallable) = 0;

    virtual HRESULT STDMETHODCALLTYPE AsynchronousCallIntoThread(
        IDebugThreadCall32 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplicationThread11032, 0x2194ac5c, 0x6561, 0x404a, 0xa2,0xe9, 0xf5,0x7d,0x72,0xde,0x37,0x02)
#endif
#else
typedef struct IDebugApplicationThread11032Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugApplicationThread11032 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetActiveThreadRequestCount)(
        IDebugApplicationThread11032 *This,
        UINT *puiThreadRequests);

    HRESULT (STDMETHODCALLTYPE *IsSuspendedForBreakPoint)(
        IDebugApplicationThread11032 *This,
        WINBOOL *pfIsSuspended);

    HRESULT (STDMETHODCALLTYPE *IsThreadCallable)(
        IDebugApplicationThread11032 *This,
        WINBOOL *pfIsCallable);

    HRESULT (STDMETHODCALLTYPE *AsynchronousCallIntoThread)(
        IDebugApplicationThread11032 *This,
        IDebugThreadCall32 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3);

    END_INTERFACE
} IDebugApplicationThread11032Vtbl;

interface IDebugApplicationThread11032 {
    CONST_VTBL IDebugApplicationThread11032Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplicationThread11032_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplicationThread11032_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplicationThread11032_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugApplicationThread11032 methods ***/
#define IDebugApplicationThread11032_GetActiveThreadRequestCount(This,puiThreadRequests) (This)->lpVtbl->GetActiveThreadRequestCount(This,puiThreadRequests)
#define IDebugApplicationThread11032_IsSuspendedForBreakPoint(This,pfIsSuspended) (This)->lpVtbl->IsSuspendedForBreakPoint(This,pfIsSuspended)
#define IDebugApplicationThread11032_IsThreadCallable(This,pfIsCallable) (This)->lpVtbl->IsThreadCallable(This,pfIsCallable)
#define IDebugApplicationThread11032_AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread11032_QueryInterface(IDebugApplicationThread11032* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplicationThread11032_AddRef(IDebugApplicationThread11032* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplicationThread11032_Release(IDebugApplicationThread11032* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugApplicationThread11032 methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread11032_GetActiveThreadRequestCount(IDebugApplicationThread11032* This,UINT *puiThreadRequests) {
    return This->lpVtbl->GetActiveThreadRequestCount(This,puiThreadRequests);
}
static FORCEINLINE HRESULT IDebugApplicationThread11032_IsSuspendedForBreakPoint(IDebugApplicationThread11032* This,WINBOOL *pfIsSuspended) {
    return This->lpVtbl->IsSuspendedForBreakPoint(This,pfIsSuspended);
}
static FORCEINLINE HRESULT IDebugApplicationThread11032_IsThreadCallable(IDebugApplicationThread11032* This,WINBOOL *pfIsCallable) {
    return This->lpVtbl->IsThreadCallable(This,pfIsCallable);
}
static FORCEINLINE HRESULT IDebugApplicationThread11032_AsynchronousCallIntoThread(IDebugApplicationThread11032* This,IDebugThreadCall32 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
    return This->lpVtbl->AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
#endif
#endif

#endif


#endif  /* __IDebugApplicationThread11032_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplicationThread11064 interface
 */
#ifndef __IDebugApplicationThread11064_INTERFACE_DEFINED__
#define __IDebugApplicationThread11064_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplicationThread11064, 0x420aa4cc, 0xefd8, 0x4dac, 0x98,0x3b, 0x47,0x12,0x78,0x26,0x91,0x7d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("420aa4cc-efd8-4dac-983b-47127826917d")
IDebugApplicationThread11064 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetActiveThreadRequestCount(
        UINT *puiThreadRequests) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSuspendedForBreakPoint(
        WINBOOL *pfIsSuspended) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsThreadCallable(
        WINBOOL *pfIsCallable) = 0;

    virtual HRESULT STDMETHODCALLTYPE AsynchronousCallIntoThread(
        IDebugThreadCall64 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplicationThread11064, 0x420aa4cc, 0xefd8, 0x4dac, 0x98,0x3b, 0x47,0x12,0x78,0x26,0x91,0x7d)
#endif
#else
typedef struct IDebugApplicationThread11064Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugApplicationThread11064 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetActiveThreadRequestCount)(
        IDebugApplicationThread11064 *This,
        UINT *puiThreadRequests);

    HRESULT (STDMETHODCALLTYPE *IsSuspendedForBreakPoint)(
        IDebugApplicationThread11064 *This,
        WINBOOL *pfIsSuspended);

    HRESULT (STDMETHODCALLTYPE *IsThreadCallable)(
        IDebugApplicationThread11064 *This,
        WINBOOL *pfIsCallable);

    HRESULT (STDMETHODCALLTYPE *AsynchronousCallIntoThread)(
        IDebugApplicationThread11064 *This,
        IDebugThreadCall64 *pptc,
        DWORD_PTR dwParam1,
        DWORD_PTR dwParam2,
        DWORD_PTR dwParam3);

    END_INTERFACE
} IDebugApplicationThread11064Vtbl;

interface IDebugApplicationThread11064 {
    CONST_VTBL IDebugApplicationThread11064Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplicationThread11064_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplicationThread11064_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplicationThread11064_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugApplicationThread11064 methods ***/
#define IDebugApplicationThread11064_GetActiveThreadRequestCount(This,puiThreadRequests) (This)->lpVtbl->GetActiveThreadRequestCount(This,puiThreadRequests)
#define IDebugApplicationThread11064_IsSuspendedForBreakPoint(This,pfIsSuspended) (This)->lpVtbl->IsSuspendedForBreakPoint(This,pfIsSuspended)
#define IDebugApplicationThread11064_IsThreadCallable(This,pfIsCallable) (This)->lpVtbl->IsThreadCallable(This,pfIsCallable)
#define IDebugApplicationThread11064_AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread11064_QueryInterface(IDebugApplicationThread11064* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplicationThread11064_AddRef(IDebugApplicationThread11064* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplicationThread11064_Release(IDebugApplicationThread11064* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugApplicationThread11064 methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread11064_GetActiveThreadRequestCount(IDebugApplicationThread11064* This,UINT *puiThreadRequests) {
    return This->lpVtbl->GetActiveThreadRequestCount(This,puiThreadRequests);
}
static FORCEINLINE HRESULT IDebugApplicationThread11064_IsSuspendedForBreakPoint(IDebugApplicationThread11064* This,WINBOOL *pfIsSuspended) {
    return This->lpVtbl->IsSuspendedForBreakPoint(This,pfIsSuspended);
}
static FORCEINLINE HRESULT IDebugApplicationThread11064_IsThreadCallable(IDebugApplicationThread11064* This,WINBOOL *pfIsCallable) {
    return This->lpVtbl->IsThreadCallable(This,pfIsCallable);
}
static FORCEINLINE HRESULT IDebugApplicationThread11064_AsynchronousCallIntoThread(IDebugApplicationThread11064* This,IDebugThreadCall64 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
    return This->lpVtbl->AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
#endif
#endif

#endif


#endif  /* __IDebugApplicationThread11064_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRemoteDebugCriticalErrorEvent110 interface
 */
#ifndef __IRemoteDebugCriticalErrorEvent110_INTERFACE_DEFINED__
#define __IRemoteDebugCriticalErrorEvent110_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRemoteDebugCriticalErrorEvent110, 0x2f69c611, 0x6b14, 0x47e8, 0x92,0x60, 0x4b,0xb7,0xc5,0x2f,0x50,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2f69c611-6b14-47e8-9260-4bb7c52f504b")
IRemoteDebugCriticalErrorEvent110 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetErrorInfo(
        BSTR *pbstrSource,
        int *pMessageId,
        BSTR *pbstrMessage,
        IDebugDocumentContext **ppLocation) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRemoteDebugCriticalErrorEvent110, 0x2f69c611, 0x6b14, 0x47e8, 0x92,0x60, 0x4b,0xb7,0xc5,0x2f,0x50,0x4b)
#endif
#else
typedef struct IRemoteDebugCriticalErrorEvent110Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugCriticalErrorEvent110 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetErrorInfo)(
        IRemoteDebugCriticalErrorEvent110 *This,
        BSTR *pbstrSource,
        int *pMessageId,
        BSTR *pbstrMessage,
        IDebugDocumentContext **ppLocation);

    END_INTERFACE
} IRemoteDebugCriticalErrorEvent110Vtbl;

interface IRemoteDebugCriticalErrorEvent110 {
    CONST_VTBL IRemoteDebugCriticalErrorEvent110Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRemoteDebugCriticalErrorEvent110_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRemoteDebugCriticalErrorEvent110_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRemoteDebugCriticalErrorEvent110_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugCriticalErrorEvent110 methods ***/
#define IRemoteDebugCriticalErrorEvent110_GetErrorInfo(This,pbstrSource,pMessageId,pbstrMessage,ppLocation) (This)->lpVtbl->GetErrorInfo(This,pbstrSource,pMessageId,pbstrMessage,ppLocation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRemoteDebugCriticalErrorEvent110_QueryInterface(IRemoteDebugCriticalErrorEvent110* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRemoteDebugCriticalErrorEvent110_AddRef(IRemoteDebugCriticalErrorEvent110* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRemoteDebugCriticalErrorEvent110_Release(IRemoteDebugCriticalErrorEvent110* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugCriticalErrorEvent110 methods ***/
static FORCEINLINE HRESULT IRemoteDebugCriticalErrorEvent110_GetErrorInfo(IRemoteDebugCriticalErrorEvent110* This,BSTR *pbstrSource,int *pMessageId,BSTR *pbstrMessage,IDebugDocumentContext **ppLocation) {
    return This->lpVtbl->GetErrorInfo(This,pbstrSource,pMessageId,pbstrMessage,ppLocation);
}
#endif
#endif

#endif


#endif  /* __IRemoteDebugCriticalErrorEvent110_INTERFACE_DEFINED__ */

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

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __activdbg100_h__ */
