/*** Autogenerated by WIDL 3.20 from include/activdbg100.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#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__ */
