/*** Autogenerated by WIDL 1.6 from 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;
#endif

#ifndef __IWebAppDiagnosticsSetup_FWD_DEFINED__
#define __IWebAppDiagnosticsSetup_FWD_DEFINED__
typedef interface IWebAppDiagnosticsSetup IWebAppDiagnosticsSetup;
#endif

#ifndef __IRemoteDebugApplication110_FWD_DEFINED__
#define __IRemoteDebugApplication110_FWD_DEFINED__
typedef interface IRemoteDebugApplication110 IRemoteDebugApplication110;
#endif

#ifndef __IDebugApplication11032_FWD_DEFINED__
#define __IDebugApplication11032_FWD_DEFINED__
typedef interface IDebugApplication11032 IDebugApplication11032;
#endif

#ifndef __IDebugApplication11064_FWD_DEFINED__
#define __IDebugApplication11064_FWD_DEFINED__
typedef interface IDebugApplication11064 IDebugApplication11064;
#endif

#ifndef __IWebAppDiagnosticsObjectInitialization_FWD_DEFINED__
#define __IWebAppDiagnosticsObjectInitialization_FWD_DEFINED__
typedef interface IWebAppDiagnosticsObjectInitialization IWebAppDiagnosticsObjectInitialization;
#endif

#ifndef __IActiveScriptWinRTErrorDebug_FWD_DEFINED__
#define __IActiveScriptWinRTErrorDebug_FWD_DEFINED__
typedef interface IActiveScriptWinRTErrorDebug IActiveScriptWinRTErrorDebug;
#endif

#ifndef __IActiveScriptErrorDebug110_FWD_DEFINED__
#define __IActiveScriptErrorDebug110_FWD_DEFINED__
typedef interface IActiveScriptErrorDebug110 IActiveScriptErrorDebug110;
#endif

#ifndef __IDebugApplicationThreadEvents110_FWD_DEFINED__
#define __IDebugApplicationThreadEvents110_FWD_DEFINED__
typedef interface IDebugApplicationThreadEvents110 IDebugApplicationThreadEvents110;
#endif

#ifndef __IDebugApplicationThread11032_FWD_DEFINED__
#define __IDebugApplicationThread11032_FWD_DEFINED__
typedef interface IDebugApplicationThread11032 IDebugApplicationThread11032;
#endif

#ifndef __IDebugApplicationThread11064_FWD_DEFINED__
#define __IDebugApplicationThread11064_FWD_DEFINED__
typedef interface IDebugApplicationThread11064 IDebugApplicationThread11064;
#endif

#ifndef __IRemoteDebugCriticalErrorEvent110_FWD_DEFINED__
#define __IRemoteDebugCriticalErrorEvent110_FWD_DEFINED__
typedef interface IRemoteDebugCriticalErrorEvent110 IRemoteDebugCriticalErrorEvent110;
#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;
#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

HRESULT STDMETHODCALLTYPE IDebugApplicationNode100_SetFilterForEventSink_Proxy(
    IDebugApplicationNode100* This,
    DWORD dwCookie,
    APPLICATION_NODE_EVENT_FILTER filter);
void __RPC_STUB IDebugApplicationNode100_SetFilterForEventSink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationNode100_GetExcludedDocuments_Proxy(
    IDebugApplicationNode100* This,
    APPLICATION_NODE_EVENT_FILTER filter,
    TEXT_DOCUMENT_ARRAY *pDocuments);
void __RPC_STUB IDebugApplicationNode100_GetExcludedDocuments_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationNode100_QueryIsChildNode_Proxy(
    IDebugApplicationNode100* This,
    IDebugDocument *pSearchKey);
void __RPC_STUB IDebugApplicationNode100_QueryIsChildNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWebAppDiagnosticsSetup_DiagnosticsSupported_Proxy(
    IWebAppDiagnosticsSetup* This,
    VARIANT_BOOL *pRetVal);
void __RPC_STUB IWebAppDiagnosticsSetup_DiagnosticsSupported_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebAppDiagnosticsSetup_CreateObjectWithSiteAtWebApp_Proxy(
    IWebAppDiagnosticsSetup* This,
    REFCLSID rclsid,
    DWORD dwClsContext,
    REFIID riid,
    DWORD_PTR hPassToObject);
void __RPC_STUB IWebAppDiagnosticsSetup_CreateObjectWithSiteAtWebApp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IRemoteDebugApplication110_SetDebuggerOptions_Proxy(
    IRemoteDebugApplication110* This,
    enum SCRIPT_DEBUGGER_OPTIONS mask,
    enum SCRIPT_DEBUGGER_OPTIONS value);
void __RPC_STUB IRemoteDebugApplication110_SetDebuggerOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRemoteDebugApplication110_GetCurrentDebuggerOptions_Proxy(
    IRemoteDebugApplication110* This,
    enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions);
void __RPC_STUB IRemoteDebugApplication110_GetCurrentDebuggerOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRemoteDebugApplication110_GetMainThread_Proxy(
    IRemoteDebugApplication110* This,
    IRemoteDebugApplicationThread **ppThread);
void __RPC_STUB IRemoteDebugApplication110_GetMainThread_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IDebugApplication11032_SynchronousCallInMainThread_Proxy(
    IDebugApplication11032* This,
    IDebugThreadCall32 *pptc,
    DWORD_PTR dwParam1,
    DWORD_PTR dwParam2,
    DWORD_PTR dwParam3);
void __RPC_STUB IDebugApplication11032_SynchronousCallInMainThread_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplication11032_AsynchronousCallInMainThread_Proxy(
    IDebugApplication11032* This,
    IDebugThreadCall32 *pptc,
    DWORD_PTR dwParam1,
    DWORD_PTR dwParam2,
    DWORD_PTR dwParam3);
void __RPC_STUB IDebugApplication11032_AsynchronousCallInMainThread_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplication11032_CallableWaitForHandles_Proxy(
    IDebugApplication11032* This,
    DWORD handleCount,
    const HANDLE *pHandles,
    DWORD *pIndex);
void __RPC_STUB IDebugApplication11032_CallableWaitForHandles_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IDebugApplication11064_SynchronousCallInMainThread_Proxy(
    IDebugApplication11064* This,
    IDebugThreadCall64 *pptc,
    DWORD_PTR dwParam1,
    DWORD_PTR dwParam2,
    DWORD_PTR dwParam3);
void __RPC_STUB IDebugApplication11064_SynchronousCallInMainThread_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplication11064_AsynchronousCallInMainThread_Proxy(
    IDebugApplication11064* This,
    IDebugThreadCall64 *pptc,
    DWORD_PTR dwParam1,
    DWORD_PTR dwParam2,
    DWORD_PTR dwParam3);
void __RPC_STUB IDebugApplication11064_AsynchronousCallInMainThread_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplication11064_CallableWaitForHandles_Proxy(
    IDebugApplication11064* This,
    DWORD handleCount,
    const HANDLE *pHandles,
    DWORD *pIndex);
void __RPC_STUB IDebugApplication11064_CallableWaitForHandles_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWebAppDiagnosticsObjectInitialization_Initialize_Proxy(
    IWebAppDiagnosticsObjectInitialization* This,
    HANDLE_PTR hPassedHandle,
    IUnknown *pDebugApplication);
void __RPC_STUB IWebAppDiagnosticsObjectInitialization_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IActiveScriptWinRTErrorDebug_GetRestrictedErrorString_Proxy(
    IActiveScriptWinRTErrorDebug* This,
    BSTR *errorString);
void __RPC_STUB IActiveScriptWinRTErrorDebug_GetRestrictedErrorString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActiveScriptWinRTErrorDebug_GetRestrictedErrorReference_Proxy(
    IActiveScriptWinRTErrorDebug* This,
    BSTR *referenceString);
void __RPC_STUB IActiveScriptWinRTErrorDebug_GetRestrictedErrorReference_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActiveScriptWinRTErrorDebug_GetCapabilitySid_Proxy(
    IActiveScriptWinRTErrorDebug* This,
    BSTR *capabilitySid);
void __RPC_STUB IActiveScriptWinRTErrorDebug_GetCapabilitySid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IActiveScriptErrorDebug110_GetExceptionThrownKind_Proxy(
    IActiveScriptErrorDebug110* This,
    SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND *pExceptionKind);
void __RPC_STUB IActiveScriptErrorDebug110_GetExceptionThrownKind_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IDebugApplicationThreadEvents110_OnSuspendForBreakPoint_Proxy(
    IDebugApplicationThreadEvents110* This);
void __RPC_STUB IDebugApplicationThreadEvents110_OnSuspendForBreakPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationThreadEvents110_OnResumeFromBreakPoint_Proxy(
    IDebugApplicationThreadEvents110* This);
void __RPC_STUB IDebugApplicationThreadEvents110_OnResumeFromBreakPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationThreadEvents110_OnThreadRequestComplete_Proxy(
    IDebugApplicationThreadEvents110* This);
void __RPC_STUB IDebugApplicationThreadEvents110_OnThreadRequestComplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationThreadEvents110_OnBeginThreadRequest_Proxy(
    IDebugApplicationThreadEvents110* This);
void __RPC_STUB IDebugApplicationThreadEvents110_OnBeginThreadRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IDebugApplicationThread11032_GetActiveThreadRequestCount_Proxy(
    IDebugApplicationThread11032* This,
    UINT *puiThreadRequests);
void __RPC_STUB IDebugApplicationThread11032_GetActiveThreadRequestCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationThread11032_IsSuspendedForBreakPoint_Proxy(
    IDebugApplicationThread11032* This,
    WINBOOL *pfIsSuspended);
void __RPC_STUB IDebugApplicationThread11032_IsSuspendedForBreakPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationThread11032_IsThreadCallable_Proxy(
    IDebugApplicationThread11032* This,
    WINBOOL *pfIsCallable);
void __RPC_STUB IDebugApplicationThread11032_IsThreadCallable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationThread11032_AsynchronousCallIntoThread_Proxy(
    IDebugApplicationThread11032* This,
    IDebugThreadCall32 *pptc,
    DWORD_PTR dwParam1,
    DWORD_PTR dwParam2,
    DWORD_PTR dwParam3);
void __RPC_STUB IDebugApplicationThread11032_AsynchronousCallIntoThread_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IDebugApplicationThread11064_GetActiveThreadRequestCount_Proxy(
    IDebugApplicationThread11064* This,
    UINT *puiThreadRequests);
void __RPC_STUB IDebugApplicationThread11064_GetActiveThreadRequestCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationThread11064_IsSuspendedForBreakPoint_Proxy(
    IDebugApplicationThread11064* This,
    WINBOOL *pfIsSuspended);
void __RPC_STUB IDebugApplicationThread11064_IsSuspendedForBreakPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationThread11064_IsThreadCallable_Proxy(
    IDebugApplicationThread11064* This,
    WINBOOL *pfIsCallable);
void __RPC_STUB IDebugApplicationThread11064_IsThreadCallable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugApplicationThread11064_AsynchronousCallIntoThread_Proxy(
    IDebugApplicationThread11064* This,
    IDebugThreadCall64 *pptc,
    DWORD_PTR dwParam1,
    DWORD_PTR dwParam2,
    DWORD_PTR dwParam3);
void __RPC_STUB IDebugApplicationThread11064_AsynchronousCallIntoThread_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IRemoteDebugCriticalErrorEvent110_GetErrorInfo_Proxy(
    IRemoteDebugCriticalErrorEvent110* This,
    BSTR *pbstrSource,
    int *pMessageId,
    BSTR *pbstrMessage,
    IDebugDocumentContext **ppLocation);
void __RPC_STUB IRemoteDebugCriticalErrorEvent110_GetErrorInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

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