/*** Autogenerated by WIDL 3.20 from include/activdbg.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 __activdbg_h__
#define __activdbg_h__

/* Forward declarations */

#ifndef __IActiveScriptDebug32_FWD_DEFINED__
#define __IActiveScriptDebug32_FWD_DEFINED__
typedef interface IActiveScriptDebug32 IActiveScriptDebug32;
#ifdef __cplusplus
interface IActiveScriptDebug32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptDebug64_FWD_DEFINED__
#define __IActiveScriptDebug64_FWD_DEFINED__
typedef interface IActiveScriptDebug64 IActiveScriptDebug64;
#ifdef __cplusplus
interface IActiveScriptDebug64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteDebug32_FWD_DEFINED__
#define __IActiveScriptSiteDebug32_FWD_DEFINED__
typedef interface IActiveScriptSiteDebug32 IActiveScriptSiteDebug32;
#ifdef __cplusplus
interface IActiveScriptSiteDebug32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteDebug64_FWD_DEFINED__
#define __IActiveScriptSiteDebug64_FWD_DEFINED__
typedef interface IActiveScriptSiteDebug64 IActiveScriptSiteDebug64;
#ifdef __cplusplus
interface IActiveScriptSiteDebug64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteDebugEx_FWD_DEFINED__
#define __IActiveScriptSiteDebugEx_FWD_DEFINED__
typedef interface IActiveScriptSiteDebugEx IActiveScriptSiteDebugEx;
#ifdef __cplusplus
interface IActiveScriptSiteDebugEx;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
#define __IActiveScriptErrorDebug_FWD_DEFINED__
typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
#ifdef __cplusplus
interface IActiveScriptErrorDebug;
#endif /* __cplusplus */
#endif

#ifndef __IDebugCodeContext_FWD_DEFINED__
#define __IDebugCodeContext_FWD_DEFINED__
typedef interface IDebugCodeContext IDebugCodeContext;
#ifdef __cplusplus
interface IDebugCodeContext;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExpression_FWD_DEFINED__
#define __IDebugExpression_FWD_DEFINED__
typedef interface IDebugExpression IDebugExpression;
#ifdef __cplusplus
interface IDebugExpression;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExpressionContext_FWD_DEFINED__
#define __IDebugExpressionContext_FWD_DEFINED__
typedef interface IDebugExpressionContext IDebugExpressionContext;
#ifdef __cplusplus
interface IDebugExpressionContext;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
#define __IDebugExpressionCallBack_FWD_DEFINED__
typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
#ifdef __cplusplus
interface IDebugExpressionCallBack;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrame_FWD_DEFINED__
#define __IDebugStackFrame_FWD_DEFINED__
typedef interface IDebugStackFrame IDebugStackFrame;
#ifdef __cplusplus
interface IDebugStackFrame;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
#define __IDebugStackFrameSniffer_FWD_DEFINED__
typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
#ifdef __cplusplus
interface IDebugStackFrameSniffer;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrameSnifferEx32_FWD_DEFINED__
#define __IDebugStackFrameSnifferEx32_FWD_DEFINED__
typedef interface IDebugStackFrameSnifferEx32 IDebugStackFrameSnifferEx32;
#ifdef __cplusplus
interface IDebugStackFrameSnifferEx32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrameSnifferEx64_FWD_DEFINED__
#define __IDebugStackFrameSnifferEx64_FWD_DEFINED__
typedef interface IDebugStackFrameSnifferEx64 IDebugStackFrameSnifferEx64;
#ifdef __cplusplus
interface IDebugStackFrameSnifferEx64;
#endif /* __cplusplus */
#endif

#ifndef __IDebugSyncOperation_FWD_DEFINED__
#define __IDebugSyncOperation_FWD_DEFINED__
typedef interface IDebugSyncOperation IDebugSyncOperation;
#ifdef __cplusplus
interface IDebugSyncOperation;
#endif /* __cplusplus */
#endif

#ifndef __IDebugAsyncOperation_FWD_DEFINED__
#define __IDebugAsyncOperation_FWD_DEFINED__
typedef interface IDebugAsyncOperation IDebugAsyncOperation;
#ifdef __cplusplus
interface IDebugAsyncOperation;
#endif /* __cplusplus */
#endif

#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
#ifdef __cplusplus
interface IDebugAsyncOperationCallBack;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
#define __IEnumDebugCodeContexts_FWD_DEFINED__
typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
#ifdef __cplusplus
interface IEnumDebugCodeContexts;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
#define __IEnumDebugStackFrames_FWD_DEFINED__
typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
#ifdef __cplusplus
interface IEnumDebugStackFrames;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugStackFrames64_FWD_DEFINED__
#define __IEnumDebugStackFrames64_FWD_DEFINED__
typedef interface IEnumDebugStackFrames64 IEnumDebugStackFrames64;
#ifdef __cplusplus
interface IEnumDebugStackFrames64;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentInfo_FWD_DEFINED__
#define __IDebugDocumentInfo_FWD_DEFINED__
typedef interface IDebugDocumentInfo IDebugDocumentInfo;
#ifdef __cplusplus
interface IDebugDocumentInfo;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentProvider_FWD_DEFINED__
#define __IDebugDocumentProvider_FWD_DEFINED__
typedef interface IDebugDocumentProvider IDebugDocumentProvider;
#ifdef __cplusplus
interface IDebugDocumentProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocument_FWD_DEFINED__
#define __IDebugDocument_FWD_DEFINED__
typedef interface IDebugDocument IDebugDocument;
#ifdef __cplusplus
interface IDebugDocument;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentText_FWD_DEFINED__
#define __IDebugDocumentText_FWD_DEFINED__
typedef interface IDebugDocumentText IDebugDocumentText;
#ifdef __cplusplus
interface IDebugDocumentText;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
#define __IDebugDocumentTextEvents_FWD_DEFINED__
typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
#ifdef __cplusplus
interface IDebugDocumentTextEvents;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
#define __IDebugDocumentTextAuthor_FWD_DEFINED__
typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
#ifdef __cplusplus
interface IDebugDocumentTextAuthor;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
#define __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
typedef interface IDebugDocumentTextExternalAuthor IDebugDocumentTextExternalAuthor;
#ifdef __cplusplus
interface IDebugDocumentTextExternalAuthor;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentHelper32_FWD_DEFINED__
#define __IDebugDocumentHelper32_FWD_DEFINED__
typedef interface IDebugDocumentHelper32 IDebugDocumentHelper32;
#ifdef __cplusplus
interface IDebugDocumentHelper32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentHelper64_FWD_DEFINED__
#define __IDebugDocumentHelper64_FWD_DEFINED__
typedef interface IDebugDocumentHelper64 IDebugDocumentHelper64;
#ifdef __cplusplus
interface IDebugDocumentHelper64;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentHost_FWD_DEFINED__
#define __IDebugDocumentHost_FWD_DEFINED__
typedef interface IDebugDocumentHost IDebugDocumentHost;
#ifdef __cplusplus
interface IDebugDocumentHost;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentContext_FWD_DEFINED__
#define __IDebugDocumentContext_FWD_DEFINED__
typedef interface IDebugDocumentContext IDebugDocumentContext;
#ifdef __cplusplus
interface IDebugDocumentContext;
#endif /* __cplusplus */
#endif

#ifndef __IDebugSessionProvider_FWD_DEFINED__
#define __IDebugSessionProvider_FWD_DEFINED__
typedef interface IDebugSessionProvider IDebugSessionProvider;
#ifdef __cplusplus
interface IDebugSessionProvider;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationDebugger_FWD_DEFINED__
#define __IApplicationDebugger_FWD_DEFINED__
typedef interface IApplicationDebugger IApplicationDebugger;
#ifdef __cplusplus
interface IApplicationDebugger;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationDebuggerUI_FWD_DEFINED__
#define __IApplicationDebuggerUI_FWD_DEFINED__
typedef interface IApplicationDebuggerUI IApplicationDebuggerUI;
#ifdef __cplusplus
interface IApplicationDebuggerUI;
#endif /* __cplusplus */
#endif

#ifndef __IMachineDebugManager_FWD_DEFINED__
#define __IMachineDebugManager_FWD_DEFINED__
typedef interface IMachineDebugManager IMachineDebugManager;
#ifdef __cplusplus
interface IMachineDebugManager;
#endif /* __cplusplus */
#endif

#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
#define __IMachineDebugManagerCookie_FWD_DEFINED__
typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
#ifdef __cplusplus
interface IMachineDebugManagerCookie;
#endif /* __cplusplus */
#endif

#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
#define __IMachineDebugManagerEvents_FWD_DEFINED__
typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
#ifdef __cplusplus
interface IMachineDebugManagerEvents;
#endif /* __cplusplus */
#endif

#ifndef __IProcessDebugManager32_FWD_DEFINED__
#define __IProcessDebugManager32_FWD_DEFINED__
typedef interface IProcessDebugManager32 IProcessDebugManager32;
#ifdef __cplusplus
interface IProcessDebugManager32;
#endif /* __cplusplus */
#endif

#ifndef __IProcessDebugManager64_FWD_DEFINED__
#define __IProcessDebugManager64_FWD_DEFINED__
typedef interface IProcessDebugManager64 IProcessDebugManager64;
#ifdef __cplusplus
interface IProcessDebugManager64;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugApplication_FWD_DEFINED__
#define __IRemoteDebugApplication_FWD_DEFINED__
typedef interface IRemoteDebugApplication IRemoteDebugApplication;
#ifdef __cplusplus
interface IRemoteDebugApplication;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplication32_FWD_DEFINED__
#define __IDebugApplication32_FWD_DEFINED__
typedef interface IDebugApplication32 IDebugApplication32;
#ifdef __cplusplus
interface IDebugApplication32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplication64_FWD_DEFINED__
#define __IDebugApplication64_FWD_DEFINED__
typedef interface IDebugApplication64 IDebugApplication64;
#ifdef __cplusplus
interface IDebugApplication64;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugApplicationEvents_FWD_DEFINED__
#define __IRemoteDebugApplicationEvents_FWD_DEFINED__
typedef interface IRemoteDebugApplicationEvents IRemoteDebugApplicationEvents;
#ifdef __cplusplus
interface IRemoteDebugApplicationEvents;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationNode_FWD_DEFINED__
#define __IDebugApplicationNode_FWD_DEFINED__
typedef interface IDebugApplicationNode IDebugApplicationNode;
#ifdef __cplusplus
interface IDebugApplicationNode;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
#define __IDebugApplicationNodeEvents_FWD_DEFINED__
typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
#ifdef __cplusplus
interface IDebugApplicationNodeEvents;
#endif /* __cplusplus */
#endif

#ifndef __AsyncIDebugApplicationNodeEvents_FWD_DEFINED__
#define __AsyncIDebugApplicationNodeEvents_FWD_DEFINED__
typedef interface AsyncIDebugApplicationNodeEvents AsyncIDebugApplicationNodeEvents;
#ifdef __cplusplus
interface AsyncIDebugApplicationNodeEvents;
#endif /* __cplusplus */
#endif

#ifndef __IDebugThreadCall32_FWD_DEFINED__
#define __IDebugThreadCall32_FWD_DEFINED__
typedef interface IDebugThreadCall32 IDebugThreadCall32;
#ifdef __cplusplus
interface IDebugThreadCall32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugThreadCall64_FWD_DEFINED__
#define __IDebugThreadCall64_FWD_DEFINED__
typedef interface IDebugThreadCall64 IDebugThreadCall64;
#ifdef __cplusplus
interface IDebugThreadCall64;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
#define __IRemoteDebugApplicationThread_FWD_DEFINED__
typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
#ifdef __cplusplus
interface IRemoteDebugApplicationThread;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationThread_FWD_DEFINED__
#define __IDebugApplicationThread_FWD_DEFINED__
typedef interface IDebugApplicationThread IDebugApplicationThread;
#ifdef __cplusplus
interface IDebugApplicationThread;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationThread64_FWD_DEFINED__
#define __IDebugApplicationThread64_FWD_DEFINED__
typedef interface IDebugApplicationThread64 IDebugApplicationThread64;
#ifdef __cplusplus
interface IDebugApplicationThread64;
#endif /* __cplusplus */
#endif

#ifndef __IDebugCookie_FWD_DEFINED__
#define __IDebugCookie_FWD_DEFINED__
typedef interface IDebugCookie IDebugCookie;
#ifdef __cplusplus
interface IDebugCookie;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
#define __IEnumDebugApplicationNodes_FWD_DEFINED__
typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
#ifdef __cplusplus
interface IEnumDebugApplicationNodes;
#endif /* __cplusplus */
#endif

#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
#define __IEnumRemoteDebugApplications_FWD_DEFINED__
typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
#ifdef __cplusplus
interface IEnumRemoteDebugApplications;
#endif /* __cplusplus */
#endif

#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
#ifdef __cplusplus
interface IEnumRemoteDebugApplicationThreads;
#endif /* __cplusplus */
#endif

#ifndef __IDebugFormatter_FWD_DEFINED__
#define __IDebugFormatter_FWD_DEFINED__
typedef interface IDebugFormatter IDebugFormatter;
#ifdef __cplusplus
interface IDebugFormatter;
#endif /* __cplusplus */
#endif

#ifndef __ISimpleConnectionPoint_FWD_DEFINED__
#define __ISimpleConnectionPoint_FWD_DEFINED__
typedef interface ISimpleConnectionPoint ISimpleConnectionPoint;
#ifdef __cplusplus
interface ISimpleConnectionPoint;
#endif /* __cplusplus */
#endif

#ifndef __IDebugHelper_FWD_DEFINED__
#define __IDebugHelper_FWD_DEFINED__
typedef interface IDebugHelper IDebugHelper;
#ifdef __cplusplus
interface IDebugHelper;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
#define __IEnumDebugExpressionContexts_FWD_DEFINED__
typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
#ifdef __cplusplus
interface IEnumDebugExpressionContexts;
#endif /* __cplusplus */
#endif

#ifndef __IProvideExpressionContexts_FWD_DEFINED__
#define __IProvideExpressionContexts_FWD_DEFINED__
typedef interface IProvideExpressionContexts IProvideExpressionContexts;
#ifdef __cplusplus
interface IProvideExpressionContexts;
#endif /* __cplusplus */
#endif

#ifndef __ProcessDebugManager_FWD_DEFINED__
#define __ProcessDebugManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class ProcessDebugManager ProcessDebugManager;
#else
typedef struct ProcessDebugManager ProcessDebugManager;
#endif /* defined __cplusplus */
#endif /* defined __ProcessDebugManager_FWD_DEFINED__ */

#ifndef __DebugHelper_FWD_DEFINED__
#define __DebugHelper_FWD_DEFINED__
#ifdef __cplusplus
typedef class DebugHelper DebugHelper;
#else
typedef struct DebugHelper DebugHelper;
#endif /* defined __cplusplus */
#endif /* defined __DebugHelper_FWD_DEFINED__ */

#ifndef __CDebugDocumentHelper_FWD_DEFINED__
#define __CDebugDocumentHelper_FWD_DEFINED__
#ifdef __cplusplus
typedef class CDebugDocumentHelper CDebugDocumentHelper;
#else
typedef struct CDebugDocumentHelper CDebugDocumentHelper;
#endif /* defined __cplusplus */
#endif /* defined __CDebugDocumentHelper_FWD_DEFINED__ */

#ifndef __MachineDebugManager_RETAIL_FWD_DEFINED__
#define __MachineDebugManager_RETAIL_FWD_DEFINED__
#ifdef __cplusplus
typedef class MachineDebugManager_RETAIL MachineDebugManager_RETAIL;
#else
typedef struct MachineDebugManager_RETAIL MachineDebugManager_RETAIL;
#endif /* defined __cplusplus */
#endif /* defined __MachineDebugManager_RETAIL_FWD_DEFINED__ */

#ifndef __MachineDebugManager_DEBUG_FWD_DEFINED__
#define __MachineDebugManager_DEBUG_FWD_DEFINED__
#ifdef __cplusplus
typedef class MachineDebugManager_DEBUG MachineDebugManager_DEBUG;
#else
typedef struct MachineDebugManager_DEBUG MachineDebugManager_DEBUG;
#endif /* defined __cplusplus */
#endif /* defined __MachineDebugManager_DEBUG_FWD_DEFINED__ */

#ifndef __DefaultDebugSessionProvider_FWD_DEFINED__
#define __DefaultDebugSessionProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class DefaultDebugSessionProvider DefaultDebugSessionProvider;
#else
typedef struct DefaultDebugSessionProvider DefaultDebugSessionProvider;
#endif /* defined __cplusplus */
#endif /* defined __DefaultDebugSessionProvider_FWD_DEFINED__ */

/* Headers for imported files */

#include <ocidl.h>
#include <oleidl.h>
#include <oaidl.h>
#include <activscp.h>
#include <dbgprop.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

#ifndef __ActivDbg_h
#define __ActivDbg_h
#ifndef __IActiveScriptDebug32_FWD_DEFINED__
#define __IActiveScriptDebug32_FWD_DEFINED__
typedef interface IActiveScriptDebug32 IActiveScriptDebug32;
#ifdef __cplusplus
interface IActiveScriptDebug32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptDebug64_FWD_DEFINED__
#define __IActiveScriptDebug64_FWD_DEFINED__
typedef interface IActiveScriptDebug64 IActiveScriptDebug64;
#ifdef __cplusplus
interface IActiveScriptDebug64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
#define __IActiveScriptErrorDebug_FWD_DEFINED__
typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
#ifdef __cplusplus
interface IActiveScriptErrorDebug;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteDebug32_FWD_DEFINED__
#define __IActiveScriptSiteDebug32_FWD_DEFINED__
typedef interface IActiveScriptSiteDebug32 IActiveScriptSiteDebug32;
#ifdef __cplusplus
interface IActiveScriptSiteDebug32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteDebug64_FWD_DEFINED__
#define __IActiveScriptSiteDebug64_FWD_DEFINED__
typedef interface IActiveScriptSiteDebug64 IActiveScriptSiteDebug64;
#ifdef __cplusplus
interface IActiveScriptSiteDebug64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteDebugEx_FWD_DEFINED__
#define __IActiveScriptSiteDebugEx_FWD_DEFINED__
typedef interface IActiveScriptSiteDebugEx IActiveScriptSiteDebugEx;
#ifdef __cplusplus
interface IActiveScriptSiteDebugEx;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptTextInfo_FWD_DEFINED__
#define __IActiveScriptTextInfo_FWD_DEFINED__
typedef interface IActiveScriptTextInfo IActiveScriptTextInfo;
#ifdef __cplusplus
interface IActiveScriptTextInfo;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationDebugger_FWD_DEFINED__
#define __IApplicationDebugger_FWD_DEFINED__
typedef interface IApplicationDebugger IApplicationDebugger;
#ifdef __cplusplus
interface IApplicationDebugger;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplication32_FWD_DEFINED__
#define __IDebugApplication32_FWD_DEFINED__
typedef interface IDebugApplication32 IDebugApplication32;
#ifdef __cplusplus
interface IDebugApplication32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplication64_FWD_DEFINED__
#define __IDebugApplication64_FWD_DEFINED__
typedef interface IDebugApplication64 IDebugApplication64;
#ifdef __cplusplus
interface IDebugApplication64;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationNode_FWD_DEFINED__
#define __IDebugApplicationNode_FWD_DEFINED__
typedef interface IDebugApplicationNode IDebugApplicationNode;
#ifdef __cplusplus
interface IDebugApplicationNode;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
#define __IDebugApplicationNodeEvents_FWD_DEFINED__
typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
#ifdef __cplusplus
interface IDebugApplicationNodeEvents;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationThread_FWD_DEFINED__
#define __IDebugApplicationThread_FWD_DEFINED__
typedef interface IDebugApplicationThread IDebugApplicationThread;
#ifdef __cplusplus
interface IDebugApplicationThread;
#endif /* __cplusplus */
#endif

#ifndef __IDebugAsyncOperation_FWD_DEFINED__
#define __IDebugAsyncOperation_FWD_DEFINED__
typedef interface IDebugAsyncOperation IDebugAsyncOperation;
#ifdef __cplusplus
interface IDebugAsyncOperation;
#endif /* __cplusplus */
#endif

#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
#ifdef __cplusplus
interface IDebugAsyncOperationCallBack;
#endif /* __cplusplus */
#endif

#ifndef __IDebugCodeContext_FWD_DEFINED__
#define __IDebugCodeContext_FWD_DEFINED__
typedef interface IDebugCodeContext IDebugCodeContext;
#ifdef __cplusplus
interface IDebugCodeContext;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocument_FWD_DEFINED__
#define __IDebugDocument_FWD_DEFINED__
typedef interface IDebugDocument IDebugDocument;
#ifdef __cplusplus
interface IDebugDocument;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentContext_FWD_DEFINED__
#define __IDebugDocumentContext_FWD_DEFINED__
typedef interface IDebugDocumentContext IDebugDocumentContext;
#ifdef __cplusplus
interface IDebugDocumentContext;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentHelper32_FWD_DEFINED__
#define __IDebugDocumentHelper32_FWD_DEFINED__
typedef interface IDebugDocumentHelper32 IDebugDocumentHelper32;
#ifdef __cplusplus
interface IDebugDocumentHelper32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentHelper64_FWD_DEFINED__
#define __IDebugDocumentHelper64_FWD_DEFINED__
typedef interface IDebugDocumentHelper64 IDebugDocumentHelper64;
#ifdef __cplusplus
interface IDebugDocumentHelper64;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentHost_FWD_DEFINED__
#define __IDebugDocumentHost_FWD_DEFINED__
typedef interface IDebugDocumentHost IDebugDocumentHost;
#ifdef __cplusplus
interface IDebugDocumentHost;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentInfo_FWD_DEFINED__
#define __IDebugDocumentInfo_FWD_DEFINED__
typedef interface IDebugDocumentInfo IDebugDocumentInfo;
#ifdef __cplusplus
interface IDebugDocumentInfo;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentProvider_FWD_DEFINED__
#define __IDebugDocumentProvider_FWD_DEFINED__
typedef interface IDebugDocumentProvider IDebugDocumentProvider;
#ifdef __cplusplus
interface IDebugDocumentProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentText_FWD_DEFINED__
#define __IDebugDocumentText_FWD_DEFINED__
typedef interface IDebugDocumentText IDebugDocumentText;
#ifdef __cplusplus
interface IDebugDocumentText;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
#define __IDebugDocumentTextAuthor_FWD_DEFINED__
typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
#ifdef __cplusplus
interface IDebugDocumentTextAuthor;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
#define __IDebugDocumentTextEvents_FWD_DEFINED__
typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
#ifdef __cplusplus
interface IDebugDocumentTextEvents;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExpression_FWD_DEFINED__
#define __IDebugExpression_FWD_DEFINED__
typedef interface IDebugExpression IDebugExpression;
#ifdef __cplusplus
interface IDebugExpression;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
#define __IDebugExpressionCallBack_FWD_DEFINED__
typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
#ifdef __cplusplus
interface IDebugExpressionCallBack;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExpressionContext_FWD_DEFINED__
#define __IDebugExpressionContext_FWD_DEFINED__
typedef interface IDebugExpressionContext IDebugExpressionContext;
#ifdef __cplusplus
interface IDebugExpressionContext;
#endif /* __cplusplus */
#endif

#ifndef __IDebugFormatter_FWD_DEFINED__
#define __IDebugFormatter_FWD_DEFINED__
typedef interface IDebugFormatter IDebugFormatter;
#ifdef __cplusplus
interface IDebugFormatter;
#endif /* __cplusplus */
#endif

#ifndef __IDebugSessionProvider_FWD_DEFINED__
#define __IDebugSessionProvider_FWD_DEFINED__
typedef interface IDebugSessionProvider IDebugSessionProvider;
#ifdef __cplusplus
interface IDebugSessionProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrame_FWD_DEFINED__
#define __IDebugStackFrame_FWD_DEFINED__
typedef interface IDebugStackFrame IDebugStackFrame;
#ifdef __cplusplus
interface IDebugStackFrame;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
#define __IDebugStackFrameSniffer_FWD_DEFINED__
typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
#ifdef __cplusplus
interface IDebugStackFrameSniffer;
#endif /* __cplusplus */
#endif

#ifndef __IDebugSyncOperation_FWD_DEFINED__
#define __IDebugSyncOperation_FWD_DEFINED__
typedef interface IDebugSyncOperation IDebugSyncOperation;
#ifdef __cplusplus
interface IDebugSyncOperation;
#endif /* __cplusplus */
#endif

#ifndef __IDebugThreadCall32_FWD_DEFINED__
#define __IDebugThreadCall32_FWD_DEFINED__
typedef interface IDebugThreadCall32 IDebugThreadCall32;
#ifdef __cplusplus
interface IDebugThreadCall32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugThreadCall64_FWD_DEFINED__
#define __IDebugThreadCall64_FWD_DEFINED__
typedef interface IDebugThreadCall64 IDebugThreadCall64;
#ifdef __cplusplus
interface IDebugThreadCall64;
#endif /* __cplusplus */
#endif

#ifndef __IEnumActiveScriptDebugs_FWD_DEFINED__
#define __IEnumActiveScriptDebugs_FWD_DEFINED__
typedef interface IEnumActiveScriptDebugs IEnumActiveScriptDebugs;
#ifdef __cplusplus
interface IEnumActiveScriptDebugs;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
#define __IEnumDebugApplicationNodes_FWD_DEFINED__
typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
#ifdef __cplusplus
interface IEnumDebugApplicationNodes;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
#define __IEnumDebugCodeContexts_FWD_DEFINED__
typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
#ifdef __cplusplus
interface IEnumDebugCodeContexts;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugDocumentContexts_FWD_DEFINED__
#define __IEnumDebugDocumentContexts_FWD_DEFINED__
typedef interface IEnumDebugDocumentContexts IEnumDebugDocumentContexts;
#ifdef __cplusplus
interface IEnumDebugDocumentContexts;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
#define __IEnumDebugExpressionContexts_FWD_DEFINED__
typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
#ifdef __cplusplus
interface IEnumDebugExpressionContexts;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugObjectBrowsers_FWD_DEFINED__
#define __IEnumDebugObjectBrowsers_FWD_DEFINED__
typedef interface IEnumDebugObjectBrowsers IEnumDebugObjectBrowsers;
#ifdef __cplusplus
interface IEnumDebugObjectBrowsers;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
#define __IEnumDebugStackFrames_FWD_DEFINED__
typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
#ifdef __cplusplus
interface IEnumDebugStackFrames;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugStackFrames64_FWD_DEFINED__
#define __IEnumDebugStackFrames64_FWD_DEFINED__
typedef interface IEnumDebugStackFrames64 IEnumDebugStackFrames64;
#ifdef __cplusplus
interface IEnumDebugStackFrames64;
#endif /* __cplusplus */
#endif

#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
#define __IEnumRemoteDebugApplications_FWD_DEFINED__
typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
#ifdef __cplusplus
interface IEnumRemoteDebugApplications;
#endif /* __cplusplus */
#endif

#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
#ifdef __cplusplus
interface IEnumRemoteDebugApplicationThreads;
#endif /* __cplusplus */
#endif

#ifndef __IMachineDebugManager_FWD_DEFINED__
#define __IMachineDebugManager_FWD_DEFINED__
typedef interface IMachineDebugManager IMachineDebugManager;
#ifdef __cplusplus
interface IMachineDebugManager;
#endif /* __cplusplus */
#endif

#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
#define __IMachineDebugManagerCookie_FWD_DEFINED__
typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
#ifdef __cplusplus
interface IMachineDebugManagerCookie;
#endif /* __cplusplus */
#endif

#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
#define __IMachineDebugManagerEvents_FWD_DEFINED__
typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
#ifdef __cplusplus
interface IMachineDebugManagerEvents;
#endif /* __cplusplus */
#endif

#ifndef __IProcessDebugManager_FWD_DEFINED__
#define __IProcessDebugManager_FWD_DEFINED__
typedef interface IProcessDebugManager IProcessDebugManager;
#ifdef __cplusplus
interface IProcessDebugManager;
#endif /* __cplusplus */
#endif

#ifndef __IProvideExpressionContexts_FWD_DEFINED__
#define __IProvideExpressionContexts_FWD_DEFINED__
typedef interface IProvideExpressionContexts IProvideExpressionContexts;
#ifdef __cplusplus
interface IProvideExpressionContexts;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugApplication_FWD_DEFINED__
#define __IRemoteDebugApplication_FWD_DEFINED__
typedef interface IRemoteDebugApplication IRemoteDebugApplication;
#ifdef __cplusplus
interface IRemoteDebugApplication;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
#define __IRemoteDebugApplicationThread_FWD_DEFINED__
typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
#ifdef __cplusplus
interface IRemoteDebugApplicationThread;
#endif /* __cplusplus */
#endif

typedef DWORD APPBREAKFLAGS;
typedef WORD SOURCE_TEXT_ATTR;
typedef DWORD TEXT_DOC_ATTR;
typedef enum tagBREAKPOINT_STATE {
    BREAKPOINT_DELETED = 0,
    BREAKPOINT_DISABLED = 1,
    BREAKPOINT_ENABLED = 2
} BREAKPOINT_STATE;
typedef enum tagBREAKREASON {
    BREAKREASON_STEP = 0,
    BREAKREASON_BREAKPOINT = 1,
    BREAKREASON_DEBUGGER_BLOCK = 2,
    BREAKREASON_HOST_INITIATED = 3,
    BREAKREASON_LANGUAGE_INITIATED = 4,
    BREAKREASON_DEBUGGER_HALT = 5,
    BREAKREASON_ERROR = 6,
    BREAKREASON_JIT = 7
} BREAKREASON;
typedef enum tagBREAKRESUME_ACTION {
    BREAKRESUMEACTION_ABORT = 0,
    BREAKRESUMEACTION_CONTINUE = 1,
    BREAKRESUMEACTION_STEP_INTO = 2,
    BREAKRESUMEACTION_STEP_OVER = 3,
    BREAKRESUMEACTION_STEP_OUT = 4,
    BREAKRESUMEACTION_IGNORE = 5
} BREAKRESUMEACTION;
typedef enum tagDOCUMENTNAMETYPE {
    DOCUMENTNAMETYPE_APPNODE = 0,
    DOCUMENTNAMETYPE_TITLE = 1,
    DOCUMENTNAMETYPE_FILE_TAIL = 2,
    DOCUMENTNAMETYPE_URL = 3,
    DOCUMENTNAMETYPE_UNIQUE_TITLE = 4
} DOCUMENTNAMETYPE;
typedef enum tagERRORRESUMEACTION {
    ERRORRESUMEACTION_ReexecuteErrorStatement = 0,
    ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller = 1,
    ERRORRESUMEACTION_SkipErrorStatement = 2
} ERRORRESUMEACTION;
typedef struct tagDebugStackFrameDescriptor {
    IDebugStackFrame *pdsf;
    DWORD dwMin;
    DWORD dwLim;
    WINBOOL fFinal;
    IUnknown *punkFinal;
} DebugStackFrameDescriptor;
typedef struct tagDebugStackFrameDescriptor64 {
    IDebugStackFrame *pdsf;
    DWORDLONG dwMin;
    DWORDLONG dwLim;
    WINBOOL fFinal;
    IUnknown *punkFinal;
} DebugStackFrameDescriptor64;
#define APPBREAKFLAG_DEBUGGER_BLOCK (0x1)

#define APPBREAKFLAG_DEBUGGER_HALT (0x2)

#define APPBREAKFLAG_STEP (0x10000)

#define APPBREAKFLAG_NESTED (0x20000)

#define APPBREAKFLAG_STEPTYPE_SOURCE (0x0)

#define APPBREAKFLAG_STEPTYPE_BYTECODE (0x100000)

#define APPBREAKFLAG_STEPTYPE_MACHINE (0x200000)

#define APPBREAKFLAG_STEPTYPE_MASK (0xf00000)

#define APPBREAKFLAG_IN_BREAKPOINT (0x80000000)

#define SOURCETEXT_ATTR_KEYWORD (0x1)

#define SOURCETEXT_ATTR_COMMENT (0x2)

#define SOURCETEXT_ATTR_NONSOURCE (0x4)

#define SOURCETEXT_ATTR_OPERATOR (0x8)

#define SOURCETEXT_ATTR_NUMBER (0x10)

#define SOURCETEXT_ATTR_STRING (0x20)

#define SOURCETEXT_ATTR_FUNCTION_START (0x40)

#define TEXT_DOC_ATTR_READONLY (0x1)

#define TEXT_DOC_ATTR_TYPE_PRIMARY (0x2)

#define TEXT_DOC_ATTR_TYPE_WORKER (0x4)

#define TEXT_DOC_ATTR_TYPE_SCRIPT (0x8)


#define DEBUG_TEXT_ISEXPRESSION (0x1)

#define DEBUG_TEXT_RETURNVALUE (0x2)

#define DEBUG_TEXT_NOSIDEEFFECTS (0x4)

#define DEBUG_TEXT_ALLOWBREAKPOINTS (0x8)

#define DEBUG_TEXT_ALLOWERRORREPORT (0x10)

#define DEBUG_TEXT_EVALUATETOCODECONTEXT (0x20)

#ifndef DISABLE_ACTIVDBG_INTERFACE_WRAPPERS
#ifdef _WIN64
#define IDebugApplication IDebugApplication64
#define IID_IDebugApplication IID_IDebugApplication64
#define IDebugThreadCall IDebugThreadCall64
#define IID_IDebugThreadCall IID_IDebugThreadCall64
#define SynchronousCallIntoThread SynchronousCallIntoThread64
#define IActiveScriptDebug IActiveScriptDebug64
#define IID_IActiveScriptDebug IID_IActiveScriptDebug64
#define IActiveScriptSiteDebug IActiveScriptSiteDebug64
#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug64
#define IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx64
#define IID_IDebugStackFrameSnifferEx IID_IDebugStackFrameSnifferEx64
#define EnumStackFramesEx EnumStackFramesEx64
#define IDebugDocumentHelper IDebugDocumentHelper64
#define IID_IDebugDocumentHelper IID_IDebugDocumentHelper64
#define IProcessDebugManager IProcessDebugManager64
#define IID_IProcessDebugManager IID_IProcessDebugManager64
#else
#define IDebugApplication IDebugApplication32
#define IID_IDebugApplication IID_IDebugApplication32
#define IDebugThreadCall IDebugThreadCall32
#define IID_IDebugThreadCall IID_IDebugThreadCall32
#define SynchronousCallIntoThread SynchronousCallIntoThread32
#define IActiveScriptDebug IActiveScriptDebug32
#define IID_IActiveScriptDebug IID_IActiveScriptDebug32
#define IActiveScriptSiteDebug IActiveScriptSiteDebug32
#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug32
#define IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx32
#define IID_IDebugStackFrameSnifferEx IID_IDebugStackFrameSnifferEx32
#define EnumStackFramesEx EnumStackFramesEx32
#define IDebugDocumentHelper IDebugDocumentHelper32
#define IID_IDebugDocumentHelper IID_IDebugDocumentHelper32
#define IProcessDebugManager IProcessDebugManager32
#define IID_IProcessDebugManager IID_IProcessDebugManager32
#endif
#endif
EXTERN_C const CLSID CLSID_DebugHelper;
EXTERN_C const CLSID CLSID_MachineDebugManager;
EXTERN_C const CLSID CLSID_ProcessDebugManager;
/*****************************************************************************
 * IActiveScriptDebug32 interface
 */
#ifndef __IActiveScriptDebug32_INTERFACE_DEFINED__
#define __IActiveScriptDebug32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptDebug32, 0x51973c10, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c10-cb0c-11d0-b5c9-00a0244a0e7a")
IActiveScriptDebug32 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes(
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptletTextAttributes(
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumCodeContextsOfPosition(
        DWORD dwSourceContext,
        ULONG uCharacterOffset,
        ULONG uNumChars,
        IEnumDebugCodeContexts **ppescc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptDebug32, 0x51973c10, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IActiveScriptDebug32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptDebug32 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetScriptTextAttributes)(
        IActiveScriptDebug32 *This,
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr);

    HRESULT (STDMETHODCALLTYPE *GetScriptletTextAttributes)(
        IActiveScriptDebug32 *This,
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr);

    HRESULT (STDMETHODCALLTYPE *EnumCodeContextsOfPosition)(
        IActiveScriptDebug32 *This,
        DWORD dwSourceContext,
        ULONG uCharacterOffset,
        ULONG uNumChars,
        IEnumDebugCodeContexts **ppescc);

    END_INTERFACE
} IActiveScriptDebug32Vtbl;

interface IActiveScriptDebug32 {
    CONST_VTBL IActiveScriptDebug32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptDebug32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptDebug32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptDebug32_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptDebug32 methods ***/
#define IActiveScriptDebug32_GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
#define IActiveScriptDebug32_GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
#define IActiveScriptDebug32_EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc) (This)->lpVtbl->EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptDebug32_QueryInterface(IActiveScriptDebug32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptDebug32_AddRef(IActiveScriptDebug32* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptDebug32_Release(IActiveScriptDebug32* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptDebug32 methods ***/
static FORCEINLINE HRESULT IActiveScriptDebug32_GetScriptTextAttributes(IActiveScriptDebug32* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
    return This->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
}
static FORCEINLINE HRESULT IActiveScriptDebug32_GetScriptletTextAttributes(IActiveScriptDebug32* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
    return This->lpVtbl->GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
}
static FORCEINLINE HRESULT IActiveScriptDebug32_EnumCodeContextsOfPosition(IActiveScriptDebug32* This,DWORD dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IEnumDebugCodeContexts **ppescc) {
    return This->lpVtbl->EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptDebug32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IActiveScriptDebug64 interface
 */
#ifndef __IActiveScriptDebug64_INTERFACE_DEFINED__
#define __IActiveScriptDebug64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptDebug64, 0xbc437e23, 0xf5b8, 0x47f4, 0xbb,0x79, 0x7d,0x1c,0xe5,0x48,0x3b,0x86);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bc437e23-f5b8-47f4-bb79-7d1ce5483b86")
IActiveScriptDebug64 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes(
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptletTextAttributes(
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumCodeContextsOfPosition(
        DWORDLONG dwSourceContext,
        ULONG uCharacterOffset,
        ULONG uNumChars,
        IEnumDebugCodeContexts **ppescc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptDebug64, 0xbc437e23, 0xf5b8, 0x47f4, 0xbb,0x79, 0x7d,0x1c,0xe5,0x48,0x3b,0x86)
#endif
#else
typedef struct IActiveScriptDebug64Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptDebug64 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetScriptTextAttributes)(
        IActiveScriptDebug64 *This,
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr);

    HRESULT (STDMETHODCALLTYPE *GetScriptletTextAttributes)(
        IActiveScriptDebug64 *This,
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr);

    HRESULT (STDMETHODCALLTYPE *EnumCodeContextsOfPosition)(
        IActiveScriptDebug64 *This,
        DWORDLONG dwSourceContext,
        ULONG uCharacterOffset,
        ULONG uNumChars,
        IEnumDebugCodeContexts **ppescc);

    END_INTERFACE
} IActiveScriptDebug64Vtbl;

interface IActiveScriptDebug64 {
    CONST_VTBL IActiveScriptDebug64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptDebug64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptDebug64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptDebug64_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptDebug64 methods ***/
#define IActiveScriptDebug64_GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
#define IActiveScriptDebug64_GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
#define IActiveScriptDebug64_EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc) (This)->lpVtbl->EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptDebug64_QueryInterface(IActiveScriptDebug64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptDebug64_AddRef(IActiveScriptDebug64* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptDebug64_Release(IActiveScriptDebug64* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptDebug64 methods ***/
static FORCEINLINE HRESULT IActiveScriptDebug64_GetScriptTextAttributes(IActiveScriptDebug64* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
    return This->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
}
static FORCEINLINE HRESULT IActiveScriptDebug64_GetScriptletTextAttributes(IActiveScriptDebug64* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
    return This->lpVtbl->GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
}
static FORCEINLINE HRESULT IActiveScriptDebug64_EnumCodeContextsOfPosition(IActiveScriptDebug64* This,DWORDLONG dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IEnumDebugCodeContexts **ppescc) {
    return This->lpVtbl->EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptDebug64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IActiveScriptSiteDebug32 interface
 */
#ifndef __IActiveScriptSiteDebug32_INTERFACE_DEFINED__
#define __IActiveScriptSiteDebug32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptSiteDebug32, 0x51973c11, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c11-cb0c-11d0-b5c9-00a0244a0e7a")
IActiveScriptSiteDebug32 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDocumentContextFromPosition(
        DWORD dwSourceContext,
        ULONG uCharacterOffset,
        ULONG uNumChars,
        IDebugDocumentContext **ppsc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetApplication(
        IDebugApplication32 **ppda) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRootApplicationNode(
        IDebugApplicationNode **ppdanRoot) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnScriptErrorDebug(
        IActiveScriptErrorDebug *pErrorDebug,
        WINBOOL *pfEnterDebugger,
        WINBOOL *pfCallOnScriptErrorWhenContinuing) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptSiteDebug32, 0x51973c11, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IActiveScriptSiteDebug32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptSiteDebug32 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocumentContextFromPosition)(
        IActiveScriptSiteDebug32 *This,
        DWORD dwSourceContext,
        ULONG uCharacterOffset,
        ULONG uNumChars,
        IDebugDocumentContext **ppsc);

    HRESULT (STDMETHODCALLTYPE *GetApplication)(
        IActiveScriptSiteDebug32 *This,
        IDebugApplication32 **ppda);

    HRESULT (STDMETHODCALLTYPE *GetRootApplicationNode)(
        IActiveScriptSiteDebug32 *This,
        IDebugApplicationNode **ppdanRoot);

    HRESULT (STDMETHODCALLTYPE *OnScriptErrorDebug)(
        IActiveScriptSiteDebug32 *This,
        IActiveScriptErrorDebug *pErrorDebug,
        WINBOOL *pfEnterDebugger,
        WINBOOL *pfCallOnScriptErrorWhenContinuing);

    END_INTERFACE
} IActiveScriptSiteDebug32Vtbl;

interface IActiveScriptSiteDebug32 {
    CONST_VTBL IActiveScriptSiteDebug32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptSiteDebug32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptSiteDebug32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptSiteDebug32_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptSiteDebug32 methods ***/
#define IActiveScriptSiteDebug32_GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc) (This)->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc)
#define IActiveScriptSiteDebug32_GetApplication(This,ppda) (This)->lpVtbl->GetApplication(This,ppda)
#define IActiveScriptSiteDebug32_GetRootApplicationNode(This,ppdanRoot) (This)->lpVtbl->GetRootApplicationNode(This,ppdanRoot)
#define IActiveScriptSiteDebug32_OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing) (This)->lpVtbl->OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptSiteDebug32_QueryInterface(IActiveScriptSiteDebug32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptSiteDebug32_AddRef(IActiveScriptSiteDebug32* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptSiteDebug32_Release(IActiveScriptSiteDebug32* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteDebug32 methods ***/
static FORCEINLINE HRESULT IActiveScriptSiteDebug32_GetDocumentContextFromPosition(IActiveScriptSiteDebug32* This,DWORD dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IDebugDocumentContext **ppsc) {
    return This->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc);
}
static FORCEINLINE HRESULT IActiveScriptSiteDebug32_GetApplication(IActiveScriptSiteDebug32* This,IDebugApplication32 **ppda) {
    return This->lpVtbl->GetApplication(This,ppda);
}
static FORCEINLINE HRESULT IActiveScriptSiteDebug32_GetRootApplicationNode(IActiveScriptSiteDebug32* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootApplicationNode(This,ppdanRoot);
}
static FORCEINLINE HRESULT IActiveScriptSiteDebug32_OnScriptErrorDebug(IActiveScriptSiteDebug32* This,IActiveScriptErrorDebug *pErrorDebug,WINBOOL *pfEnterDebugger,WINBOOL *pfCallOnScriptErrorWhenContinuing) {
    return This->lpVtbl->OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptSiteDebug32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IActiveScriptSiteDebug64 interface
 */
#ifndef __IActiveScriptSiteDebug64_INTERFACE_DEFINED__
#define __IActiveScriptSiteDebug64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptSiteDebug64, 0xd6b96b0a, 0x7463, 0x402c, 0x92,0xac, 0x89,0x98,0x42,0x26,0x94,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d6b96b0a-7463-402c-92ac-89984226942f")
IActiveScriptSiteDebug64 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDocumentContextFromPosition(
        DWORDLONG dwSourceContext,
        ULONG uCharacterOffset,
        ULONG uNumChars,
        IDebugDocumentContext **ppsc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetApplication(
        IDebugApplication64 **ppda) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRootApplicationNode(
        IDebugApplicationNode **ppdanRoot) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnScriptErrorDebug(
        IActiveScriptErrorDebug *pErrorDebug,
        WINBOOL *pfEnterDebugger,
        WINBOOL *pfCallOnScriptErrorWhenContinuing) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptSiteDebug64, 0xd6b96b0a, 0x7463, 0x402c, 0x92,0xac, 0x89,0x98,0x42,0x26,0x94,0x2f)
#endif
#else
typedef struct IActiveScriptSiteDebug64Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptSiteDebug64 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocumentContextFromPosition)(
        IActiveScriptSiteDebug64 *This,
        DWORDLONG dwSourceContext,
        ULONG uCharacterOffset,
        ULONG uNumChars,
        IDebugDocumentContext **ppsc);

    HRESULT (STDMETHODCALLTYPE *GetApplication)(
        IActiveScriptSiteDebug64 *This,
        IDebugApplication64 **ppda);

    HRESULT (STDMETHODCALLTYPE *GetRootApplicationNode)(
        IActiveScriptSiteDebug64 *This,
        IDebugApplicationNode **ppdanRoot);

    HRESULT (STDMETHODCALLTYPE *OnScriptErrorDebug)(
        IActiveScriptSiteDebug64 *This,
        IActiveScriptErrorDebug *pErrorDebug,
        WINBOOL *pfEnterDebugger,
        WINBOOL *pfCallOnScriptErrorWhenContinuing);

    END_INTERFACE
} IActiveScriptSiteDebug64Vtbl;

interface IActiveScriptSiteDebug64 {
    CONST_VTBL IActiveScriptSiteDebug64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptSiteDebug64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptSiteDebug64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptSiteDebug64_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptSiteDebug64 methods ***/
#define IActiveScriptSiteDebug64_GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc) (This)->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc)
#define IActiveScriptSiteDebug64_GetApplication(This,ppda) (This)->lpVtbl->GetApplication(This,ppda)
#define IActiveScriptSiteDebug64_GetRootApplicationNode(This,ppdanRoot) (This)->lpVtbl->GetRootApplicationNode(This,ppdanRoot)
#define IActiveScriptSiteDebug64_OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing) (This)->lpVtbl->OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptSiteDebug64_QueryInterface(IActiveScriptSiteDebug64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptSiteDebug64_AddRef(IActiveScriptSiteDebug64* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptSiteDebug64_Release(IActiveScriptSiteDebug64* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteDebug64 methods ***/
static FORCEINLINE HRESULT IActiveScriptSiteDebug64_GetDocumentContextFromPosition(IActiveScriptSiteDebug64* This,DWORDLONG dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IDebugDocumentContext **ppsc) {
    return This->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc);
}
static FORCEINLINE HRESULT IActiveScriptSiteDebug64_GetApplication(IActiveScriptSiteDebug64* This,IDebugApplication64 **ppda) {
    return This->lpVtbl->GetApplication(This,ppda);
}
static FORCEINLINE HRESULT IActiveScriptSiteDebug64_GetRootApplicationNode(IActiveScriptSiteDebug64* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootApplicationNode(This,ppdanRoot);
}
static FORCEINLINE HRESULT IActiveScriptSiteDebug64_OnScriptErrorDebug(IActiveScriptSiteDebug64* This,IActiveScriptErrorDebug *pErrorDebug,WINBOOL *pfEnterDebugger,WINBOOL *pfCallOnScriptErrorWhenContinuing) {
    return This->lpVtbl->OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptSiteDebug64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IActiveScriptSiteDebugEx interface
 */
#ifndef __IActiveScriptSiteDebugEx_INTERFACE_DEFINED__
#define __IActiveScriptSiteDebugEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptSiteDebugEx, 0xbb722ccb, 0x6ad2, 0x41c6, 0xb7,0x80, 0xaf,0x9c,0x03,0xee,0x69,0xf5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bb722ccb-6ad2-41c6-b780-af9c03ee69f5")
IActiveScriptSiteDebugEx : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnCanNotJITScriptErrorDebug(
        IActiveScriptErrorDebug *pErrorDebug,
        WINBOOL *pfCallOnScriptErrorWhenContinuing) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptSiteDebugEx, 0xbb722ccb, 0x6ad2, 0x41c6, 0xb7,0x80, 0xaf,0x9c,0x03,0xee,0x69,0xf5)
#endif
#else
typedef struct IActiveScriptSiteDebugExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptSiteDebugEx methods ***/
    HRESULT (STDMETHODCALLTYPE *OnCanNotJITScriptErrorDebug)(
        IActiveScriptSiteDebugEx *This,
        IActiveScriptErrorDebug *pErrorDebug,
        WINBOOL *pfCallOnScriptErrorWhenContinuing);

    END_INTERFACE
} IActiveScriptSiteDebugExVtbl;

interface IActiveScriptSiteDebugEx {
    CONST_VTBL IActiveScriptSiteDebugExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptSiteDebugEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptSiteDebugEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptSiteDebugEx_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptSiteDebugEx methods ***/
#define IActiveScriptSiteDebugEx_OnCanNotJITScriptErrorDebug(This,pErrorDebug,pfCallOnScriptErrorWhenContinuing) (This)->lpVtbl->OnCanNotJITScriptErrorDebug(This,pErrorDebug,pfCallOnScriptErrorWhenContinuing)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptSiteDebugEx_QueryInterface(IActiveScriptSiteDebugEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptSiteDebugEx_AddRef(IActiveScriptSiteDebugEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptSiteDebugEx_Release(IActiveScriptSiteDebugEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteDebugEx methods ***/
static FORCEINLINE HRESULT IActiveScriptSiteDebugEx_OnCanNotJITScriptErrorDebug(IActiveScriptSiteDebugEx* This,IActiveScriptErrorDebug *pErrorDebug,WINBOOL *pfCallOnScriptErrorWhenContinuing) {
    return This->lpVtbl->OnCanNotJITScriptErrorDebug(This,pErrorDebug,pfCallOnScriptErrorWhenContinuing);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptSiteDebugEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IActiveScriptErrorDebug interface
 */
#ifndef __IActiveScriptErrorDebug_INTERFACE_DEFINED__
#define __IActiveScriptErrorDebug_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptErrorDebug, 0x51973c12, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c12-cb0c-11d0-b5c9-00a0244a0e7a")
IActiveScriptErrorDebug : public IActiveScriptError
{
    virtual HRESULT STDMETHODCALLTYPE GetDocumentContext(
        IDebugDocumentContext **ppssc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStackFrame(
        IDebugStackFrame **ppdsf) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptErrorDebug, 0x51973c12, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IActiveScriptErrorDebugVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IActiveScriptErrorDebug methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocumentContext)(
        IActiveScriptErrorDebug *This,
        IDebugDocumentContext **ppssc);

    HRESULT (STDMETHODCALLTYPE *GetStackFrame)(
        IActiveScriptErrorDebug *This,
        IDebugStackFrame **ppdsf);

    END_INTERFACE
} IActiveScriptErrorDebugVtbl;

interface IActiveScriptErrorDebug {
    CONST_VTBL IActiveScriptErrorDebugVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptErrorDebug_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptErrorDebug_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptErrorDebug_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptError methods ***/
#define IActiveScriptErrorDebug_GetExceptionInfo(This,pexcepinfo) (This)->lpVtbl->GetExceptionInfo(This,pexcepinfo)
#define IActiveScriptErrorDebug_GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition) (This)->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition)
#define IActiveScriptErrorDebug_GetSourceLineText(This,pbstrSourceLine) (This)->lpVtbl->GetSourceLineText(This,pbstrSourceLine)
/*** IActiveScriptErrorDebug methods ***/
#define IActiveScriptErrorDebug_GetDocumentContext(This,ppssc) (This)->lpVtbl->GetDocumentContext(This,ppssc)
#define IActiveScriptErrorDebug_GetStackFrame(This,ppdsf) (This)->lpVtbl->GetStackFrame(This,ppdsf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptErrorDebug_QueryInterface(IActiveScriptErrorDebug* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptErrorDebug_AddRef(IActiveScriptErrorDebug* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptErrorDebug_Release(IActiveScriptErrorDebug* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptError methods ***/
static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetExceptionInfo(IActiveScriptErrorDebug* This,EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->GetExceptionInfo(This,pexcepinfo);
}
static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetSourcePosition(IActiveScriptErrorDebug* This,DWORD *pdwSourceContext,ULONG *pulLineNumber,LONG *plCharacterPosition) {
    return This->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition);
}
static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetSourceLineText(IActiveScriptErrorDebug* This,BSTR *pbstrSourceLine) {
    return This->lpVtbl->GetSourceLineText(This,pbstrSourceLine);
}
/*** IActiveScriptErrorDebug methods ***/
static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetDocumentContext(IActiveScriptErrorDebug* This,IDebugDocumentContext **ppssc) {
    return This->lpVtbl->GetDocumentContext(This,ppssc);
}
static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetStackFrame(IActiveScriptErrorDebug* This,IDebugStackFrame **ppdsf) {
    return This->lpVtbl->GetStackFrame(This,ppdsf);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptErrorDebug_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugCodeContext interface
 */
#ifndef __IDebugCodeContext_INTERFACE_DEFINED__
#define __IDebugCodeContext_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugCodeContext, 0x51973c13, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c13-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugCodeContext : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDocumentContext(
        IDebugDocumentContext **ppsc) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBreakPoint(
        BREAKPOINT_STATE bps) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugCodeContext, 0x51973c13, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugCodeContextVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugCodeContext methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocumentContext)(
        IDebugCodeContext *This,
        IDebugDocumentContext **ppsc);

    HRESULT (STDMETHODCALLTYPE *SetBreakPoint)(
        IDebugCodeContext *This,
        BREAKPOINT_STATE bps);

    END_INTERFACE
} IDebugCodeContextVtbl;

interface IDebugCodeContext {
    CONST_VTBL IDebugCodeContextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugCodeContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugCodeContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugCodeContext_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugCodeContext methods ***/
#define IDebugCodeContext_GetDocumentContext(This,ppsc) (This)->lpVtbl->GetDocumentContext(This,ppsc)
#define IDebugCodeContext_SetBreakPoint(This,bps) (This)->lpVtbl->SetBreakPoint(This,bps)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugCodeContext_QueryInterface(IDebugCodeContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugCodeContext_AddRef(IDebugCodeContext* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugCodeContext_Release(IDebugCodeContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugCodeContext methods ***/
static FORCEINLINE HRESULT IDebugCodeContext_GetDocumentContext(IDebugCodeContext* This,IDebugDocumentContext **ppsc) {
    return This->lpVtbl->GetDocumentContext(This,ppsc);
}
static FORCEINLINE HRESULT IDebugCodeContext_SetBreakPoint(IDebugCodeContext* This,BREAKPOINT_STATE bps) {
    return This->lpVtbl->SetBreakPoint(This,bps);
}
#endif
#endif

#endif


#endif  /* __IDebugCodeContext_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugExpression interface
 */
#ifndef __IDebugExpression_INTERFACE_DEFINED__
#define __IDebugExpression_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugExpression, 0x51973c14, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c14-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugExpression : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Start(
        IDebugExpressionCallBack *pdecb) = 0;

    virtual HRESULT STDMETHODCALLTYPE Abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryIsComplete(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResultAsString(
        HRESULT *phrResult,
        BSTR *pbstrResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResultAsDebugProperty(
        HRESULT *phrResult,
        IDebugProperty **ppdp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugExpression, 0x51973c14, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugExpressionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugExpression methods ***/
    HRESULT (STDMETHODCALLTYPE *Start)(
        IDebugExpression *This,
        IDebugExpressionCallBack *pdecb);

    HRESULT (STDMETHODCALLTYPE *Abort)(
        IDebugExpression *This);

    HRESULT (STDMETHODCALLTYPE *QueryIsComplete)(
        IDebugExpression *This);

    HRESULT (STDMETHODCALLTYPE *GetResultAsString)(
        IDebugExpression *This,
        HRESULT *phrResult,
        BSTR *pbstrResult);

    HRESULT (STDMETHODCALLTYPE *GetResultAsDebugProperty)(
        IDebugExpression *This,
        HRESULT *phrResult,
        IDebugProperty **ppdp);

    END_INTERFACE
} IDebugExpressionVtbl;

interface IDebugExpression {
    CONST_VTBL IDebugExpressionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugExpression_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugExpression_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugExpression_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugExpression methods ***/
#define IDebugExpression_Start(This,pdecb) (This)->lpVtbl->Start(This,pdecb)
#define IDebugExpression_Abort(This) (This)->lpVtbl->Abort(This)
#define IDebugExpression_QueryIsComplete(This) (This)->lpVtbl->QueryIsComplete(This)
#define IDebugExpression_GetResultAsString(This,phrResult,pbstrResult) (This)->lpVtbl->GetResultAsString(This,phrResult,pbstrResult)
#define IDebugExpression_GetResultAsDebugProperty(This,phrResult,ppdp) (This)->lpVtbl->GetResultAsDebugProperty(This,phrResult,ppdp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugExpression_QueryInterface(IDebugExpression* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugExpression_AddRef(IDebugExpression* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugExpression_Release(IDebugExpression* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugExpression methods ***/
static FORCEINLINE HRESULT IDebugExpression_Start(IDebugExpression* This,IDebugExpressionCallBack *pdecb) {
    return This->lpVtbl->Start(This,pdecb);
}
static FORCEINLINE HRESULT IDebugExpression_Abort(IDebugExpression* This) {
    return This->lpVtbl->Abort(This);
}
static FORCEINLINE HRESULT IDebugExpression_QueryIsComplete(IDebugExpression* This) {
    return This->lpVtbl->QueryIsComplete(This);
}
static FORCEINLINE HRESULT IDebugExpression_GetResultAsString(IDebugExpression* This,HRESULT *phrResult,BSTR *pbstrResult) {
    return This->lpVtbl->GetResultAsString(This,phrResult,pbstrResult);
}
static FORCEINLINE HRESULT IDebugExpression_GetResultAsDebugProperty(IDebugExpression* This,HRESULT *phrResult,IDebugProperty **ppdp) {
    return This->lpVtbl->GetResultAsDebugProperty(This,phrResult,ppdp);
}
#endif
#endif

#endif


#endif  /* __IDebugExpression_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugExpressionContext interface
 */
#ifndef __IDebugExpressionContext_INTERFACE_DEFINED__
#define __IDebugExpressionContext_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugExpressionContext, 0x51973c15, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c15-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugExpressionContext : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ParseLanguageText(
        LPCOLESTR pstrCode,
        UINT nRadix,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        IDebugExpression **ppe) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLanguageInfo(
        BSTR *pbstrLanguageName,
        GUID *pLanguageID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugExpressionContext, 0x51973c15, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugExpressionContextVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugExpressionContext methods ***/
    HRESULT (STDMETHODCALLTYPE *ParseLanguageText)(
        IDebugExpressionContext *This,
        LPCOLESTR pstrCode,
        UINT nRadix,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        IDebugExpression **ppe);

    HRESULT (STDMETHODCALLTYPE *GetLanguageInfo)(
        IDebugExpressionContext *This,
        BSTR *pbstrLanguageName,
        GUID *pLanguageID);

    END_INTERFACE
} IDebugExpressionContextVtbl;

interface IDebugExpressionContext {
    CONST_VTBL IDebugExpressionContextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugExpressionContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugExpressionContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugExpressionContext_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugExpressionContext methods ***/
#define IDebugExpressionContext_ParseLanguageText(This,pstrCode,nRadix,pstrDelimiter,dwFlags,ppe) (This)->lpVtbl->ParseLanguageText(This,pstrCode,nRadix,pstrDelimiter,dwFlags,ppe)
#define IDebugExpressionContext_GetLanguageInfo(This,pbstrLanguageName,pLanguageID) (This)->lpVtbl->GetLanguageInfo(This,pbstrLanguageName,pLanguageID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugExpressionContext_QueryInterface(IDebugExpressionContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugExpressionContext_AddRef(IDebugExpressionContext* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugExpressionContext_Release(IDebugExpressionContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugExpressionContext methods ***/
static FORCEINLINE HRESULT IDebugExpressionContext_ParseLanguageText(IDebugExpressionContext* This,LPCOLESTR pstrCode,UINT nRadix,LPCOLESTR pstrDelimiter,DWORD dwFlags,IDebugExpression **ppe) {
    return This->lpVtbl->ParseLanguageText(This,pstrCode,nRadix,pstrDelimiter,dwFlags,ppe);
}
static FORCEINLINE HRESULT IDebugExpressionContext_GetLanguageInfo(IDebugExpressionContext* This,BSTR *pbstrLanguageName,GUID *pLanguageID) {
    return This->lpVtbl->GetLanguageInfo(This,pbstrLanguageName,pLanguageID);
}
#endif
#endif

#endif


#endif  /* __IDebugExpressionContext_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugExpressionCallBack interface
 */
#ifndef __IDebugExpressionCallBack_INTERFACE_DEFINED__
#define __IDebugExpressionCallBack_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugExpressionCallBack, 0x51973c16, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c16-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugExpressionCallBack : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE onComplete(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugExpressionCallBack, 0x51973c16, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugExpressionCallBackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugExpressionCallBack methods ***/
    HRESULT (STDMETHODCALLTYPE *onComplete)(
        IDebugExpressionCallBack *This);

    END_INTERFACE
} IDebugExpressionCallBackVtbl;

interface IDebugExpressionCallBack {
    CONST_VTBL IDebugExpressionCallBackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugExpressionCallBack_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugExpressionCallBack_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugExpressionCallBack_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugExpressionCallBack methods ***/
#define IDebugExpressionCallBack_onComplete(This) (This)->lpVtbl->onComplete(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugExpressionCallBack_QueryInterface(IDebugExpressionCallBack* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugExpressionCallBack_AddRef(IDebugExpressionCallBack* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugExpressionCallBack_Release(IDebugExpressionCallBack* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugExpressionCallBack methods ***/
static FORCEINLINE HRESULT IDebugExpressionCallBack_onComplete(IDebugExpressionCallBack* This) {
    return This->lpVtbl->onComplete(This);
}
#endif
#endif

#endif


#endif  /* __IDebugExpressionCallBack_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugStackFrame interface
 */
#ifndef __IDebugStackFrame_INTERFACE_DEFINED__
#define __IDebugStackFrame_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugStackFrame, 0x51973c17, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c17-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugStackFrame : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCodeContext(
        IDebugCodeContext **ppcc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescriptionString(
        WINBOOL fLong,
        BSTR *pbstrDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLanguageString(
        WINBOOL fLong,
        BSTR *pbstrLanguage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetThread(
        IDebugApplicationThread **ppat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDebugProperty(
        IDebugProperty **ppDebugProp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugStackFrame, 0x51973c17, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugStackFrameVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugStackFrame methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodeContext)(
        IDebugStackFrame *This,
        IDebugCodeContext **ppcc);

    HRESULT (STDMETHODCALLTYPE *GetDescriptionString)(
        IDebugStackFrame *This,
        WINBOOL fLong,
        BSTR *pbstrDescription);

    HRESULT (STDMETHODCALLTYPE *GetLanguageString)(
        IDebugStackFrame *This,
        WINBOOL fLong,
        BSTR *pbstrLanguage);

    HRESULT (STDMETHODCALLTYPE *GetThread)(
        IDebugStackFrame *This,
        IDebugApplicationThread **ppat);

    HRESULT (STDMETHODCALLTYPE *GetDebugProperty)(
        IDebugStackFrame *This,
        IDebugProperty **ppDebugProp);

    END_INTERFACE
} IDebugStackFrameVtbl;

interface IDebugStackFrame {
    CONST_VTBL IDebugStackFrameVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugStackFrame_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugStackFrame_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugStackFrame_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugStackFrame methods ***/
#define IDebugStackFrame_GetCodeContext(This,ppcc) (This)->lpVtbl->GetCodeContext(This,ppcc)
#define IDebugStackFrame_GetDescriptionString(This,fLong,pbstrDescription) (This)->lpVtbl->GetDescriptionString(This,fLong,pbstrDescription)
#define IDebugStackFrame_GetLanguageString(This,fLong,pbstrLanguage) (This)->lpVtbl->GetLanguageString(This,fLong,pbstrLanguage)
#define IDebugStackFrame_GetThread(This,ppat) (This)->lpVtbl->GetThread(This,ppat)
#define IDebugStackFrame_GetDebugProperty(This,ppDebugProp) (This)->lpVtbl->GetDebugProperty(This,ppDebugProp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugStackFrame_QueryInterface(IDebugStackFrame* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugStackFrame_AddRef(IDebugStackFrame* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugStackFrame_Release(IDebugStackFrame* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugStackFrame methods ***/
static FORCEINLINE HRESULT IDebugStackFrame_GetCodeContext(IDebugStackFrame* This,IDebugCodeContext **ppcc) {
    return This->lpVtbl->GetCodeContext(This,ppcc);
}
static FORCEINLINE HRESULT IDebugStackFrame_GetDescriptionString(IDebugStackFrame* This,WINBOOL fLong,BSTR *pbstrDescription) {
    return This->lpVtbl->GetDescriptionString(This,fLong,pbstrDescription);
}
static FORCEINLINE HRESULT IDebugStackFrame_GetLanguageString(IDebugStackFrame* This,WINBOOL fLong,BSTR *pbstrLanguage) {
    return This->lpVtbl->GetLanguageString(This,fLong,pbstrLanguage);
}
static FORCEINLINE HRESULT IDebugStackFrame_GetThread(IDebugStackFrame* This,IDebugApplicationThread **ppat) {
    return This->lpVtbl->GetThread(This,ppat);
}
static FORCEINLINE HRESULT IDebugStackFrame_GetDebugProperty(IDebugStackFrame* This,IDebugProperty **ppDebugProp) {
    return This->lpVtbl->GetDebugProperty(This,ppDebugProp);
}
#endif
#endif

#endif


#endif  /* __IDebugStackFrame_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugStackFrameSniffer interface
 */
#ifndef __IDebugStackFrameSniffer_INTERFACE_DEFINED__
#define __IDebugStackFrameSniffer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugStackFrameSniffer, 0x51973c18, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c18-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugStackFrameSniffer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EnumStackFrames(
        IEnumDebugStackFrames **ppedsf) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugStackFrameSniffer, 0x51973c18, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugStackFrameSnifferVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugStackFrameSniffer methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
        IDebugStackFrameSniffer *This,
        IEnumDebugStackFrames **ppedsf);

    END_INTERFACE
} IDebugStackFrameSnifferVtbl;

interface IDebugStackFrameSniffer {
    CONST_VTBL IDebugStackFrameSnifferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugStackFrameSniffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugStackFrameSniffer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugStackFrameSniffer_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugStackFrameSniffer methods ***/
#define IDebugStackFrameSniffer_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugStackFrameSniffer_QueryInterface(IDebugStackFrameSniffer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugStackFrameSniffer_AddRef(IDebugStackFrameSniffer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugStackFrameSniffer_Release(IDebugStackFrameSniffer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugStackFrameSniffer methods ***/
static FORCEINLINE HRESULT IDebugStackFrameSniffer_EnumStackFrames(IDebugStackFrameSniffer* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
#endif
#endif

#endif


#endif  /* __IDebugStackFrameSniffer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugStackFrameSnifferEx32 interface
 */
#ifndef __IDebugStackFrameSnifferEx32_INTERFACE_DEFINED__
#define __IDebugStackFrameSnifferEx32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugStackFrameSnifferEx32, 0x51973c19, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c19-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugStackFrameSnifferEx32 : public IDebugStackFrameSniffer
{
    virtual HRESULT STDMETHODCALLTYPE EnumStackFramesEx32(
        DWORD dwSpMin,
        IEnumDebugStackFrames **ppedsf) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugStackFrameSnifferEx32, 0x51973c19, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugStackFrameSnifferEx32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugStackFrameSniffer methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
        IDebugStackFrameSnifferEx32 *This,
        IEnumDebugStackFrames **ppedsf);

    /*** IDebugStackFrameSnifferEx32 methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumStackFramesEx32)(
        IDebugStackFrameSnifferEx32 *This,
        DWORD dwSpMin,
        IEnumDebugStackFrames **ppedsf);

    END_INTERFACE
} IDebugStackFrameSnifferEx32Vtbl;

interface IDebugStackFrameSnifferEx32 {
    CONST_VTBL IDebugStackFrameSnifferEx32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugStackFrameSnifferEx32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugStackFrameSnifferEx32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugStackFrameSnifferEx32_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugStackFrameSniffer methods ***/
#define IDebugStackFrameSnifferEx32_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
/*** IDebugStackFrameSnifferEx32 methods ***/
#define IDebugStackFrameSnifferEx32_EnumStackFramesEx32(This,dwSpMin,ppedsf) (This)->lpVtbl->EnumStackFramesEx32(This,dwSpMin,ppedsf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugStackFrameSnifferEx32_QueryInterface(IDebugStackFrameSnifferEx32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugStackFrameSnifferEx32_AddRef(IDebugStackFrameSnifferEx32* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugStackFrameSnifferEx32_Release(IDebugStackFrameSnifferEx32* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugStackFrameSniffer methods ***/
static FORCEINLINE HRESULT IDebugStackFrameSnifferEx32_EnumStackFrames(IDebugStackFrameSnifferEx32* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
/*** IDebugStackFrameSnifferEx32 methods ***/
static FORCEINLINE HRESULT IDebugStackFrameSnifferEx32_EnumStackFramesEx32(IDebugStackFrameSnifferEx32* This,DWORD dwSpMin,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFramesEx32(This,dwSpMin,ppedsf);
}
#endif
#endif

#endif


#endif  /* __IDebugStackFrameSnifferEx32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugStackFrameSnifferEx64 interface
 */
#ifndef __IDebugStackFrameSnifferEx64_INTERFACE_DEFINED__
#define __IDebugStackFrameSnifferEx64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugStackFrameSnifferEx64, 0x8cd12af4, 0x49c1, 0x4d52, 0x8d,0x8a, 0xc1,0x46,0xf4,0x75,0x81,0xaa);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8cd12af4-49c1-4d52-8d8a-c146f47581aa")
IDebugStackFrameSnifferEx64 : public IDebugStackFrameSniffer
{
    virtual HRESULT STDMETHODCALLTYPE EnumStackFramesEx64(
        DWORDLONG dwSpMin,
        IEnumDebugStackFrames64 **ppedsf) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugStackFrameSnifferEx64, 0x8cd12af4, 0x49c1, 0x4d52, 0x8d,0x8a, 0xc1,0x46,0xf4,0x75,0x81,0xaa)
#endif
#else
typedef struct IDebugStackFrameSnifferEx64Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugStackFrameSniffer methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
        IDebugStackFrameSnifferEx64 *This,
        IEnumDebugStackFrames **ppedsf);

    /*** IDebugStackFrameSnifferEx64 methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumStackFramesEx64)(
        IDebugStackFrameSnifferEx64 *This,
        DWORDLONG dwSpMin,
        IEnumDebugStackFrames64 **ppedsf);

    END_INTERFACE
} IDebugStackFrameSnifferEx64Vtbl;

interface IDebugStackFrameSnifferEx64 {
    CONST_VTBL IDebugStackFrameSnifferEx64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugStackFrameSnifferEx64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugStackFrameSnifferEx64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugStackFrameSnifferEx64_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugStackFrameSniffer methods ***/
#define IDebugStackFrameSnifferEx64_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
/*** IDebugStackFrameSnifferEx64 methods ***/
#define IDebugStackFrameSnifferEx64_EnumStackFramesEx64(This,dwSpMin,ppedsf) (This)->lpVtbl->EnumStackFramesEx64(This,dwSpMin,ppedsf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugStackFrameSnifferEx64_QueryInterface(IDebugStackFrameSnifferEx64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugStackFrameSnifferEx64_AddRef(IDebugStackFrameSnifferEx64* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugStackFrameSnifferEx64_Release(IDebugStackFrameSnifferEx64* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugStackFrameSniffer methods ***/
static FORCEINLINE HRESULT IDebugStackFrameSnifferEx64_EnumStackFrames(IDebugStackFrameSnifferEx64* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
/*** IDebugStackFrameSnifferEx64 methods ***/
static FORCEINLINE HRESULT IDebugStackFrameSnifferEx64_EnumStackFramesEx64(IDebugStackFrameSnifferEx64* This,DWORDLONG dwSpMin,IEnumDebugStackFrames64 **ppedsf) {
    return This->lpVtbl->EnumStackFramesEx64(This,dwSpMin,ppedsf);
}
#endif
#endif

#endif


#endif  /* __IDebugStackFrameSnifferEx64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugSyncOperation interface
 */
#ifndef __IDebugSyncOperation_INTERFACE_DEFINED__
#define __IDebugSyncOperation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugSyncOperation, 0x51973c1a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c1a-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugSyncOperation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetTargetThread(
        IDebugApplicationThread **ppatTarget) = 0;

    virtual HRESULT STDMETHODCALLTYPE Execute(
        IUnknown **ppunkResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE InProgressAbort(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugSyncOperation, 0x51973c1a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugSyncOperationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugSyncOperation methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTargetThread)(
        IDebugSyncOperation *This,
        IDebugApplicationThread **ppatTarget);

    HRESULT (STDMETHODCALLTYPE *Execute)(
        IDebugSyncOperation *This,
        IUnknown **ppunkResult);

    HRESULT (STDMETHODCALLTYPE *InProgressAbort)(
        IDebugSyncOperation *This);

    END_INTERFACE
} IDebugSyncOperationVtbl;

interface IDebugSyncOperation {
    CONST_VTBL IDebugSyncOperationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugSyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugSyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugSyncOperation_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugSyncOperation methods ***/
#define IDebugSyncOperation_GetTargetThread(This,ppatTarget) (This)->lpVtbl->GetTargetThread(This,ppatTarget)
#define IDebugSyncOperation_Execute(This,ppunkResult) (This)->lpVtbl->Execute(This,ppunkResult)
#define IDebugSyncOperation_InProgressAbort(This) (This)->lpVtbl->InProgressAbort(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugSyncOperation_QueryInterface(IDebugSyncOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugSyncOperation_AddRef(IDebugSyncOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugSyncOperation_Release(IDebugSyncOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugSyncOperation methods ***/
static FORCEINLINE HRESULT IDebugSyncOperation_GetTargetThread(IDebugSyncOperation* This,IDebugApplicationThread **ppatTarget) {
    return This->lpVtbl->GetTargetThread(This,ppatTarget);
}
static FORCEINLINE HRESULT IDebugSyncOperation_Execute(IDebugSyncOperation* This,IUnknown **ppunkResult) {
    return This->lpVtbl->Execute(This,ppunkResult);
}
static FORCEINLINE HRESULT IDebugSyncOperation_InProgressAbort(IDebugSyncOperation* This) {
    return This->lpVtbl->InProgressAbort(This);
}
#endif
#endif

#endif


#endif  /* __IDebugSyncOperation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugAsyncOperation interface
 */
#ifndef __IDebugAsyncOperation_INTERFACE_DEFINED__
#define __IDebugAsyncOperation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugAsyncOperation, 0x51973c1b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c1b-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugAsyncOperation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSyncDebugOperation(
        IDebugSyncOperation **ppsdo) = 0;

    virtual HRESULT STDMETHODCALLTYPE Start(
        IDebugAsyncOperationCallBack *padocb) = 0;

    virtual HRESULT STDMETHODCALLTYPE Abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryIsComplete(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResult(
        HRESULT *phrResult,
        IUnknown **ppunkResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugAsyncOperation, 0x51973c1b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugAsyncOperationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugAsyncOperation methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSyncDebugOperation)(
        IDebugAsyncOperation *This,
        IDebugSyncOperation **ppsdo);

    HRESULT (STDMETHODCALLTYPE *Start)(
        IDebugAsyncOperation *This,
        IDebugAsyncOperationCallBack *padocb);

    HRESULT (STDMETHODCALLTYPE *Abort)(
        IDebugAsyncOperation *This);

    HRESULT (STDMETHODCALLTYPE *QueryIsComplete)(
        IDebugAsyncOperation *This);

    HRESULT (STDMETHODCALLTYPE *GetResult)(
        IDebugAsyncOperation *This,
        HRESULT *phrResult,
        IUnknown **ppunkResult);

    END_INTERFACE
} IDebugAsyncOperationVtbl;

interface IDebugAsyncOperation {
    CONST_VTBL IDebugAsyncOperationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugAsyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugAsyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugAsyncOperation_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugAsyncOperation methods ***/
#define IDebugAsyncOperation_GetSyncDebugOperation(This,ppsdo) (This)->lpVtbl->GetSyncDebugOperation(This,ppsdo)
#define IDebugAsyncOperation_Start(This,padocb) (This)->lpVtbl->Start(This,padocb)
#define IDebugAsyncOperation_Abort(This) (This)->lpVtbl->Abort(This)
#define IDebugAsyncOperation_QueryIsComplete(This) (This)->lpVtbl->QueryIsComplete(This)
#define IDebugAsyncOperation_GetResult(This,phrResult,ppunkResult) (This)->lpVtbl->GetResult(This,phrResult,ppunkResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugAsyncOperation_QueryInterface(IDebugAsyncOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugAsyncOperation_AddRef(IDebugAsyncOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugAsyncOperation_Release(IDebugAsyncOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugAsyncOperation methods ***/
static FORCEINLINE HRESULT IDebugAsyncOperation_GetSyncDebugOperation(IDebugAsyncOperation* This,IDebugSyncOperation **ppsdo) {
    return This->lpVtbl->GetSyncDebugOperation(This,ppsdo);
}
static FORCEINLINE HRESULT IDebugAsyncOperation_Start(IDebugAsyncOperation* This,IDebugAsyncOperationCallBack *padocb) {
    return This->lpVtbl->Start(This,padocb);
}
static FORCEINLINE HRESULT IDebugAsyncOperation_Abort(IDebugAsyncOperation* This) {
    return This->lpVtbl->Abort(This);
}
static FORCEINLINE HRESULT IDebugAsyncOperation_QueryIsComplete(IDebugAsyncOperation* This) {
    return This->lpVtbl->QueryIsComplete(This);
}
static FORCEINLINE HRESULT IDebugAsyncOperation_GetResult(IDebugAsyncOperation* This,HRESULT *phrResult,IUnknown **ppunkResult) {
    return This->lpVtbl->GetResult(This,phrResult,ppunkResult);
}
#endif
#endif

#endif


#endif  /* __IDebugAsyncOperation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugAsyncOperationCallBack interface
 */
#ifndef __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__
#define __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugAsyncOperationCallBack, 0x51973c1c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c1c-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugAsyncOperationCallBack : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE onComplete(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugAsyncOperationCallBack, 0x51973c1c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugAsyncOperationCallBackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugAsyncOperationCallBack methods ***/
    HRESULT (STDMETHODCALLTYPE *onComplete)(
        IDebugAsyncOperationCallBack *This);

    END_INTERFACE
} IDebugAsyncOperationCallBackVtbl;

interface IDebugAsyncOperationCallBack {
    CONST_VTBL IDebugAsyncOperationCallBackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugAsyncOperationCallBack_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugAsyncOperationCallBack_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugAsyncOperationCallBack_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugAsyncOperationCallBack methods ***/
#define IDebugAsyncOperationCallBack_onComplete(This) (This)->lpVtbl->onComplete(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugAsyncOperationCallBack_QueryInterface(IDebugAsyncOperationCallBack* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugAsyncOperationCallBack_AddRef(IDebugAsyncOperationCallBack* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugAsyncOperationCallBack_Release(IDebugAsyncOperationCallBack* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugAsyncOperationCallBack methods ***/
static FORCEINLINE HRESULT IDebugAsyncOperationCallBack_onComplete(IDebugAsyncOperationCallBack* This) {
    return This->lpVtbl->onComplete(This);
}
#endif
#endif

#endif


#endif  /* __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumDebugCodeContexts interface
 */
#ifndef __IEnumDebugCodeContexts_INTERFACE_DEFINED__
#define __IEnumDebugCodeContexts_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumDebugCodeContexts, 0x51973c1d, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c1d-cb0c-11d0-b5c9-00a0244a0e7a")
IEnumDebugCodeContexts : public IUnknown
{
    virtual HRESULT __stdcall Next(
        ULONG celt,
        IDebugCodeContext **pscc,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumDebugCodeContexts **ppescc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumDebugCodeContexts, 0x51973c1d, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IEnumDebugCodeContextsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumDebugCodeContexts methods ***/
    HRESULT (__stdcall *Next)(
        IEnumDebugCodeContexts *This,
        ULONG celt,
        IDebugCodeContext **pscc,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumDebugCodeContexts *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumDebugCodeContexts *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumDebugCodeContexts *This,
        IEnumDebugCodeContexts **ppescc);

    END_INTERFACE
} IEnumDebugCodeContextsVtbl;

interface IEnumDebugCodeContexts {
    CONST_VTBL IEnumDebugCodeContextsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumDebugCodeContexts_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumDebugCodeContexts_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumDebugCodeContexts_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumDebugCodeContexts methods ***/
#define IEnumDebugCodeContexts_Next(This,celt,pscc,pceltFetched) (This)->lpVtbl->Next(This,celt,pscc,pceltFetched)
#define IEnumDebugCodeContexts_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumDebugCodeContexts_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumDebugCodeContexts_Clone(This,ppescc) (This)->lpVtbl->Clone(This,ppescc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumDebugCodeContexts_QueryInterface(IEnumDebugCodeContexts* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumDebugCodeContexts_AddRef(IEnumDebugCodeContexts* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumDebugCodeContexts_Release(IEnumDebugCodeContexts* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugCodeContexts methods ***/
static FORCEINLINE HRESULT IEnumDebugCodeContexts_Next(IEnumDebugCodeContexts* This,ULONG celt,IDebugCodeContext **pscc,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,pscc,pceltFetched);
}
static FORCEINLINE HRESULT IEnumDebugCodeContexts_Skip(IEnumDebugCodeContexts* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumDebugCodeContexts_Reset(IEnumDebugCodeContexts* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumDebugCodeContexts_Clone(IEnumDebugCodeContexts* This,IEnumDebugCodeContexts **ppescc) {
    return This->lpVtbl->Clone(This,ppescc);
}
#endif
#endif

#endif

HRESULT __stdcall IEnumDebugCodeContexts_RemoteNext_Proxy(
    IEnumDebugCodeContexts* This,
    ULONG celt,
    IDebugCodeContext **pscc,
    ULONG *pceltFetched);
void __RPC_STUB IEnumDebugCodeContexts_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumDebugCodeContexts_Next_Proxy(
    IEnumDebugCodeContexts* This,
    ULONG celt,
    IDebugCodeContext **pscc,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumDebugCodeContexts_Next_Stub(
    IEnumDebugCodeContexts* This,
    ULONG celt,
    IDebugCodeContext **pscc,
    ULONG *pceltFetched);

#endif  /* __IEnumDebugCodeContexts_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumDebugStackFrames interface
 */
#ifndef __IEnumDebugStackFrames_INTERFACE_DEFINED__
#define __IEnumDebugStackFrames_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumDebugStackFrames, 0x51973c1e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c1e-cb0c-11d0-b5c9-00a0244a0e7a")
IEnumDebugStackFrames : public IUnknown
{
    virtual HRESULT __stdcall Next(
        ULONG celt,
        DebugStackFrameDescriptor *prgdsfd,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumDebugStackFrames **ppedsf) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumDebugStackFrames, 0x51973c1e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IEnumDebugStackFramesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumDebugStackFrames methods ***/
    HRESULT (__stdcall *Next)(
        IEnumDebugStackFrames *This,
        ULONG celt,
        DebugStackFrameDescriptor *prgdsfd,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumDebugStackFrames *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumDebugStackFrames *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumDebugStackFrames *This,
        IEnumDebugStackFrames **ppedsf);

    END_INTERFACE
} IEnumDebugStackFramesVtbl;

interface IEnumDebugStackFrames {
    CONST_VTBL IEnumDebugStackFramesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumDebugStackFrames_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumDebugStackFrames_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumDebugStackFrames_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumDebugStackFrames methods ***/
#define IEnumDebugStackFrames_Next(This,celt,prgdsfd,pceltFetched) (This)->lpVtbl->Next(This,celt,prgdsfd,pceltFetched)
#define IEnumDebugStackFrames_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumDebugStackFrames_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumDebugStackFrames_Clone(This,ppedsf) (This)->lpVtbl->Clone(This,ppedsf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumDebugStackFrames_QueryInterface(IEnumDebugStackFrames* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumDebugStackFrames_AddRef(IEnumDebugStackFrames* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumDebugStackFrames_Release(IEnumDebugStackFrames* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugStackFrames methods ***/
static FORCEINLINE HRESULT IEnumDebugStackFrames_Next(IEnumDebugStackFrames* This,ULONG celt,DebugStackFrameDescriptor *prgdsfd,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,prgdsfd,pceltFetched);
}
static FORCEINLINE HRESULT IEnumDebugStackFrames_Skip(IEnumDebugStackFrames* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumDebugStackFrames_Reset(IEnumDebugStackFrames* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumDebugStackFrames_Clone(IEnumDebugStackFrames* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->Clone(This,ppedsf);
}
#endif
#endif

#endif

HRESULT __stdcall IEnumDebugStackFrames_RemoteNext_Proxy(
    IEnumDebugStackFrames* This,
    ULONG celt,
    DebugStackFrameDescriptor *prgdsfd,
    ULONG *pceltFetched);
void __RPC_STUB IEnumDebugStackFrames_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumDebugStackFrames_Next_Proxy(
    IEnumDebugStackFrames* This,
    ULONG celt,
    DebugStackFrameDescriptor *prgdsfd,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumDebugStackFrames_Next_Stub(
    IEnumDebugStackFrames* This,
    ULONG celt,
    DebugStackFrameDescriptor *prgdsfd,
    ULONG *pceltFetched);

#endif  /* __IEnumDebugStackFrames_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumDebugStackFrames64 interface
 */
#ifndef __IEnumDebugStackFrames64_INTERFACE_DEFINED__
#define __IEnumDebugStackFrames64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumDebugStackFrames64, 0x0dc38853, 0xc1b0, 0x4176, 0xa9,0x84, 0xb2,0x98,0x36,0x10,0x27,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0dc38853-c1b0-4176-a984-b298361027af")
IEnumDebugStackFrames64 : public IEnumDebugStackFrames
{
    virtual HRESULT __stdcall Next64(
        ULONG celt,
        DebugStackFrameDescriptor64 *prgdsfd,
        ULONG *pceltFetched) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumDebugStackFrames64, 0x0dc38853, 0xc1b0, 0x4176, 0xa9,0x84, 0xb2,0x98,0x36,0x10,0x27,0xaf)
#endif
#else
typedef struct IEnumDebugStackFrames64Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumDebugStackFrames methods ***/
    HRESULT (__stdcall *Next)(
        IEnumDebugStackFrames64 *This,
        ULONG celt,
        DebugStackFrameDescriptor *prgdsfd,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumDebugStackFrames64 *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumDebugStackFrames64 *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumDebugStackFrames64 *This,
        IEnumDebugStackFrames **ppedsf);

    /*** IEnumDebugStackFrames64 methods ***/
    HRESULT (__stdcall *Next64)(
        IEnumDebugStackFrames64 *This,
        ULONG celt,
        DebugStackFrameDescriptor64 *prgdsfd,
        ULONG *pceltFetched);

    END_INTERFACE
} IEnumDebugStackFrames64Vtbl;

interface IEnumDebugStackFrames64 {
    CONST_VTBL IEnumDebugStackFrames64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumDebugStackFrames64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumDebugStackFrames64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumDebugStackFrames64_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumDebugStackFrames methods ***/
#define IEnumDebugStackFrames64_Next(This,celt,prgdsfd,pceltFetched) (This)->lpVtbl->Next(This,celt,prgdsfd,pceltFetched)
#define IEnumDebugStackFrames64_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumDebugStackFrames64_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumDebugStackFrames64_Clone(This,ppedsf) (This)->lpVtbl->Clone(This,ppedsf)
/*** IEnumDebugStackFrames64 methods ***/
#define IEnumDebugStackFrames64_Next64(This,celt,prgdsfd,pceltFetched) (This)->lpVtbl->Next64(This,celt,prgdsfd,pceltFetched)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumDebugStackFrames64_QueryInterface(IEnumDebugStackFrames64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumDebugStackFrames64_AddRef(IEnumDebugStackFrames64* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumDebugStackFrames64_Release(IEnumDebugStackFrames64* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugStackFrames methods ***/
static FORCEINLINE HRESULT IEnumDebugStackFrames64_Next(IEnumDebugStackFrames64* This,ULONG celt,DebugStackFrameDescriptor *prgdsfd,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,prgdsfd,pceltFetched);
}
static FORCEINLINE HRESULT IEnumDebugStackFrames64_Skip(IEnumDebugStackFrames64* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumDebugStackFrames64_Reset(IEnumDebugStackFrames64* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumDebugStackFrames64_Clone(IEnumDebugStackFrames64* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->Clone(This,ppedsf);
}
/*** IEnumDebugStackFrames64 methods ***/
static FORCEINLINE HRESULT IEnumDebugStackFrames64_Next64(IEnumDebugStackFrames64* This,ULONG celt,DebugStackFrameDescriptor64 *prgdsfd,ULONG *pceltFetched) {
    return This->lpVtbl->Next64(This,celt,prgdsfd,pceltFetched);
}
#endif
#endif

#endif

HRESULT __stdcall IEnumDebugStackFrames64_RemoteNext64_Proxy(
    IEnumDebugStackFrames64* This,
    ULONG celt,
    DebugStackFrameDescriptor64 *prgdsfd,
    ULONG *pceltFetched);
void __RPC_STUB IEnumDebugStackFrames64_RemoteNext64_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumDebugStackFrames64_Next64_Proxy(
    IEnumDebugStackFrames64* This,
    ULONG celt,
    DebugStackFrameDescriptor64 *prgdsfd,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumDebugStackFrames64_Next64_Stub(
    IEnumDebugStackFrames64* This,
    ULONG celt,
    DebugStackFrameDescriptor64 *prgdsfd,
    ULONG *pceltFetched);

#endif  /* __IEnumDebugStackFrames64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentInfo interface
 */
#ifndef __IDebugDocumentInfo_INTERFACE_DEFINED__
#define __IDebugDocumentInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentInfo, 0x51973c1f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c1f-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocumentInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetName(
        DOCUMENTNAMETYPE dnt,
        BSTR *pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocumentClassId(
        CLSID *pclsidDocument) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentInfo, 0x51973c1f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugDocumentInfo *This,
        DOCUMENTNAMETYPE dnt,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
        IDebugDocumentInfo *This,
        CLSID *pclsidDocument);

    END_INTERFACE
} IDebugDocumentInfoVtbl;

interface IDebugDocumentInfo {
    CONST_VTBL IDebugDocumentInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentInfo methods ***/
#define IDebugDocumentInfo_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
#define IDebugDocumentInfo_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentInfo_QueryInterface(IDebugDocumentInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentInfo_AddRef(IDebugDocumentInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentInfo_Release(IDebugDocumentInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static FORCEINLINE HRESULT IDebugDocumentInfo_GetName(IDebugDocumentInfo* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static FORCEINLINE HRESULT IDebugDocumentInfo_GetDocumentClassId(IDebugDocumentInfo* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentProvider interface
 */
#ifndef __IDebugDocumentProvider_INTERFACE_DEFINED__
#define __IDebugDocumentProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentProvider, 0x51973c20, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c20-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocumentProvider : public IDebugDocumentInfo
{
    virtual HRESULT STDMETHODCALLTYPE GetDocument(
        IDebugDocument **ppssd) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentProvider, 0x51973c20, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugDocumentProvider *This,
        DOCUMENTNAMETYPE dnt,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
        IDebugDocumentProvider *This,
        CLSID *pclsidDocument);

    /*** IDebugDocumentProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocument)(
        IDebugDocumentProvider *This,
        IDebugDocument **ppssd);

    END_INTERFACE
} IDebugDocumentProviderVtbl;

interface IDebugDocumentProvider {
    CONST_VTBL IDebugDocumentProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentInfo methods ***/
#define IDebugDocumentProvider_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
#define IDebugDocumentProvider_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
/*** IDebugDocumentProvider methods ***/
#define IDebugDocumentProvider_GetDocument(This,ppssd) (This)->lpVtbl->GetDocument(This,ppssd)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentProvider_QueryInterface(IDebugDocumentProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentProvider_AddRef(IDebugDocumentProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentProvider_Release(IDebugDocumentProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static FORCEINLINE HRESULT IDebugDocumentProvider_GetName(IDebugDocumentProvider* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static FORCEINLINE HRESULT IDebugDocumentProvider_GetDocumentClassId(IDebugDocumentProvider* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
/*** IDebugDocumentProvider methods ***/
static FORCEINLINE HRESULT IDebugDocumentProvider_GetDocument(IDebugDocumentProvider* This,IDebugDocument **ppssd) {
    return This->lpVtbl->GetDocument(This,ppssd);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocument interface
 */
#ifndef __IDebugDocument_INTERFACE_DEFINED__
#define __IDebugDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocument, 0x51973c21, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c21-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocument : public IDebugDocumentInfo
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocument, 0x51973c21, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugDocument *This,
        DOCUMENTNAMETYPE dnt,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
        IDebugDocument *This,
        CLSID *pclsidDocument);

    END_INTERFACE
} IDebugDocumentVtbl;

interface IDebugDocument {
    CONST_VTBL IDebugDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentInfo methods ***/
#define IDebugDocument_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
#define IDebugDocument_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocument_QueryInterface(IDebugDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocument_AddRef(IDebugDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocument_Release(IDebugDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static FORCEINLINE HRESULT IDebugDocument_GetName(IDebugDocument* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static FORCEINLINE HRESULT IDebugDocument_GetDocumentClassId(IDebugDocument* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
#endif
#endif

#endif


#endif  /* __IDebugDocument_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentText interface
 */
#ifndef __IDebugDocumentText_INTERFACE_DEFINED__
#define __IDebugDocumentText_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentText, 0x51973c22, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c22-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocumentText : public IDebugDocument
{
    virtual HRESULT STDMETHODCALLTYPE GetDocumentAttributes(
        TEXT_DOC_ATTR *ptextdocattr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSize(
        ULONG *pcNumLines,
        ULONG *pcNumChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPositionOfLine(
        ULONG cLineNumber,
        ULONG *pcCharacterPosition) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLineOfPosition(
        ULONG cCharacterPosition,
        ULONG *pcLineNumber,
        ULONG *pcCharacterOffsetInLine) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetText(
        ULONG cCharacterPosition,
        WCHAR *pcharText,
        SOURCE_TEXT_ATTR *pstaTextAttr,
        ULONG *pcNumChars,
        ULONG cMaxChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPositionOfContext(
        IDebugDocumentContext *psc,
        ULONG *pcCharacterPosition,
        ULONG *cNumChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContextOfPosition(
        ULONG cCharacterPosition,
        ULONG cNumChars,
        IDebugDocumentContext **ppsc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentText, 0x51973c22, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentTextVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugDocumentText *This,
        DOCUMENTNAMETYPE dnt,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
        IDebugDocumentText *This,
        CLSID *pclsidDocument);

    /*** IDebugDocumentText methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocumentAttributes)(
        IDebugDocumentText *This,
        TEXT_DOC_ATTR *ptextdocattr);

    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IDebugDocumentText *This,
        ULONG *pcNumLines,
        ULONG *pcNumChars);

    HRESULT (STDMETHODCALLTYPE *GetPositionOfLine)(
        IDebugDocumentText *This,
        ULONG cLineNumber,
        ULONG *pcCharacterPosition);

    HRESULT (STDMETHODCALLTYPE *GetLineOfPosition)(
        IDebugDocumentText *This,
        ULONG cCharacterPosition,
        ULONG *pcLineNumber,
        ULONG *pcCharacterOffsetInLine);

    HRESULT (STDMETHODCALLTYPE *GetText)(
        IDebugDocumentText *This,
        ULONG cCharacterPosition,
        WCHAR *pcharText,
        SOURCE_TEXT_ATTR *pstaTextAttr,
        ULONG *pcNumChars,
        ULONG cMaxChars);

    HRESULT (STDMETHODCALLTYPE *GetPositionOfContext)(
        IDebugDocumentText *This,
        IDebugDocumentContext *psc,
        ULONG *pcCharacterPosition,
        ULONG *cNumChars);

    HRESULT (STDMETHODCALLTYPE *GetContextOfPosition)(
        IDebugDocumentText *This,
        ULONG cCharacterPosition,
        ULONG cNumChars,
        IDebugDocumentContext **ppsc);

    END_INTERFACE
} IDebugDocumentTextVtbl;

interface IDebugDocumentText {
    CONST_VTBL IDebugDocumentTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentText_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentInfo methods ***/
#define IDebugDocumentText_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
#define IDebugDocumentText_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
/*** IDebugDocumentText methods ***/
#define IDebugDocumentText_GetDocumentAttributes(This,ptextdocattr) (This)->lpVtbl->GetDocumentAttributes(This,ptextdocattr)
#define IDebugDocumentText_GetSize(This,pcNumLines,pcNumChars) (This)->lpVtbl->GetSize(This,pcNumLines,pcNumChars)
#define IDebugDocumentText_GetPositionOfLine(This,cLineNumber,pcCharacterPosition) (This)->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition)
#define IDebugDocumentText_GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine) (This)->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine)
#define IDebugDocumentText_GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars) (This)->lpVtbl->GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars)
#define IDebugDocumentText_GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars) (This)->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars)
#define IDebugDocumentText_GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc) (This)->lpVtbl->GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentText_QueryInterface(IDebugDocumentText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentText_AddRef(IDebugDocumentText* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentText_Release(IDebugDocumentText* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static FORCEINLINE HRESULT IDebugDocumentText_GetName(IDebugDocumentText* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static FORCEINLINE HRESULT IDebugDocumentText_GetDocumentClassId(IDebugDocumentText* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
/*** IDebugDocumentText methods ***/
static FORCEINLINE HRESULT IDebugDocumentText_GetDocumentAttributes(IDebugDocumentText* This,TEXT_DOC_ATTR *ptextdocattr) {
    return This->lpVtbl->GetDocumentAttributes(This,ptextdocattr);
}
static FORCEINLINE HRESULT IDebugDocumentText_GetSize(IDebugDocumentText* This,ULONG *pcNumLines,ULONG *pcNumChars) {
    return This->lpVtbl->GetSize(This,pcNumLines,pcNumChars);
}
static FORCEINLINE HRESULT IDebugDocumentText_GetPositionOfLine(IDebugDocumentText* This,ULONG cLineNumber,ULONG *pcCharacterPosition) {
    return This->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition);
}
static FORCEINLINE HRESULT IDebugDocumentText_GetLineOfPosition(IDebugDocumentText* This,ULONG cCharacterPosition,ULONG *pcLineNumber,ULONG *pcCharacterOffsetInLine) {
    return This->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine);
}
static FORCEINLINE HRESULT IDebugDocumentText_GetText(IDebugDocumentText* This,ULONG cCharacterPosition,WCHAR *pcharText,SOURCE_TEXT_ATTR *pstaTextAttr,ULONG *pcNumChars,ULONG cMaxChars) {
    return This->lpVtbl->GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars);
}
static FORCEINLINE HRESULT IDebugDocumentText_GetPositionOfContext(IDebugDocumentText* This,IDebugDocumentContext *psc,ULONG *pcCharacterPosition,ULONG *cNumChars) {
    return This->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars);
}
static FORCEINLINE HRESULT IDebugDocumentText_GetContextOfPosition(IDebugDocumentText* This,ULONG cCharacterPosition,ULONG cNumChars,IDebugDocumentContext **ppsc) {
    return This->lpVtbl->GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentText_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentTextEvents interface
 */
#ifndef __IDebugDocumentTextEvents_INTERFACE_DEFINED__
#define __IDebugDocumentTextEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentTextEvents, 0x51973c23, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c23-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocumentTextEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE onDestroy(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE onInsertText(
        ULONG cCharacterPosition,
        ULONG cNumToInsert) = 0;

    virtual HRESULT STDMETHODCALLTYPE onRemoveText(
        ULONG cCharacterPosition,
        ULONG cNumToRemove) = 0;

    virtual HRESULT STDMETHODCALLTYPE onReplaceText(
        ULONG cCharacterPosition,
        ULONG cNumToReplace) = 0;

    virtual HRESULT STDMETHODCALLTYPE onUpdateTextAttributes(
        ULONG cCharacterPosition,
        ULONG cNumToUpdate) = 0;

    virtual HRESULT STDMETHODCALLTYPE onUpdateDocumentAttributes(
        TEXT_DOC_ATTR textdocattr) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentTextEvents, 0x51973c23, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentTextEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentTextEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *onDestroy)(
        IDebugDocumentTextEvents *This);

    HRESULT (STDMETHODCALLTYPE *onInsertText)(
        IDebugDocumentTextEvents *This,
        ULONG cCharacterPosition,
        ULONG cNumToInsert);

    HRESULT (STDMETHODCALLTYPE *onRemoveText)(
        IDebugDocumentTextEvents *This,
        ULONG cCharacterPosition,
        ULONG cNumToRemove);

    HRESULT (STDMETHODCALLTYPE *onReplaceText)(
        IDebugDocumentTextEvents *This,
        ULONG cCharacterPosition,
        ULONG cNumToReplace);

    HRESULT (STDMETHODCALLTYPE *onUpdateTextAttributes)(
        IDebugDocumentTextEvents *This,
        ULONG cCharacterPosition,
        ULONG cNumToUpdate);

    HRESULT (STDMETHODCALLTYPE *onUpdateDocumentAttributes)(
        IDebugDocumentTextEvents *This,
        TEXT_DOC_ATTR textdocattr);

    END_INTERFACE
} IDebugDocumentTextEventsVtbl;

interface IDebugDocumentTextEvents {
    CONST_VTBL IDebugDocumentTextEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentTextEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentTextEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentTextEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentTextEvents methods ***/
#define IDebugDocumentTextEvents_onDestroy(This) (This)->lpVtbl->onDestroy(This)
#define IDebugDocumentTextEvents_onInsertText(This,cCharacterPosition,cNumToInsert) (This)->lpVtbl->onInsertText(This,cCharacterPosition,cNumToInsert)
#define IDebugDocumentTextEvents_onRemoveText(This,cCharacterPosition,cNumToRemove) (This)->lpVtbl->onRemoveText(This,cCharacterPosition,cNumToRemove)
#define IDebugDocumentTextEvents_onReplaceText(This,cCharacterPosition,cNumToReplace) (This)->lpVtbl->onReplaceText(This,cCharacterPosition,cNumToReplace)
#define IDebugDocumentTextEvents_onUpdateTextAttributes(This,cCharacterPosition,cNumToUpdate) (This)->lpVtbl->onUpdateTextAttributes(This,cCharacterPosition,cNumToUpdate)
#define IDebugDocumentTextEvents_onUpdateDocumentAttributes(This,textdocattr) (This)->lpVtbl->onUpdateDocumentAttributes(This,textdocattr)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentTextEvents_QueryInterface(IDebugDocumentTextEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentTextEvents_AddRef(IDebugDocumentTextEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentTextEvents_Release(IDebugDocumentTextEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentTextEvents methods ***/
static FORCEINLINE HRESULT IDebugDocumentTextEvents_onDestroy(IDebugDocumentTextEvents* This) {
    return This->lpVtbl->onDestroy(This);
}
static FORCEINLINE HRESULT IDebugDocumentTextEvents_onInsertText(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToInsert) {
    return This->lpVtbl->onInsertText(This,cCharacterPosition,cNumToInsert);
}
static FORCEINLINE HRESULT IDebugDocumentTextEvents_onRemoveText(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToRemove) {
    return This->lpVtbl->onRemoveText(This,cCharacterPosition,cNumToRemove);
}
static FORCEINLINE HRESULT IDebugDocumentTextEvents_onReplaceText(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToReplace) {
    return This->lpVtbl->onReplaceText(This,cCharacterPosition,cNumToReplace);
}
static FORCEINLINE HRESULT IDebugDocumentTextEvents_onUpdateTextAttributes(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToUpdate) {
    return This->lpVtbl->onUpdateTextAttributes(This,cCharacterPosition,cNumToUpdate);
}
static FORCEINLINE HRESULT IDebugDocumentTextEvents_onUpdateDocumentAttributes(IDebugDocumentTextEvents* This,TEXT_DOC_ATTR textdocattr) {
    return This->lpVtbl->onUpdateDocumentAttributes(This,textdocattr);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentTextEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentTextAuthor interface
 */
#ifndef __IDebugDocumentTextAuthor_INTERFACE_DEFINED__
#define __IDebugDocumentTextAuthor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentTextAuthor, 0x51973c24, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c24-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocumentTextAuthor : public IDebugDocumentText
{
    virtual HRESULT STDMETHODCALLTYPE InsertText(
        ULONG cCharacterPosition,
        ULONG cNumToInsert,
        OLECHAR pcharText[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveText(
        ULONG cCharacterPosition,
        ULONG cNumToRemove) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReplaceText(
        ULONG cCharacterPosition,
        ULONG cNumToReplace,
        OLECHAR pcharText[]) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentTextAuthor, 0x51973c24, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentTextAuthorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugDocumentTextAuthor *This,
        DOCUMENTNAMETYPE dnt,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
        IDebugDocumentTextAuthor *This,
        CLSID *pclsidDocument);

    /*** IDebugDocumentText methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocumentAttributes)(
        IDebugDocumentTextAuthor *This,
        TEXT_DOC_ATTR *ptextdocattr);

    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IDebugDocumentTextAuthor *This,
        ULONG *pcNumLines,
        ULONG *pcNumChars);

    HRESULT (STDMETHODCALLTYPE *GetPositionOfLine)(
        IDebugDocumentTextAuthor *This,
        ULONG cLineNumber,
        ULONG *pcCharacterPosition);

    HRESULT (STDMETHODCALLTYPE *GetLineOfPosition)(
        IDebugDocumentTextAuthor *This,
        ULONG cCharacterPosition,
        ULONG *pcLineNumber,
        ULONG *pcCharacterOffsetInLine);

    HRESULT (STDMETHODCALLTYPE *GetText)(
        IDebugDocumentTextAuthor *This,
        ULONG cCharacterPosition,
        WCHAR *pcharText,
        SOURCE_TEXT_ATTR *pstaTextAttr,
        ULONG *pcNumChars,
        ULONG cMaxChars);

    HRESULT (STDMETHODCALLTYPE *GetPositionOfContext)(
        IDebugDocumentTextAuthor *This,
        IDebugDocumentContext *psc,
        ULONG *pcCharacterPosition,
        ULONG *cNumChars);

    HRESULT (STDMETHODCALLTYPE *GetContextOfPosition)(
        IDebugDocumentTextAuthor *This,
        ULONG cCharacterPosition,
        ULONG cNumChars,
        IDebugDocumentContext **ppsc);

    /*** IDebugDocumentTextAuthor methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertText)(
        IDebugDocumentTextAuthor *This,
        ULONG cCharacterPosition,
        ULONG cNumToInsert,
        OLECHAR pcharText[]);

    HRESULT (STDMETHODCALLTYPE *RemoveText)(
        IDebugDocumentTextAuthor *This,
        ULONG cCharacterPosition,
        ULONG cNumToRemove);

    HRESULT (STDMETHODCALLTYPE *ReplaceText)(
        IDebugDocumentTextAuthor *This,
        ULONG cCharacterPosition,
        ULONG cNumToReplace,
        OLECHAR pcharText[]);

    END_INTERFACE
} IDebugDocumentTextAuthorVtbl;

interface IDebugDocumentTextAuthor {
    CONST_VTBL IDebugDocumentTextAuthorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentTextAuthor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentTextAuthor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentTextAuthor_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentInfo methods ***/
#define IDebugDocumentTextAuthor_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
#define IDebugDocumentTextAuthor_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
/*** IDebugDocumentText methods ***/
#define IDebugDocumentTextAuthor_GetDocumentAttributes(This,ptextdocattr) (This)->lpVtbl->GetDocumentAttributes(This,ptextdocattr)
#define IDebugDocumentTextAuthor_GetSize(This,pcNumLines,pcNumChars) (This)->lpVtbl->GetSize(This,pcNumLines,pcNumChars)
#define IDebugDocumentTextAuthor_GetPositionOfLine(This,cLineNumber,pcCharacterPosition) (This)->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition)
#define IDebugDocumentTextAuthor_GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine) (This)->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine)
#define IDebugDocumentTextAuthor_GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars) (This)->lpVtbl->GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars)
#define IDebugDocumentTextAuthor_GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars) (This)->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars)
#define IDebugDocumentTextAuthor_GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc) (This)->lpVtbl->GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc)
/*** IDebugDocumentTextAuthor methods ***/
#define IDebugDocumentTextAuthor_InsertText(This,cCharacterPosition,cNumToInsert,pcharText) (This)->lpVtbl->InsertText(This,cCharacterPosition,cNumToInsert,pcharText)
#define IDebugDocumentTextAuthor_RemoveText(This,cCharacterPosition,cNumToRemove) (This)->lpVtbl->RemoveText(This,cCharacterPosition,cNumToRemove)
#define IDebugDocumentTextAuthor_ReplaceText(This,cCharacterPosition,cNumToReplace,pcharText) (This)->lpVtbl->ReplaceText(This,cCharacterPosition,cNumToReplace,pcharText)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_QueryInterface(IDebugDocumentTextAuthor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentTextAuthor_AddRef(IDebugDocumentTextAuthor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentTextAuthor_Release(IDebugDocumentTextAuthor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetName(IDebugDocumentTextAuthor* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetDocumentClassId(IDebugDocumentTextAuthor* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
/*** IDebugDocumentText methods ***/
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetDocumentAttributes(IDebugDocumentTextAuthor* This,TEXT_DOC_ATTR *ptextdocattr) {
    return This->lpVtbl->GetDocumentAttributes(This,ptextdocattr);
}
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetSize(IDebugDocumentTextAuthor* This,ULONG *pcNumLines,ULONG *pcNumChars) {
    return This->lpVtbl->GetSize(This,pcNumLines,pcNumChars);
}
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetPositionOfLine(IDebugDocumentTextAuthor* This,ULONG cLineNumber,ULONG *pcCharacterPosition) {
    return This->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition);
}
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetLineOfPosition(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG *pcLineNumber,ULONG *pcCharacterOffsetInLine) {
    return This->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine);
}
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,WCHAR *pcharText,SOURCE_TEXT_ATTR *pstaTextAttr,ULONG *pcNumChars,ULONG cMaxChars) {
    return This->lpVtbl->GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars);
}
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetPositionOfContext(IDebugDocumentTextAuthor* This,IDebugDocumentContext *psc,ULONG *pcCharacterPosition,ULONG *cNumChars) {
    return This->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars);
}
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetContextOfPosition(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumChars,IDebugDocumentContext **ppsc) {
    return This->lpVtbl->GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc);
}
/*** IDebugDocumentTextAuthor methods ***/
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_InsertText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumToInsert,OLECHAR pcharText[]) {
    return This->lpVtbl->InsertText(This,cCharacterPosition,cNumToInsert,pcharText);
}
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_RemoveText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumToRemove) {
    return This->lpVtbl->RemoveText(This,cCharacterPosition,cNumToRemove);
}
static FORCEINLINE HRESULT IDebugDocumentTextAuthor_ReplaceText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumToReplace,OLECHAR pcharText[]) {
    return This->lpVtbl->ReplaceText(This,cCharacterPosition,cNumToReplace,pcharText);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentTextAuthor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentTextExternalAuthor interface
 */
#ifndef __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__
#define __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentTextExternalAuthor, 0x51973c25, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c25-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocumentTextExternalAuthor : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPathName(
        BSTR *pbstrLongName,
        WINBOOL *pfIsOriginalFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileName(
        BSTR *pbstrShortName) = 0;

    virtual HRESULT STDMETHODCALLTYPE NotifyChanged(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentTextExternalAuthor, 0x51973c25, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentTextExternalAuthorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentTextExternalAuthor methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPathName)(
        IDebugDocumentTextExternalAuthor *This,
        BSTR *pbstrLongName,
        WINBOOL *pfIsOriginalFile);

    HRESULT (STDMETHODCALLTYPE *GetFileName)(
        IDebugDocumentTextExternalAuthor *This,
        BSTR *pbstrShortName);

    HRESULT (STDMETHODCALLTYPE *NotifyChanged)(
        IDebugDocumentTextExternalAuthor *This);

    END_INTERFACE
} IDebugDocumentTextExternalAuthorVtbl;

interface IDebugDocumentTextExternalAuthor {
    CONST_VTBL IDebugDocumentTextExternalAuthorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentTextExternalAuthor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentTextExternalAuthor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentTextExternalAuthor_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentTextExternalAuthor methods ***/
#define IDebugDocumentTextExternalAuthor_GetPathName(This,pbstrLongName,pfIsOriginalFile) (This)->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile)
#define IDebugDocumentTextExternalAuthor_GetFileName(This,pbstrShortName) (This)->lpVtbl->GetFileName(This,pbstrShortName)
#define IDebugDocumentTextExternalAuthor_NotifyChanged(This) (This)->lpVtbl->NotifyChanged(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentTextExternalAuthor_QueryInterface(IDebugDocumentTextExternalAuthor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentTextExternalAuthor_AddRef(IDebugDocumentTextExternalAuthor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentTextExternalAuthor_Release(IDebugDocumentTextExternalAuthor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentTextExternalAuthor methods ***/
static FORCEINLINE HRESULT IDebugDocumentTextExternalAuthor_GetPathName(IDebugDocumentTextExternalAuthor* This,BSTR *pbstrLongName,WINBOOL *pfIsOriginalFile) {
    return This->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile);
}
static FORCEINLINE HRESULT IDebugDocumentTextExternalAuthor_GetFileName(IDebugDocumentTextExternalAuthor* This,BSTR *pbstrShortName) {
    return This->lpVtbl->GetFileName(This,pbstrShortName);
}
static FORCEINLINE HRESULT IDebugDocumentTextExternalAuthor_NotifyChanged(IDebugDocumentTextExternalAuthor* This) {
    return This->lpVtbl->NotifyChanged(This);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentHelper32 interface
 */
#ifndef __IDebugDocumentHelper32_INTERFACE_DEFINED__
#define __IDebugDocumentHelper32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentHelper32, 0x51973c26, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c26-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocumentHelper32 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Init(
        IDebugApplication32 *pda,
        LPCOLESTR pszShortName,
        LPCOLESTR pszLongName,
        TEXT_DOC_ATTR docAttr) = 0;

    virtual HRESULT STDMETHODCALLTYPE Attach(
        IDebugDocumentHelper32 *pddhParent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Detach(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddUnicodeText(
        LPCOLESTR pszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDBCSText(
        LPCSTR pszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDebugDocumentHost(
        IDebugDocumentHost *pddh) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDeferredText(
        ULONG cChars,
        DWORD dwTextStartCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE DefineScriptBlock(
        ULONG ulCharOffset,
        ULONG cChars,
        IActiveScript *pas,
        WINBOOL fScriptlet,
        DWORD *pdwSourceContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultTextAttr(
        SOURCE_TEXT_ATTR staTextAttr) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTextAttributes(
        ULONG ulCharOffset,
        ULONG cChars,
        SOURCE_TEXT_ATTR *pstaTextAttr) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLongName(
        LPCOLESTR pszLongName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetShortName(
        LPCOLESTR pszShortName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDocumentAttr(
        TEXT_DOC_ATTR pszAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDebugApplicationNode(
        IDebugApplicationNode **ppdan) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptBlockInfo(
        DWORD dwSourceContext,
        IActiveScript **ppasd,
        ULONG *piCharPos,
        ULONG *pcChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentContext(
        ULONG iCharPos,
        ULONG cChars,
        IDebugDocumentContext **ppddc) = 0;

    virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop(
        IDebugDocumentContext *pddc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentHelper32, 0x51973c26, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentHelper32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentHelper32 methods ***/
    HRESULT (STDMETHODCALLTYPE *Init)(
        IDebugDocumentHelper32 *This,
        IDebugApplication32 *pda,
        LPCOLESTR pszShortName,
        LPCOLESTR pszLongName,
        TEXT_DOC_ATTR docAttr);

    HRESULT (STDMETHODCALLTYPE *Attach)(
        IDebugDocumentHelper32 *This,
        IDebugDocumentHelper32 *pddhParent);

    HRESULT (STDMETHODCALLTYPE *Detach)(
        IDebugDocumentHelper32 *This);

    HRESULT (STDMETHODCALLTYPE *AddUnicodeText)(
        IDebugDocumentHelper32 *This,
        LPCOLESTR pszText);

    HRESULT (STDMETHODCALLTYPE *AddDBCSText)(
        IDebugDocumentHelper32 *This,
        LPCSTR pszText);

    HRESULT (STDMETHODCALLTYPE *SetDebugDocumentHost)(
        IDebugDocumentHelper32 *This,
        IDebugDocumentHost *pddh);

    HRESULT (STDMETHODCALLTYPE *AddDeferredText)(
        IDebugDocumentHelper32 *This,
        ULONG cChars,
        DWORD dwTextStartCookie);

    HRESULT (STDMETHODCALLTYPE *DefineScriptBlock)(
        IDebugDocumentHelper32 *This,
        ULONG ulCharOffset,
        ULONG cChars,
        IActiveScript *pas,
        WINBOOL fScriptlet,
        DWORD *pdwSourceContext);

    HRESULT (STDMETHODCALLTYPE *SetDefaultTextAttr)(
        IDebugDocumentHelper32 *This,
        SOURCE_TEXT_ATTR staTextAttr);

    HRESULT (STDMETHODCALLTYPE *SetTextAttributes)(
        IDebugDocumentHelper32 *This,
        ULONG ulCharOffset,
        ULONG cChars,
        SOURCE_TEXT_ATTR *pstaTextAttr);

    HRESULT (STDMETHODCALLTYPE *SetLongName)(
        IDebugDocumentHelper32 *This,
        LPCOLESTR pszLongName);

    HRESULT (STDMETHODCALLTYPE *SetShortName)(
        IDebugDocumentHelper32 *This,
        LPCOLESTR pszShortName);

    HRESULT (STDMETHODCALLTYPE *SetDocumentAttr)(
        IDebugDocumentHelper32 *This,
        TEXT_DOC_ATTR pszAttributes);

    HRESULT (STDMETHODCALLTYPE *GetDebugApplicationNode)(
        IDebugDocumentHelper32 *This,
        IDebugApplicationNode **ppdan);

    HRESULT (STDMETHODCALLTYPE *GetScriptBlockInfo)(
        IDebugDocumentHelper32 *This,
        DWORD dwSourceContext,
        IActiveScript **ppasd,
        ULONG *piCharPos,
        ULONG *pcChars);

    HRESULT (STDMETHODCALLTYPE *CreateDebugDocumentContext)(
        IDebugDocumentHelper32 *This,
        ULONG iCharPos,
        ULONG cChars,
        IDebugDocumentContext **ppddc);

    HRESULT (STDMETHODCALLTYPE *BringDocumentToTop)(
        IDebugDocumentHelper32 *This);

    HRESULT (STDMETHODCALLTYPE *BringDocumentContextToTop)(
        IDebugDocumentHelper32 *This,
        IDebugDocumentContext *pddc);

    END_INTERFACE
} IDebugDocumentHelper32Vtbl;

interface IDebugDocumentHelper32 {
    CONST_VTBL IDebugDocumentHelper32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentHelper32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentHelper32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentHelper32_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentHelper32 methods ***/
#define IDebugDocumentHelper32_Init(This,pda,pszShortName,pszLongName,docAttr) (This)->lpVtbl->Init(This,pda,pszShortName,pszLongName,docAttr)
#define IDebugDocumentHelper32_Attach(This,pddhParent) (This)->lpVtbl->Attach(This,pddhParent)
#define IDebugDocumentHelper32_Detach(This) (This)->lpVtbl->Detach(This)
#define IDebugDocumentHelper32_AddUnicodeText(This,pszText) (This)->lpVtbl->AddUnicodeText(This,pszText)
#define IDebugDocumentHelper32_AddDBCSText(This,pszText) (This)->lpVtbl->AddDBCSText(This,pszText)
#define IDebugDocumentHelper32_SetDebugDocumentHost(This,pddh) (This)->lpVtbl->SetDebugDocumentHost(This,pddh)
#define IDebugDocumentHelper32_AddDeferredText(This,cChars,dwTextStartCookie) (This)->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie)
#define IDebugDocumentHelper32_DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext) (This)->lpVtbl->DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext)
#define IDebugDocumentHelper32_SetDefaultTextAttr(This,staTextAttr) (This)->lpVtbl->SetDefaultTextAttr(This,staTextAttr)
#define IDebugDocumentHelper32_SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr) (This)->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr)
#define IDebugDocumentHelper32_SetLongName(This,pszLongName) (This)->lpVtbl->SetLongName(This,pszLongName)
#define IDebugDocumentHelper32_SetShortName(This,pszShortName) (This)->lpVtbl->SetShortName(This,pszShortName)
#define IDebugDocumentHelper32_SetDocumentAttr(This,pszAttributes) (This)->lpVtbl->SetDocumentAttr(This,pszAttributes)
#define IDebugDocumentHelper32_GetDebugApplicationNode(This,ppdan) (This)->lpVtbl->GetDebugApplicationNode(This,ppdan)
#define IDebugDocumentHelper32_GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars) (This)->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars)
#define IDebugDocumentHelper32_CreateDebugDocumentContext(This,iCharPos,cChars,ppddc) (This)->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc)
#define IDebugDocumentHelper32_BringDocumentToTop(This) (This)->lpVtbl->BringDocumentToTop(This)
#define IDebugDocumentHelper32_BringDocumentContextToTop(This,pddc) (This)->lpVtbl->BringDocumentContextToTop(This,pddc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentHelper32_QueryInterface(IDebugDocumentHelper32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentHelper32_AddRef(IDebugDocumentHelper32* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentHelper32_Release(IDebugDocumentHelper32* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentHelper32 methods ***/
static FORCEINLINE HRESULT IDebugDocumentHelper32_Init(IDebugDocumentHelper32* This,IDebugApplication32 *pda,LPCOLESTR pszShortName,LPCOLESTR pszLongName,TEXT_DOC_ATTR docAttr) {
    return This->lpVtbl->Init(This,pda,pszShortName,pszLongName,docAttr);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_Attach(IDebugDocumentHelper32* This,IDebugDocumentHelper32 *pddhParent) {
    return This->lpVtbl->Attach(This,pddhParent);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_Detach(IDebugDocumentHelper32* This) {
    return This->lpVtbl->Detach(This);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_AddUnicodeText(IDebugDocumentHelper32* This,LPCOLESTR pszText) {
    return This->lpVtbl->AddUnicodeText(This,pszText);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_AddDBCSText(IDebugDocumentHelper32* This,LPCSTR pszText) {
    return This->lpVtbl->AddDBCSText(This,pszText);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_SetDebugDocumentHost(IDebugDocumentHelper32* This,IDebugDocumentHost *pddh) {
    return This->lpVtbl->SetDebugDocumentHost(This,pddh);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_AddDeferredText(IDebugDocumentHelper32* This,ULONG cChars,DWORD dwTextStartCookie) {
    return This->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_DefineScriptBlock(IDebugDocumentHelper32* This,ULONG ulCharOffset,ULONG cChars,IActiveScript *pas,WINBOOL fScriptlet,DWORD *pdwSourceContext) {
    return This->lpVtbl->DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_SetDefaultTextAttr(IDebugDocumentHelper32* This,SOURCE_TEXT_ATTR staTextAttr) {
    return This->lpVtbl->SetDefaultTextAttr(This,staTextAttr);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_SetTextAttributes(IDebugDocumentHelper32* This,ULONG ulCharOffset,ULONG cChars,SOURCE_TEXT_ATTR *pstaTextAttr) {
    return This->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_SetLongName(IDebugDocumentHelper32* This,LPCOLESTR pszLongName) {
    return This->lpVtbl->SetLongName(This,pszLongName);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_SetShortName(IDebugDocumentHelper32* This,LPCOLESTR pszShortName) {
    return This->lpVtbl->SetShortName(This,pszShortName);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_SetDocumentAttr(IDebugDocumentHelper32* This,TEXT_DOC_ATTR pszAttributes) {
    return This->lpVtbl->SetDocumentAttr(This,pszAttributes);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_GetDebugApplicationNode(IDebugDocumentHelper32* This,IDebugApplicationNode **ppdan) {
    return This->lpVtbl->GetDebugApplicationNode(This,ppdan);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_GetScriptBlockInfo(IDebugDocumentHelper32* This,DWORD dwSourceContext,IActiveScript **ppasd,ULONG *piCharPos,ULONG *pcChars) {
    return This->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_CreateDebugDocumentContext(IDebugDocumentHelper32* This,ULONG iCharPos,ULONG cChars,IDebugDocumentContext **ppddc) {
    return This->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_BringDocumentToTop(IDebugDocumentHelper32* This) {
    return This->lpVtbl->BringDocumentToTop(This);
}
static FORCEINLINE HRESULT IDebugDocumentHelper32_BringDocumentContextToTop(IDebugDocumentHelper32* This,IDebugDocumentContext *pddc) {
    return This->lpVtbl->BringDocumentContextToTop(This,pddc);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentHelper32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentHelper64 interface
 */
#ifndef __IDebugDocumentHelper64_INTERFACE_DEFINED__
#define __IDebugDocumentHelper64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentHelper64, 0xc4c7363c, 0x20fd, 0x47f9, 0xbd,0x82, 0x48,0x55,0xe0,0x15,0x08,0x71);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c4c7363c-20fd-47f9-bd82-4855e0150871")
IDebugDocumentHelper64 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Init(
        IDebugApplication64 *pda,
        LPCOLESTR pszShortName,
        LPCOLESTR pszLongName,
        TEXT_DOC_ATTR docAttr) = 0;

    virtual HRESULT STDMETHODCALLTYPE Attach(
        IDebugDocumentHelper64 *pddhParent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Detach(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddUnicodeText(
        LPCOLESTR pszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDBCSText(
        LPCSTR pszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDebugDocumentHost(
        IDebugDocumentHost *pddh) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDeferredText(
        ULONG cChars,
        DWORD dwTextStartCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE DefineScriptBlock(
        ULONG ulCharOffset,
        ULONG cChars,
        IActiveScript *pas,
        WINBOOL fScriptlet,
        DWORDLONG *pdwSourceContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultTextAttr(
        SOURCE_TEXT_ATTR staTextAttr) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTextAttributes(
        ULONG ulCharOffset,
        ULONG cChars,
        SOURCE_TEXT_ATTR *pstaTextAttr) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLongName(
        LPCOLESTR pszLongName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetShortName(
        LPCOLESTR pszShortName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDocumentAttr(
        TEXT_DOC_ATTR pszAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDebugApplicationNode(
        IDebugApplicationNode **ppdan) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptBlockInfo(
        DWORDLONG dwSourceContext,
        IActiveScript **ppasd,
        ULONG *piCharPos,
        ULONG *pcChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentContext(
        ULONG iCharPos,
        ULONG cChars,
        IDebugDocumentContext **ppddc) = 0;

    virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop(
        IDebugDocumentContext *pddc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentHelper64, 0xc4c7363c, 0x20fd, 0x47f9, 0xbd,0x82, 0x48,0x55,0xe0,0x15,0x08,0x71)
#endif
#else
typedef struct IDebugDocumentHelper64Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentHelper64 methods ***/
    HRESULT (STDMETHODCALLTYPE *Init)(
        IDebugDocumentHelper64 *This,
        IDebugApplication64 *pda,
        LPCOLESTR pszShortName,
        LPCOLESTR pszLongName,
        TEXT_DOC_ATTR docAttr);

    HRESULT (STDMETHODCALLTYPE *Attach)(
        IDebugDocumentHelper64 *This,
        IDebugDocumentHelper64 *pddhParent);

    HRESULT (STDMETHODCALLTYPE *Detach)(
        IDebugDocumentHelper64 *This);

    HRESULT (STDMETHODCALLTYPE *AddUnicodeText)(
        IDebugDocumentHelper64 *This,
        LPCOLESTR pszText);

    HRESULT (STDMETHODCALLTYPE *AddDBCSText)(
        IDebugDocumentHelper64 *This,
        LPCSTR pszText);

    HRESULT (STDMETHODCALLTYPE *SetDebugDocumentHost)(
        IDebugDocumentHelper64 *This,
        IDebugDocumentHost *pddh);

    HRESULT (STDMETHODCALLTYPE *AddDeferredText)(
        IDebugDocumentHelper64 *This,
        ULONG cChars,
        DWORD dwTextStartCookie);

    HRESULT (STDMETHODCALLTYPE *DefineScriptBlock)(
        IDebugDocumentHelper64 *This,
        ULONG ulCharOffset,
        ULONG cChars,
        IActiveScript *pas,
        WINBOOL fScriptlet,
        DWORDLONG *pdwSourceContext);

    HRESULT (STDMETHODCALLTYPE *SetDefaultTextAttr)(
        IDebugDocumentHelper64 *This,
        SOURCE_TEXT_ATTR staTextAttr);

    HRESULT (STDMETHODCALLTYPE *SetTextAttributes)(
        IDebugDocumentHelper64 *This,
        ULONG ulCharOffset,
        ULONG cChars,
        SOURCE_TEXT_ATTR *pstaTextAttr);

    HRESULT (STDMETHODCALLTYPE *SetLongName)(
        IDebugDocumentHelper64 *This,
        LPCOLESTR pszLongName);

    HRESULT (STDMETHODCALLTYPE *SetShortName)(
        IDebugDocumentHelper64 *This,
        LPCOLESTR pszShortName);

    HRESULT (STDMETHODCALLTYPE *SetDocumentAttr)(
        IDebugDocumentHelper64 *This,
        TEXT_DOC_ATTR pszAttributes);

    HRESULT (STDMETHODCALLTYPE *GetDebugApplicationNode)(
        IDebugDocumentHelper64 *This,
        IDebugApplicationNode **ppdan);

    HRESULT (STDMETHODCALLTYPE *GetScriptBlockInfo)(
        IDebugDocumentHelper64 *This,
        DWORDLONG dwSourceContext,
        IActiveScript **ppasd,
        ULONG *piCharPos,
        ULONG *pcChars);

    HRESULT (STDMETHODCALLTYPE *CreateDebugDocumentContext)(
        IDebugDocumentHelper64 *This,
        ULONG iCharPos,
        ULONG cChars,
        IDebugDocumentContext **ppddc);

    HRESULT (STDMETHODCALLTYPE *BringDocumentToTop)(
        IDebugDocumentHelper64 *This);

    HRESULT (STDMETHODCALLTYPE *BringDocumentContextToTop)(
        IDebugDocumentHelper64 *This,
        IDebugDocumentContext *pddc);

    END_INTERFACE
} IDebugDocumentHelper64Vtbl;

interface IDebugDocumentHelper64 {
    CONST_VTBL IDebugDocumentHelper64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentHelper64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentHelper64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentHelper64_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentHelper64 methods ***/
#define IDebugDocumentHelper64_Init(This,pda,pszShortName,pszLongName,docAttr) (This)->lpVtbl->Init(This,pda,pszShortName,pszLongName,docAttr)
#define IDebugDocumentHelper64_Attach(This,pddhParent) (This)->lpVtbl->Attach(This,pddhParent)
#define IDebugDocumentHelper64_Detach(This) (This)->lpVtbl->Detach(This)
#define IDebugDocumentHelper64_AddUnicodeText(This,pszText) (This)->lpVtbl->AddUnicodeText(This,pszText)
#define IDebugDocumentHelper64_AddDBCSText(This,pszText) (This)->lpVtbl->AddDBCSText(This,pszText)
#define IDebugDocumentHelper64_SetDebugDocumentHost(This,pddh) (This)->lpVtbl->SetDebugDocumentHost(This,pddh)
#define IDebugDocumentHelper64_AddDeferredText(This,cChars,dwTextStartCookie) (This)->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie)
#define IDebugDocumentHelper64_DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext) (This)->lpVtbl->DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext)
#define IDebugDocumentHelper64_SetDefaultTextAttr(This,staTextAttr) (This)->lpVtbl->SetDefaultTextAttr(This,staTextAttr)
#define IDebugDocumentHelper64_SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr) (This)->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr)
#define IDebugDocumentHelper64_SetLongName(This,pszLongName) (This)->lpVtbl->SetLongName(This,pszLongName)
#define IDebugDocumentHelper64_SetShortName(This,pszShortName) (This)->lpVtbl->SetShortName(This,pszShortName)
#define IDebugDocumentHelper64_SetDocumentAttr(This,pszAttributes) (This)->lpVtbl->SetDocumentAttr(This,pszAttributes)
#define IDebugDocumentHelper64_GetDebugApplicationNode(This,ppdan) (This)->lpVtbl->GetDebugApplicationNode(This,ppdan)
#define IDebugDocumentHelper64_GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars) (This)->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars)
#define IDebugDocumentHelper64_CreateDebugDocumentContext(This,iCharPos,cChars,ppddc) (This)->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc)
#define IDebugDocumentHelper64_BringDocumentToTop(This) (This)->lpVtbl->BringDocumentToTop(This)
#define IDebugDocumentHelper64_BringDocumentContextToTop(This,pddc) (This)->lpVtbl->BringDocumentContextToTop(This,pddc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentHelper64_QueryInterface(IDebugDocumentHelper64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentHelper64_AddRef(IDebugDocumentHelper64* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentHelper64_Release(IDebugDocumentHelper64* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentHelper64 methods ***/
static FORCEINLINE HRESULT IDebugDocumentHelper64_Init(IDebugDocumentHelper64* This,IDebugApplication64 *pda,LPCOLESTR pszShortName,LPCOLESTR pszLongName,TEXT_DOC_ATTR docAttr) {
    return This->lpVtbl->Init(This,pda,pszShortName,pszLongName,docAttr);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_Attach(IDebugDocumentHelper64* This,IDebugDocumentHelper64 *pddhParent) {
    return This->lpVtbl->Attach(This,pddhParent);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_Detach(IDebugDocumentHelper64* This) {
    return This->lpVtbl->Detach(This);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_AddUnicodeText(IDebugDocumentHelper64* This,LPCOLESTR pszText) {
    return This->lpVtbl->AddUnicodeText(This,pszText);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_AddDBCSText(IDebugDocumentHelper64* This,LPCSTR pszText) {
    return This->lpVtbl->AddDBCSText(This,pszText);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_SetDebugDocumentHost(IDebugDocumentHelper64* This,IDebugDocumentHost *pddh) {
    return This->lpVtbl->SetDebugDocumentHost(This,pddh);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_AddDeferredText(IDebugDocumentHelper64* This,ULONG cChars,DWORD dwTextStartCookie) {
    return This->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_DefineScriptBlock(IDebugDocumentHelper64* This,ULONG ulCharOffset,ULONG cChars,IActiveScript *pas,WINBOOL fScriptlet,DWORDLONG *pdwSourceContext) {
    return This->lpVtbl->DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_SetDefaultTextAttr(IDebugDocumentHelper64* This,SOURCE_TEXT_ATTR staTextAttr) {
    return This->lpVtbl->SetDefaultTextAttr(This,staTextAttr);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_SetTextAttributes(IDebugDocumentHelper64* This,ULONG ulCharOffset,ULONG cChars,SOURCE_TEXT_ATTR *pstaTextAttr) {
    return This->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_SetLongName(IDebugDocumentHelper64* This,LPCOLESTR pszLongName) {
    return This->lpVtbl->SetLongName(This,pszLongName);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_SetShortName(IDebugDocumentHelper64* This,LPCOLESTR pszShortName) {
    return This->lpVtbl->SetShortName(This,pszShortName);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_SetDocumentAttr(IDebugDocumentHelper64* This,TEXT_DOC_ATTR pszAttributes) {
    return This->lpVtbl->SetDocumentAttr(This,pszAttributes);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_GetDebugApplicationNode(IDebugDocumentHelper64* This,IDebugApplicationNode **ppdan) {
    return This->lpVtbl->GetDebugApplicationNode(This,ppdan);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_GetScriptBlockInfo(IDebugDocumentHelper64* This,DWORDLONG dwSourceContext,IActiveScript **ppasd,ULONG *piCharPos,ULONG *pcChars) {
    return This->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_CreateDebugDocumentContext(IDebugDocumentHelper64* This,ULONG iCharPos,ULONG cChars,IDebugDocumentContext **ppddc) {
    return This->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_BringDocumentToTop(IDebugDocumentHelper64* This) {
    return This->lpVtbl->BringDocumentToTop(This);
}
static FORCEINLINE HRESULT IDebugDocumentHelper64_BringDocumentContextToTop(IDebugDocumentHelper64* This,IDebugDocumentContext *pddc) {
    return This->lpVtbl->BringDocumentContextToTop(This,pddc);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentHelper64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentHost interface
 */
#ifndef __IDebugDocumentHost_INTERFACE_DEFINED__
#define __IDebugDocumentHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentHost, 0x51973c27, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c27-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocumentHost : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDeferredText(
        DWORD dwTextStartCookie,
        WCHAR *pcharText,
        SOURCE_TEXT_ATTR *pstaTextAttr,
        ULONG *pcNumChars,
        ULONG cMaxChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes(
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnCreateDocumentContext(
        IUnknown **ppunkOuter) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPathName(
        BSTR *pbstrLongName,
        WINBOOL *pfIsOriginalFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileName(
        BSTR *pbstrShortName) = 0;

    virtual HRESULT STDMETHODCALLTYPE NotifyChanged(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentHost, 0x51973c27, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentHostVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentHost methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeferredText)(
        IDebugDocumentHost *This,
        DWORD dwTextStartCookie,
        WCHAR *pcharText,
        SOURCE_TEXT_ATTR *pstaTextAttr,
        ULONG *pcNumChars,
        ULONG cMaxChars);

    HRESULT (STDMETHODCALLTYPE *GetScriptTextAttributes)(
        IDebugDocumentHost *This,
        LPCOLESTR pstrCode,
        ULONG uNumCodeChars,
        LPCOLESTR pstrDelimiter,
        DWORD dwFlags,
        SOURCE_TEXT_ATTR *pattr);

    HRESULT (STDMETHODCALLTYPE *OnCreateDocumentContext)(
        IDebugDocumentHost *This,
        IUnknown **ppunkOuter);

    HRESULT (STDMETHODCALLTYPE *GetPathName)(
        IDebugDocumentHost *This,
        BSTR *pbstrLongName,
        WINBOOL *pfIsOriginalFile);

    HRESULT (STDMETHODCALLTYPE *GetFileName)(
        IDebugDocumentHost *This,
        BSTR *pbstrShortName);

    HRESULT (STDMETHODCALLTYPE *NotifyChanged)(
        IDebugDocumentHost *This);

    END_INTERFACE
} IDebugDocumentHostVtbl;

interface IDebugDocumentHost {
    CONST_VTBL IDebugDocumentHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentHost_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentHost methods ***/
#define IDebugDocumentHost_GetDeferredText(This,dwTextStartCookie,pcharText,pstaTextAttr,pcNumChars,cMaxChars) (This)->lpVtbl->GetDeferredText(This,dwTextStartCookie,pcharText,pstaTextAttr,pcNumChars,cMaxChars)
#define IDebugDocumentHost_GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
#define IDebugDocumentHost_OnCreateDocumentContext(This,ppunkOuter) (This)->lpVtbl->OnCreateDocumentContext(This,ppunkOuter)
#define IDebugDocumentHost_GetPathName(This,pbstrLongName,pfIsOriginalFile) (This)->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile)
#define IDebugDocumentHost_GetFileName(This,pbstrShortName) (This)->lpVtbl->GetFileName(This,pbstrShortName)
#define IDebugDocumentHost_NotifyChanged(This) (This)->lpVtbl->NotifyChanged(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentHost_QueryInterface(IDebugDocumentHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentHost_AddRef(IDebugDocumentHost* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentHost_Release(IDebugDocumentHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentHost methods ***/
static FORCEINLINE HRESULT IDebugDocumentHost_GetDeferredText(IDebugDocumentHost* This,DWORD dwTextStartCookie,WCHAR *pcharText,SOURCE_TEXT_ATTR *pstaTextAttr,ULONG *pcNumChars,ULONG cMaxChars) {
    return This->lpVtbl->GetDeferredText(This,dwTextStartCookie,pcharText,pstaTextAttr,pcNumChars,cMaxChars);
}
static FORCEINLINE HRESULT IDebugDocumentHost_GetScriptTextAttributes(IDebugDocumentHost* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
    return This->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
}
static FORCEINLINE HRESULT IDebugDocumentHost_OnCreateDocumentContext(IDebugDocumentHost* This,IUnknown **ppunkOuter) {
    return This->lpVtbl->OnCreateDocumentContext(This,ppunkOuter);
}
static FORCEINLINE HRESULT IDebugDocumentHost_GetPathName(IDebugDocumentHost* This,BSTR *pbstrLongName,WINBOOL *pfIsOriginalFile) {
    return This->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile);
}
static FORCEINLINE HRESULT IDebugDocumentHost_GetFileName(IDebugDocumentHost* This,BSTR *pbstrShortName) {
    return This->lpVtbl->GetFileName(This,pbstrShortName);
}
static FORCEINLINE HRESULT IDebugDocumentHost_NotifyChanged(IDebugDocumentHost* This) {
    return This->lpVtbl->NotifyChanged(This);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentHost_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugDocumentContext interface
 */
#ifndef __IDebugDocumentContext_INTERFACE_DEFINED__
#define __IDebugDocumentContext_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugDocumentContext, 0x51973c28, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c28-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugDocumentContext : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDocument(
        IDebugDocument **ppsd) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumCodeContexts(
        IEnumDebugCodeContexts **ppescc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugDocumentContext, 0x51973c28, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugDocumentContextVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentContext methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocument)(
        IDebugDocumentContext *This,
        IDebugDocument **ppsd);

    HRESULT (STDMETHODCALLTYPE *EnumCodeContexts)(
        IDebugDocumentContext *This,
        IEnumDebugCodeContexts **ppescc);

    END_INTERFACE
} IDebugDocumentContextVtbl;

interface IDebugDocumentContext {
    CONST_VTBL IDebugDocumentContextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugDocumentContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugDocumentContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugDocumentContext_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentContext methods ***/
#define IDebugDocumentContext_GetDocument(This,ppsd) (This)->lpVtbl->GetDocument(This,ppsd)
#define IDebugDocumentContext_EnumCodeContexts(This,ppescc) (This)->lpVtbl->EnumCodeContexts(This,ppescc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugDocumentContext_QueryInterface(IDebugDocumentContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugDocumentContext_AddRef(IDebugDocumentContext* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugDocumentContext_Release(IDebugDocumentContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentContext methods ***/
static FORCEINLINE HRESULT IDebugDocumentContext_GetDocument(IDebugDocumentContext* This,IDebugDocument **ppsd) {
    return This->lpVtbl->GetDocument(This,ppsd);
}
static FORCEINLINE HRESULT IDebugDocumentContext_EnumCodeContexts(IDebugDocumentContext* This,IEnumDebugCodeContexts **ppescc) {
    return This->lpVtbl->EnumCodeContexts(This,ppescc);
}
#endif
#endif

#endif


#endif  /* __IDebugDocumentContext_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugSessionProvider interface
 */
#ifndef __IDebugSessionProvider_INTERFACE_DEFINED__
#define __IDebugSessionProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugSessionProvider, 0x51973c29, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c29-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugSessionProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartDebugSession(
        IRemoteDebugApplication *pda) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugSessionProvider, 0x51973c29, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugSessionProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugSessionProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *StartDebugSession)(
        IDebugSessionProvider *This,
        IRemoteDebugApplication *pda);

    END_INTERFACE
} IDebugSessionProviderVtbl;

interface IDebugSessionProvider {
    CONST_VTBL IDebugSessionProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugSessionProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugSessionProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugSessionProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugSessionProvider methods ***/
#define IDebugSessionProvider_StartDebugSession(This,pda) (This)->lpVtbl->StartDebugSession(This,pda)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugSessionProvider_QueryInterface(IDebugSessionProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugSessionProvider_AddRef(IDebugSessionProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugSessionProvider_Release(IDebugSessionProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugSessionProvider methods ***/
static FORCEINLINE HRESULT IDebugSessionProvider_StartDebugSession(IDebugSessionProvider* This,IRemoteDebugApplication *pda) {
    return This->lpVtbl->StartDebugSession(This,pda);
}
#endif
#endif

#endif


#endif  /* __IDebugSessionProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IApplicationDebugger interface
 */
#ifndef __IApplicationDebugger_INTERFACE_DEFINED__
#define __IApplicationDebugger_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationDebugger, 0x51973c2a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c2a-cb0c-11d0-b5c9-00a0244a0e7a")
IApplicationDebugger : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryAlive(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtDebugger(
        REFCLSID rclsid,
        IUnknown *pUnkOuter,
        DWORD dwClsContext,
        REFIID riid,
        IUnknown **ppvObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE onDebugOutput(
        LPCOLESTR pstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE onHandleBreakPoint(
        IRemoteDebugApplicationThread *prpt,
        BREAKREASON br,
        IActiveScriptErrorDebug *pError) = 0;

    virtual HRESULT STDMETHODCALLTYPE onClose(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE onDebuggerEvent(
        REFIID riid,
        IUnknown *punk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationDebugger, 0x51973c2a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IApplicationDebuggerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IApplicationDebugger methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryAlive)(
        IApplicationDebugger *This);

    HRESULT (STDMETHODCALLTYPE *CreateInstanceAtDebugger)(
        IApplicationDebugger *This,
        REFCLSID rclsid,
        IUnknown *pUnkOuter,
        DWORD dwClsContext,
        REFIID riid,
        IUnknown **ppvObject);

    HRESULT (STDMETHODCALLTYPE *onDebugOutput)(
        IApplicationDebugger *This,
        LPCOLESTR pstr);

    HRESULT (STDMETHODCALLTYPE *onHandleBreakPoint)(
        IApplicationDebugger *This,
        IRemoteDebugApplicationThread *prpt,
        BREAKREASON br,
        IActiveScriptErrorDebug *pError);

    HRESULT (STDMETHODCALLTYPE *onClose)(
        IApplicationDebugger *This);

    HRESULT (STDMETHODCALLTYPE *onDebuggerEvent)(
        IApplicationDebugger *This,
        REFIID riid,
        IUnknown *punk);

    END_INTERFACE
} IApplicationDebuggerVtbl;

interface IApplicationDebugger {
    CONST_VTBL IApplicationDebuggerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationDebugger_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationDebugger_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationDebugger_Release(This) (This)->lpVtbl->Release(This)
/*** IApplicationDebugger methods ***/
#define IApplicationDebugger_QueryAlive(This) (This)->lpVtbl->QueryAlive(This)
#define IApplicationDebugger_CreateInstanceAtDebugger(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject) (This)->lpVtbl->CreateInstanceAtDebugger(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
#define IApplicationDebugger_onDebugOutput(This,pstr) (This)->lpVtbl->onDebugOutput(This,pstr)
#define IApplicationDebugger_onHandleBreakPoint(This,prpt,br,pError) (This)->lpVtbl->onHandleBreakPoint(This,prpt,br,pError)
#define IApplicationDebugger_onClose(This) (This)->lpVtbl->onClose(This)
#define IApplicationDebugger_onDebuggerEvent(This,riid,punk) (This)->lpVtbl->onDebuggerEvent(This,riid,punk)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationDebugger_QueryInterface(IApplicationDebugger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationDebugger_AddRef(IApplicationDebugger* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationDebugger_Release(IApplicationDebugger* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDebugger methods ***/
static FORCEINLINE HRESULT IApplicationDebugger_QueryAlive(IApplicationDebugger* This) {
    return This->lpVtbl->QueryAlive(This);
}
static FORCEINLINE HRESULT IApplicationDebugger_CreateInstanceAtDebugger(IApplicationDebugger* This,REFCLSID rclsid,IUnknown *pUnkOuter,DWORD dwClsContext,REFIID riid,IUnknown **ppvObject) {
    return This->lpVtbl->CreateInstanceAtDebugger(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject);
}
static FORCEINLINE HRESULT IApplicationDebugger_onDebugOutput(IApplicationDebugger* This,LPCOLESTR pstr) {
    return This->lpVtbl->onDebugOutput(This,pstr);
}
static FORCEINLINE HRESULT IApplicationDebugger_onHandleBreakPoint(IApplicationDebugger* This,IRemoteDebugApplicationThread *prpt,BREAKREASON br,IActiveScriptErrorDebug *pError) {
    return This->lpVtbl->onHandleBreakPoint(This,prpt,br,pError);
}
static FORCEINLINE HRESULT IApplicationDebugger_onClose(IApplicationDebugger* This) {
    return This->lpVtbl->onClose(This);
}
static FORCEINLINE HRESULT IApplicationDebugger_onDebuggerEvent(IApplicationDebugger* This,REFIID riid,IUnknown *punk) {
    return This->lpVtbl->onDebuggerEvent(This,riid,punk);
}
#endif
#endif

#endif


#endif  /* __IApplicationDebugger_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IApplicationDebuggerUI interface
 */
#ifndef __IApplicationDebuggerUI_INTERFACE_DEFINED__
#define __IApplicationDebuggerUI_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationDebuggerUI, 0x51973c2b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c2b-cb0c-11d0-b5c9-00a0244a0e7a")
IApplicationDebuggerUI : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop(
        IDebugDocumentText *pddt) = 0;

    virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop(
        IDebugDocumentContext *pddc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationDebuggerUI, 0x51973c2b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IApplicationDebuggerUIVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IApplicationDebuggerUI methods ***/
    HRESULT (STDMETHODCALLTYPE *BringDocumentToTop)(
        IApplicationDebuggerUI *This,
        IDebugDocumentText *pddt);

    HRESULT (STDMETHODCALLTYPE *BringDocumentContextToTop)(
        IApplicationDebuggerUI *This,
        IDebugDocumentContext *pddc);

    END_INTERFACE
} IApplicationDebuggerUIVtbl;

interface IApplicationDebuggerUI {
    CONST_VTBL IApplicationDebuggerUIVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationDebuggerUI_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationDebuggerUI_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationDebuggerUI_Release(This) (This)->lpVtbl->Release(This)
/*** IApplicationDebuggerUI methods ***/
#define IApplicationDebuggerUI_BringDocumentToTop(This,pddt) (This)->lpVtbl->BringDocumentToTop(This,pddt)
#define IApplicationDebuggerUI_BringDocumentContextToTop(This,pddc) (This)->lpVtbl->BringDocumentContextToTop(This,pddc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationDebuggerUI_QueryInterface(IApplicationDebuggerUI* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationDebuggerUI_AddRef(IApplicationDebuggerUI* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationDebuggerUI_Release(IApplicationDebuggerUI* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDebuggerUI methods ***/
static FORCEINLINE HRESULT IApplicationDebuggerUI_BringDocumentToTop(IApplicationDebuggerUI* This,IDebugDocumentText *pddt) {
    return This->lpVtbl->BringDocumentToTop(This,pddt);
}
static FORCEINLINE HRESULT IApplicationDebuggerUI_BringDocumentContextToTop(IApplicationDebuggerUI* This,IDebugDocumentContext *pddc) {
    return This->lpVtbl->BringDocumentContextToTop(This,pddc);
}
#endif
#endif

#endif


#endif  /* __IApplicationDebuggerUI_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMachineDebugManager interface
 */
#ifndef __IMachineDebugManager_INTERFACE_DEFINED__
#define __IMachineDebugManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMachineDebugManager, 0x51973c2c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c2c-cb0c-11d0-b5c9-00a0244a0e7a")
IMachineDebugManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddApplication(
        IRemoteDebugApplication *pda,
        DWORD *pdwAppCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveApplication(
        DWORD dwAppCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumApplications(
        IEnumRemoteDebugApplications **ppeda) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMachineDebugManager, 0x51973c2c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IMachineDebugManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMachineDebugManager methods ***/
    HRESULT (STDMETHODCALLTYPE *AddApplication)(
        IMachineDebugManager *This,
        IRemoteDebugApplication *pda,
        DWORD *pdwAppCookie);

    HRESULT (STDMETHODCALLTYPE *RemoveApplication)(
        IMachineDebugManager *This,
        DWORD dwAppCookie);

    HRESULT (STDMETHODCALLTYPE *EnumApplications)(
        IMachineDebugManager *This,
        IEnumRemoteDebugApplications **ppeda);

    END_INTERFACE
} IMachineDebugManagerVtbl;

interface IMachineDebugManager {
    CONST_VTBL IMachineDebugManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMachineDebugManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMachineDebugManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMachineDebugManager_Release(This) (This)->lpVtbl->Release(This)
/*** IMachineDebugManager methods ***/
#define IMachineDebugManager_AddApplication(This,pda,pdwAppCookie) (This)->lpVtbl->AddApplication(This,pda,pdwAppCookie)
#define IMachineDebugManager_RemoveApplication(This,dwAppCookie) (This)->lpVtbl->RemoveApplication(This,dwAppCookie)
#define IMachineDebugManager_EnumApplications(This,ppeda) (This)->lpVtbl->EnumApplications(This,ppeda)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMachineDebugManager_QueryInterface(IMachineDebugManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMachineDebugManager_AddRef(IMachineDebugManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMachineDebugManager_Release(IMachineDebugManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IMachineDebugManager methods ***/
static FORCEINLINE HRESULT IMachineDebugManager_AddApplication(IMachineDebugManager* This,IRemoteDebugApplication *pda,DWORD *pdwAppCookie) {
    return This->lpVtbl->AddApplication(This,pda,pdwAppCookie);
}
static FORCEINLINE HRESULT IMachineDebugManager_RemoveApplication(IMachineDebugManager* This,DWORD dwAppCookie) {
    return This->lpVtbl->RemoveApplication(This,dwAppCookie);
}
static FORCEINLINE HRESULT IMachineDebugManager_EnumApplications(IMachineDebugManager* This,IEnumRemoteDebugApplications **ppeda) {
    return This->lpVtbl->EnumApplications(This,ppeda);
}
#endif
#endif

#endif


#endif  /* __IMachineDebugManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMachineDebugManagerCookie interface
 */
#ifndef __IMachineDebugManagerCookie_INTERFACE_DEFINED__
#define __IMachineDebugManagerCookie_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMachineDebugManagerCookie, 0x51973c2d, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c2d-cb0c-11d0-b5c9-00a0244a0e7a")
IMachineDebugManagerCookie : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddApplication(
        IRemoteDebugApplication *pda,
        DWORD dwDebugAppCookie,
        DWORD *pdwAppCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveApplication(
        DWORD dwDebugAppCookie,
        DWORD dwAppCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumApplications(
        IEnumRemoteDebugApplications **ppeda) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMachineDebugManagerCookie, 0x51973c2d, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IMachineDebugManagerCookieVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMachineDebugManagerCookie methods ***/
    HRESULT (STDMETHODCALLTYPE *AddApplication)(
        IMachineDebugManagerCookie *This,
        IRemoteDebugApplication *pda,
        DWORD dwDebugAppCookie,
        DWORD *pdwAppCookie);

    HRESULT (STDMETHODCALLTYPE *RemoveApplication)(
        IMachineDebugManagerCookie *This,
        DWORD dwDebugAppCookie,
        DWORD dwAppCookie);

    HRESULT (STDMETHODCALLTYPE *EnumApplications)(
        IMachineDebugManagerCookie *This,
        IEnumRemoteDebugApplications **ppeda);

    END_INTERFACE
} IMachineDebugManagerCookieVtbl;

interface IMachineDebugManagerCookie {
    CONST_VTBL IMachineDebugManagerCookieVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMachineDebugManagerCookie_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMachineDebugManagerCookie_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMachineDebugManagerCookie_Release(This) (This)->lpVtbl->Release(This)
/*** IMachineDebugManagerCookie methods ***/
#define IMachineDebugManagerCookie_AddApplication(This,pda,dwDebugAppCookie,pdwAppCookie) (This)->lpVtbl->AddApplication(This,pda,dwDebugAppCookie,pdwAppCookie)
#define IMachineDebugManagerCookie_RemoveApplication(This,dwDebugAppCookie,dwAppCookie) (This)->lpVtbl->RemoveApplication(This,dwDebugAppCookie,dwAppCookie)
#define IMachineDebugManagerCookie_EnumApplications(This,ppeda) (This)->lpVtbl->EnumApplications(This,ppeda)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMachineDebugManagerCookie_QueryInterface(IMachineDebugManagerCookie* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMachineDebugManagerCookie_AddRef(IMachineDebugManagerCookie* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMachineDebugManagerCookie_Release(IMachineDebugManagerCookie* This) {
    return This->lpVtbl->Release(This);
}
/*** IMachineDebugManagerCookie methods ***/
static FORCEINLINE HRESULT IMachineDebugManagerCookie_AddApplication(IMachineDebugManagerCookie* This,IRemoteDebugApplication *pda,DWORD dwDebugAppCookie,DWORD *pdwAppCookie) {
    return This->lpVtbl->AddApplication(This,pda,dwDebugAppCookie,pdwAppCookie);
}
static FORCEINLINE HRESULT IMachineDebugManagerCookie_RemoveApplication(IMachineDebugManagerCookie* This,DWORD dwDebugAppCookie,DWORD dwAppCookie) {
    return This->lpVtbl->RemoveApplication(This,dwDebugAppCookie,dwAppCookie);
}
static FORCEINLINE HRESULT IMachineDebugManagerCookie_EnumApplications(IMachineDebugManagerCookie* This,IEnumRemoteDebugApplications **ppeda) {
    return This->lpVtbl->EnumApplications(This,ppeda);
}
#endif
#endif

#endif


#endif  /* __IMachineDebugManagerCookie_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMachineDebugManagerEvents interface
 */
#ifndef __IMachineDebugManagerEvents_INTERFACE_DEFINED__
#define __IMachineDebugManagerEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMachineDebugManagerEvents, 0x51973c2e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c2e-cb0c-11d0-b5c9-00a0244a0e7a")
IMachineDebugManagerEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE onAddApplication(
        IRemoteDebugApplication *pda,
        DWORD dwAppCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE onRemoveApplication(
        IRemoteDebugApplication *pda,
        DWORD dwAppCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMachineDebugManagerEvents, 0x51973c2e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IMachineDebugManagerEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMachineDebugManagerEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *onAddApplication)(
        IMachineDebugManagerEvents *This,
        IRemoteDebugApplication *pda,
        DWORD dwAppCookie);

    HRESULT (STDMETHODCALLTYPE *onRemoveApplication)(
        IMachineDebugManagerEvents *This,
        IRemoteDebugApplication *pda,
        DWORD dwAppCookie);

    END_INTERFACE
} IMachineDebugManagerEventsVtbl;

interface IMachineDebugManagerEvents {
    CONST_VTBL IMachineDebugManagerEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMachineDebugManagerEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMachineDebugManagerEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMachineDebugManagerEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IMachineDebugManagerEvents methods ***/
#define IMachineDebugManagerEvents_onAddApplication(This,pda,dwAppCookie) (This)->lpVtbl->onAddApplication(This,pda,dwAppCookie)
#define IMachineDebugManagerEvents_onRemoveApplication(This,pda,dwAppCookie) (This)->lpVtbl->onRemoveApplication(This,pda,dwAppCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMachineDebugManagerEvents_QueryInterface(IMachineDebugManagerEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMachineDebugManagerEvents_AddRef(IMachineDebugManagerEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMachineDebugManagerEvents_Release(IMachineDebugManagerEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IMachineDebugManagerEvents methods ***/
static FORCEINLINE HRESULT IMachineDebugManagerEvents_onAddApplication(IMachineDebugManagerEvents* This,IRemoteDebugApplication *pda,DWORD dwAppCookie) {
    return This->lpVtbl->onAddApplication(This,pda,dwAppCookie);
}
static FORCEINLINE HRESULT IMachineDebugManagerEvents_onRemoveApplication(IMachineDebugManagerEvents* This,IRemoteDebugApplication *pda,DWORD dwAppCookie) {
    return This->lpVtbl->onRemoveApplication(This,pda,dwAppCookie);
}
#endif
#endif

#endif


#endif  /* __IMachineDebugManagerEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IProcessDebugManager32 interface
 */
#ifndef __IProcessDebugManager32_INTERFACE_DEFINED__
#define __IProcessDebugManager32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IProcessDebugManager32, 0x51973c2f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c2f-cb0c-11d0-b5c9-00a0244a0e7a")
IProcessDebugManager32 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateApplication(
        IDebugApplication32 **ppda) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultApplication(
        IDebugApplication32 **ppda) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddApplication(
        IDebugApplication32 *pda,
        DWORD *pdwAppCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveApplication(
        DWORD dwAppCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentHelper(
        IUnknown *punkOuter,
        IDebugDocumentHelper32 **pddh) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IProcessDebugManager32, 0x51973c2f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IProcessDebugManager32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IProcessDebugManager32 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateApplication)(
        IProcessDebugManager32 *This,
        IDebugApplication32 **ppda);

    HRESULT (STDMETHODCALLTYPE *GetDefaultApplication)(
        IProcessDebugManager32 *This,
        IDebugApplication32 **ppda);

    HRESULT (STDMETHODCALLTYPE *AddApplication)(
        IProcessDebugManager32 *This,
        IDebugApplication32 *pda,
        DWORD *pdwAppCookie);

    HRESULT (STDMETHODCALLTYPE *RemoveApplication)(
        IProcessDebugManager32 *This,
        DWORD dwAppCookie);

    HRESULT (STDMETHODCALLTYPE *CreateDebugDocumentHelper)(
        IProcessDebugManager32 *This,
        IUnknown *punkOuter,
        IDebugDocumentHelper32 **pddh);

    END_INTERFACE
} IProcessDebugManager32Vtbl;

interface IProcessDebugManager32 {
    CONST_VTBL IProcessDebugManager32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IProcessDebugManager32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProcessDebugManager32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProcessDebugManager32_Release(This) (This)->lpVtbl->Release(This)
/*** IProcessDebugManager32 methods ***/
#define IProcessDebugManager32_CreateApplication(This,ppda) (This)->lpVtbl->CreateApplication(This,ppda)
#define IProcessDebugManager32_GetDefaultApplication(This,ppda) (This)->lpVtbl->GetDefaultApplication(This,ppda)
#define IProcessDebugManager32_AddApplication(This,pda,pdwAppCookie) (This)->lpVtbl->AddApplication(This,pda,pdwAppCookie)
#define IProcessDebugManager32_RemoveApplication(This,dwAppCookie) (This)->lpVtbl->RemoveApplication(This,dwAppCookie)
#define IProcessDebugManager32_CreateDebugDocumentHelper(This,punkOuter,pddh) (This)->lpVtbl->CreateDebugDocumentHelper(This,punkOuter,pddh)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IProcessDebugManager32_QueryInterface(IProcessDebugManager32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IProcessDebugManager32_AddRef(IProcessDebugManager32* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IProcessDebugManager32_Release(IProcessDebugManager32* This) {
    return This->lpVtbl->Release(This);
}
/*** IProcessDebugManager32 methods ***/
static FORCEINLINE HRESULT IProcessDebugManager32_CreateApplication(IProcessDebugManager32* This,IDebugApplication32 **ppda) {
    return This->lpVtbl->CreateApplication(This,ppda);
}
static FORCEINLINE HRESULT IProcessDebugManager32_GetDefaultApplication(IProcessDebugManager32* This,IDebugApplication32 **ppda) {
    return This->lpVtbl->GetDefaultApplication(This,ppda);
}
static FORCEINLINE HRESULT IProcessDebugManager32_AddApplication(IProcessDebugManager32* This,IDebugApplication32 *pda,DWORD *pdwAppCookie) {
    return This->lpVtbl->AddApplication(This,pda,pdwAppCookie);
}
static FORCEINLINE HRESULT IProcessDebugManager32_RemoveApplication(IProcessDebugManager32* This,DWORD dwAppCookie) {
    return This->lpVtbl->RemoveApplication(This,dwAppCookie);
}
static FORCEINLINE HRESULT IProcessDebugManager32_CreateDebugDocumentHelper(IProcessDebugManager32* This,IUnknown *punkOuter,IDebugDocumentHelper32 **pddh) {
    return This->lpVtbl->CreateDebugDocumentHelper(This,punkOuter,pddh);
}
#endif
#endif

#endif


#endif  /* __IProcessDebugManager32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IProcessDebugManager64 interface
 */
#ifndef __IProcessDebugManager64_INTERFACE_DEFINED__
#define __IProcessDebugManager64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IProcessDebugManager64, 0x56b9fc1c, 0x63a9, 0x4cc1, 0xac,0x21, 0x08,0x7d,0x69,0xa1,0x7f,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56b9fc1c-63a9-4cc1-ac21-087d69a17fab")
IProcessDebugManager64 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateApplication(
        IDebugApplication64 **ppda) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultApplication(
        IDebugApplication64 **ppda) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddApplication(
        IDebugApplication64 *pda,
        DWORD *pdwAppCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveApplication(
        DWORD dwAppCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentHelper(
        IUnknown *punkOuter,
        IDebugDocumentHelper64 **pddh) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IProcessDebugManager64, 0x56b9fc1c, 0x63a9, 0x4cc1, 0xac,0x21, 0x08,0x7d,0x69,0xa1,0x7f,0xab)
#endif
#else
typedef struct IProcessDebugManager64Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IProcessDebugManager64 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateApplication)(
        IProcessDebugManager64 *This,
        IDebugApplication64 **ppda);

    HRESULT (STDMETHODCALLTYPE *GetDefaultApplication)(
        IProcessDebugManager64 *This,
        IDebugApplication64 **ppda);

    HRESULT (STDMETHODCALLTYPE *AddApplication)(
        IProcessDebugManager64 *This,
        IDebugApplication64 *pda,
        DWORD *pdwAppCookie);

    HRESULT (STDMETHODCALLTYPE *RemoveApplication)(
        IProcessDebugManager64 *This,
        DWORD dwAppCookie);

    HRESULT (STDMETHODCALLTYPE *CreateDebugDocumentHelper)(
        IProcessDebugManager64 *This,
        IUnknown *punkOuter,
        IDebugDocumentHelper64 **pddh);

    END_INTERFACE
} IProcessDebugManager64Vtbl;

interface IProcessDebugManager64 {
    CONST_VTBL IProcessDebugManager64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IProcessDebugManager64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProcessDebugManager64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProcessDebugManager64_Release(This) (This)->lpVtbl->Release(This)
/*** IProcessDebugManager64 methods ***/
#define IProcessDebugManager64_CreateApplication(This,ppda) (This)->lpVtbl->CreateApplication(This,ppda)
#define IProcessDebugManager64_GetDefaultApplication(This,ppda) (This)->lpVtbl->GetDefaultApplication(This,ppda)
#define IProcessDebugManager64_AddApplication(This,pda,pdwAppCookie) (This)->lpVtbl->AddApplication(This,pda,pdwAppCookie)
#define IProcessDebugManager64_RemoveApplication(This,dwAppCookie) (This)->lpVtbl->RemoveApplication(This,dwAppCookie)
#define IProcessDebugManager64_CreateDebugDocumentHelper(This,punkOuter,pddh) (This)->lpVtbl->CreateDebugDocumentHelper(This,punkOuter,pddh)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IProcessDebugManager64_QueryInterface(IProcessDebugManager64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IProcessDebugManager64_AddRef(IProcessDebugManager64* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IProcessDebugManager64_Release(IProcessDebugManager64* This) {
    return This->lpVtbl->Release(This);
}
/*** IProcessDebugManager64 methods ***/
static FORCEINLINE HRESULT IProcessDebugManager64_CreateApplication(IProcessDebugManager64* This,IDebugApplication64 **ppda) {
    return This->lpVtbl->CreateApplication(This,ppda);
}
static FORCEINLINE HRESULT IProcessDebugManager64_GetDefaultApplication(IProcessDebugManager64* This,IDebugApplication64 **ppda) {
    return This->lpVtbl->GetDefaultApplication(This,ppda);
}
static FORCEINLINE HRESULT IProcessDebugManager64_AddApplication(IProcessDebugManager64* This,IDebugApplication64 *pda,DWORD *pdwAppCookie) {
    return This->lpVtbl->AddApplication(This,pda,pdwAppCookie);
}
static FORCEINLINE HRESULT IProcessDebugManager64_RemoveApplication(IProcessDebugManager64* This,DWORD dwAppCookie) {
    return This->lpVtbl->RemoveApplication(This,dwAppCookie);
}
static FORCEINLINE HRESULT IProcessDebugManager64_CreateDebugDocumentHelper(IProcessDebugManager64* This,IUnknown *punkOuter,IDebugDocumentHelper64 **pddh) {
    return This->lpVtbl->CreateDebugDocumentHelper(This,punkOuter,pddh);
}
#endif
#endif

#endif


#endif  /* __IProcessDebugManager64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRemoteDebugApplication interface
 */
#ifndef __IRemoteDebugApplication_INTERFACE_DEFINED__
#define __IRemoteDebugApplication_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRemoteDebugApplication, 0x51973c30, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c30-cb0c-11d0-b5c9-00a0244a0e7a")
IRemoteDebugApplication : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ResumeFromBreakPoint(
        IRemoteDebugApplicationThread *prptFocus,
        BREAKRESUMEACTION bra,
        ERRORRESUMEACTION era) = 0;

    virtual HRESULT STDMETHODCALLTYPE CauseBreak(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConnectDebugger(
        IApplicationDebugger *pad) = 0;

    virtual HRESULT STDMETHODCALLTYPE DisconnectDebugger(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDebugger(
        IApplicationDebugger **pad) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtApplication(
        REFCLSID rclsid,
        IUnknown *pUnkOuter,
        DWORD dwClsContext,
        REFIID riid,
        IUnknown **ppvObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryAlive(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumThreads(
        IEnumRemoteDebugApplicationThreads **pperdat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetName(
        BSTR *pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRootNode(
        IDebugApplicationNode **ppdanRoot) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumGlobalExpressionContexts(
        IEnumDebugExpressionContexts **ppedec) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRemoteDebugApplication, 0x51973c30, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IRemoteDebugApplicationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplication methods ***/
    HRESULT (STDMETHODCALLTYPE *ResumeFromBreakPoint)(
        IRemoteDebugApplication *This,
        IRemoteDebugApplicationThread *prptFocus,
        BREAKRESUMEACTION bra,
        ERRORRESUMEACTION era);

    HRESULT (STDMETHODCALLTYPE *CauseBreak)(
        IRemoteDebugApplication *This);

    HRESULT (STDMETHODCALLTYPE *ConnectDebugger)(
        IRemoteDebugApplication *This,
        IApplicationDebugger *pad);

    HRESULT (STDMETHODCALLTYPE *DisconnectDebugger)(
        IRemoteDebugApplication *This);

    HRESULT (STDMETHODCALLTYPE *GetDebugger)(
        IRemoteDebugApplication *This,
        IApplicationDebugger **pad);

    HRESULT (STDMETHODCALLTYPE *CreateInstanceAtApplication)(
        IRemoteDebugApplication *This,
        REFCLSID rclsid,
        IUnknown *pUnkOuter,
        DWORD dwClsContext,
        REFIID riid,
        IUnknown **ppvObject);

    HRESULT (STDMETHODCALLTYPE *QueryAlive)(
        IRemoteDebugApplication *This);

    HRESULT (STDMETHODCALLTYPE *EnumThreads)(
        IRemoteDebugApplication *This,
        IEnumRemoteDebugApplicationThreads **pperdat);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IRemoteDebugApplication *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetRootNode)(
        IRemoteDebugApplication *This,
        IDebugApplicationNode **ppdanRoot);

    HRESULT (STDMETHODCALLTYPE *EnumGlobalExpressionContexts)(
        IRemoteDebugApplication *This,
        IEnumDebugExpressionContexts **ppedec);

    END_INTERFACE
} IRemoteDebugApplicationVtbl;

interface IRemoteDebugApplication {
    CONST_VTBL IRemoteDebugApplicationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRemoteDebugApplication_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRemoteDebugApplication_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRemoteDebugApplication_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplication methods ***/
#define IRemoteDebugApplication_ResumeFromBreakPoint(This,prptFocus,bra,era) (This)->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era)
#define IRemoteDebugApplication_CauseBreak(This) (This)->lpVtbl->CauseBreak(This)
#define IRemoteDebugApplication_ConnectDebugger(This,pad) (This)->lpVtbl->ConnectDebugger(This,pad)
#define IRemoteDebugApplication_DisconnectDebugger(This) (This)->lpVtbl->DisconnectDebugger(This)
#define IRemoteDebugApplication_GetDebugger(This,pad) (This)->lpVtbl->GetDebugger(This,pad)
#define IRemoteDebugApplication_CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject) (This)->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
#define IRemoteDebugApplication_QueryAlive(This) (This)->lpVtbl->QueryAlive(This)
#define IRemoteDebugApplication_EnumThreads(This,pperdat) (This)->lpVtbl->EnumThreads(This,pperdat)
#define IRemoteDebugApplication_GetName(This,pbstrName) (This)->lpVtbl->GetName(This,pbstrName)
#define IRemoteDebugApplication_GetRootNode(This,ppdanRoot) (This)->lpVtbl->GetRootNode(This,ppdanRoot)
#define IRemoteDebugApplication_EnumGlobalExpressionContexts(This,ppedec) (This)->lpVtbl->EnumGlobalExpressionContexts(This,ppedec)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRemoteDebugApplication_QueryInterface(IRemoteDebugApplication* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRemoteDebugApplication_AddRef(IRemoteDebugApplication* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRemoteDebugApplication_Release(IRemoteDebugApplication* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplication methods ***/
static FORCEINLINE HRESULT IRemoteDebugApplication_ResumeFromBreakPoint(IRemoteDebugApplication* This,IRemoteDebugApplicationThread *prptFocus,BREAKRESUMEACTION bra,ERRORRESUMEACTION era) {
    return This->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_CauseBreak(IRemoteDebugApplication* This) {
    return This->lpVtbl->CauseBreak(This);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_ConnectDebugger(IRemoteDebugApplication* This,IApplicationDebugger *pad) {
    return This->lpVtbl->ConnectDebugger(This,pad);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_DisconnectDebugger(IRemoteDebugApplication* This) {
    return This->lpVtbl->DisconnectDebugger(This);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_GetDebugger(IRemoteDebugApplication* This,IApplicationDebugger **pad) {
    return This->lpVtbl->GetDebugger(This,pad);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_CreateInstanceAtApplication(IRemoteDebugApplication* This,REFCLSID rclsid,IUnknown *pUnkOuter,DWORD dwClsContext,REFIID riid,IUnknown **ppvObject) {
    return This->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_QueryAlive(IRemoteDebugApplication* This) {
    return This->lpVtbl->QueryAlive(This);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_EnumThreads(IRemoteDebugApplication* This,IEnumRemoteDebugApplicationThreads **pperdat) {
    return This->lpVtbl->EnumThreads(This,pperdat);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_GetName(IRemoteDebugApplication* This,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,pbstrName);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_GetRootNode(IRemoteDebugApplication* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootNode(This,ppdanRoot);
}
static FORCEINLINE HRESULT IRemoteDebugApplication_EnumGlobalExpressionContexts(IRemoteDebugApplication* This,IEnumDebugExpressionContexts **ppedec) {
    return This->lpVtbl->EnumGlobalExpressionContexts(This,ppedec);
}
#endif
#endif

#endif


#endif  /* __IRemoteDebugApplication_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplication32 interface
 */
#ifndef __IDebugApplication32_INTERFACE_DEFINED__
#define __IDebugApplication32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplication32, 0x51973c32, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c32-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugApplication32 : public IRemoteDebugApplication
{
    virtual HRESULT STDMETHODCALLTYPE SetName(
        LPCOLESTR pstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE StepOutComplete(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE DebugOutput(
        LPCOLESTR pstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartDebugSession(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE HandleBreakPoint(
        BREAKREASON br,
        BREAKRESUMEACTION *pbra) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBreakFlags(
        APPBREAKFLAGS *pabf,
        IRemoteDebugApplicationThread **pprdatSteppingThread) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentThread(
        IDebugApplicationThread **pat) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAsyncDebugOperation(
        IDebugSyncOperation *psdo,
        IDebugAsyncOperation **ppado) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStackFrameSniffer(
        IDebugStackFrameSniffer *pdsfs,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStackFrameSniffer(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryCurrentThreadIsDebuggerThread(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SynchronousCallInDebuggerThread(
        IDebugThreadCall32 *pptc,
        DWORD dwParam1,
        DWORD dwParam2,
        DWORD dwParam3) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateApplicationNode(
        IDebugApplicationNode **ppdanNew) = 0;

    virtual HRESULT STDMETHODCALLTYPE FireDebuggerEvent(
        REFGUID riid,
        IUnknown *punk) = 0;

    virtual HRESULT STDMETHODCALLTYPE HandleRuntimeError(
        IActiveScriptErrorDebug *pErrorDebug,
        IActiveScriptSite *pScriptSite,
        BREAKRESUMEACTION *pbra,
        ERRORRESUMEACTION *perra,
        WINBOOL *pfCallOnScriptError) = 0;

    virtual WINBOOL STDMETHODCALLTYPE FCanJitDebug(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE FIsAutoJitDebugEnabled(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddGlobalExpressionContextProvider(
        IProvideExpressionContexts *pdsfs,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveGlobalExpressionContextProvider(
        DWORD dwCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplication32, 0x51973c32, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugApplication32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplication methods ***/
    HRESULT (STDMETHODCALLTYPE *ResumeFromBreakPoint)(
        IDebugApplication32 *This,
        IRemoteDebugApplicationThread *prptFocus,
        BREAKRESUMEACTION bra,
        ERRORRESUMEACTION era);

    HRESULT (STDMETHODCALLTYPE *CauseBreak)(
        IDebugApplication32 *This);

    HRESULT (STDMETHODCALLTYPE *ConnectDebugger)(
        IDebugApplication32 *This,
        IApplicationDebugger *pad);

    HRESULT (STDMETHODCALLTYPE *DisconnectDebugger)(
        IDebugApplication32 *This);

    HRESULT (STDMETHODCALLTYPE *GetDebugger)(
        IDebugApplication32 *This,
        IApplicationDebugger **pad);

    HRESULT (STDMETHODCALLTYPE *CreateInstanceAtApplication)(
        IDebugApplication32 *This,
        REFCLSID rclsid,
        IUnknown *pUnkOuter,
        DWORD dwClsContext,
        REFIID riid,
        IUnknown **ppvObject);

    HRESULT (STDMETHODCALLTYPE *QueryAlive)(
        IDebugApplication32 *This);

    HRESULT (STDMETHODCALLTYPE *EnumThreads)(
        IDebugApplication32 *This,
        IEnumRemoteDebugApplicationThreads **pperdat);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugApplication32 *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetRootNode)(
        IDebugApplication32 *This,
        IDebugApplicationNode **ppdanRoot);

    HRESULT (STDMETHODCALLTYPE *EnumGlobalExpressionContexts)(
        IDebugApplication32 *This,
        IEnumDebugExpressionContexts **ppedec);

    /*** IDebugApplication32 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetName)(
        IDebugApplication32 *This,
        LPCOLESTR pstrName);

    HRESULT (STDMETHODCALLTYPE *StepOutComplete)(
        IDebugApplication32 *This);

    HRESULT (STDMETHODCALLTYPE *DebugOutput)(
        IDebugApplication32 *This,
        LPCOLESTR pstr);

    HRESULT (STDMETHODCALLTYPE *StartDebugSession)(
        IDebugApplication32 *This);

    HRESULT (STDMETHODCALLTYPE *HandleBreakPoint)(
        IDebugApplication32 *This,
        BREAKREASON br,
        BREAKRESUMEACTION *pbra);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IDebugApplication32 *This);

    HRESULT (STDMETHODCALLTYPE *GetBreakFlags)(
        IDebugApplication32 *This,
        APPBREAKFLAGS *pabf,
        IRemoteDebugApplicationThread **pprdatSteppingThread);

    HRESULT (STDMETHODCALLTYPE *GetCurrentThread)(
        IDebugApplication32 *This,
        IDebugApplicationThread **pat);

    HRESULT (STDMETHODCALLTYPE *CreateAsyncDebugOperation)(
        IDebugApplication32 *This,
        IDebugSyncOperation *psdo,
        IDebugAsyncOperation **ppado);

    HRESULT (STDMETHODCALLTYPE *AddStackFrameSniffer)(
        IDebugApplication32 *This,
        IDebugStackFrameSniffer *pdsfs,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *RemoveStackFrameSniffer)(
        IDebugApplication32 *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *QueryCurrentThreadIsDebuggerThread)(
        IDebugApplication32 *This);

    HRESULT (STDMETHODCALLTYPE *SynchronousCallInDebuggerThread)(
        IDebugApplication32 *This,
        IDebugThreadCall32 *pptc,
        DWORD dwParam1,
        DWORD dwParam2,
        DWORD dwParam3);

    HRESULT (STDMETHODCALLTYPE *CreateApplicationNode)(
        IDebugApplication32 *This,
        IDebugApplicationNode **ppdanNew);

    HRESULT (STDMETHODCALLTYPE *FireDebuggerEvent)(
        IDebugApplication32 *This,
        REFGUID riid,
        IUnknown *punk);

    HRESULT (STDMETHODCALLTYPE *HandleRuntimeError)(
        IDebugApplication32 *This,
        IActiveScriptErrorDebug *pErrorDebug,
        IActiveScriptSite *pScriptSite,
        BREAKRESUMEACTION *pbra,
        ERRORRESUMEACTION *perra,
        WINBOOL *pfCallOnScriptError);

    WINBOOL (STDMETHODCALLTYPE *FCanJitDebug)(
        IDebugApplication32 *This);

    WINBOOL (STDMETHODCALLTYPE *FIsAutoJitDebugEnabled)(
        IDebugApplication32 *This);

    HRESULT (STDMETHODCALLTYPE *AddGlobalExpressionContextProvider)(
        IDebugApplication32 *This,
        IProvideExpressionContexts *pdsfs,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *RemoveGlobalExpressionContextProvider)(
        IDebugApplication32 *This,
        DWORD dwCookie);

    END_INTERFACE
} IDebugApplication32Vtbl;

interface IDebugApplication32 {
    CONST_VTBL IDebugApplication32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplication32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplication32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplication32_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplication methods ***/
#define IDebugApplication32_ResumeFromBreakPoint(This,prptFocus,bra,era) (This)->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era)
#define IDebugApplication32_CauseBreak(This) (This)->lpVtbl->CauseBreak(This)
#define IDebugApplication32_ConnectDebugger(This,pad) (This)->lpVtbl->ConnectDebugger(This,pad)
#define IDebugApplication32_DisconnectDebugger(This) (This)->lpVtbl->DisconnectDebugger(This)
#define IDebugApplication32_GetDebugger(This,pad) (This)->lpVtbl->GetDebugger(This,pad)
#define IDebugApplication32_CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject) (This)->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
#define IDebugApplication32_QueryAlive(This) (This)->lpVtbl->QueryAlive(This)
#define IDebugApplication32_EnumThreads(This,pperdat) (This)->lpVtbl->EnumThreads(This,pperdat)
#define IDebugApplication32_GetName(This,pbstrName) (This)->lpVtbl->GetName(This,pbstrName)
#define IDebugApplication32_GetRootNode(This,ppdanRoot) (This)->lpVtbl->GetRootNode(This,ppdanRoot)
#define IDebugApplication32_EnumGlobalExpressionContexts(This,ppedec) (This)->lpVtbl->EnumGlobalExpressionContexts(This,ppedec)
/*** IDebugApplication32 methods ***/
#define IDebugApplication32_SetName(This,pstrName) (This)->lpVtbl->SetName(This,pstrName)
#define IDebugApplication32_StepOutComplete(This) (This)->lpVtbl->StepOutComplete(This)
#define IDebugApplication32_DebugOutput(This,pstr) (This)->lpVtbl->DebugOutput(This,pstr)
#define IDebugApplication32_StartDebugSession(This) (This)->lpVtbl->StartDebugSession(This)
#define IDebugApplication32_HandleBreakPoint(This,br,pbra) (This)->lpVtbl->HandleBreakPoint(This,br,pbra)
#define IDebugApplication32_Close(This) (This)->lpVtbl->Close(This)
#define IDebugApplication32_GetBreakFlags(This,pabf,pprdatSteppingThread) (This)->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread)
#define IDebugApplication32_GetCurrentThread(This,pat) (This)->lpVtbl->GetCurrentThread(This,pat)
#define IDebugApplication32_CreateAsyncDebugOperation(This,psdo,ppado) (This)->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado)
#define IDebugApplication32_AddStackFrameSniffer(This,pdsfs,pdwCookie) (This)->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie)
#define IDebugApplication32_RemoveStackFrameSniffer(This,dwCookie) (This)->lpVtbl->RemoveStackFrameSniffer(This,dwCookie)
#define IDebugApplication32_QueryCurrentThreadIsDebuggerThread(This) (This)->lpVtbl->QueryCurrentThreadIsDebuggerThread(This)
#define IDebugApplication32_SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3)
#define IDebugApplication32_CreateApplicationNode(This,ppdanNew) (This)->lpVtbl->CreateApplicationNode(This,ppdanNew)
#define IDebugApplication32_FireDebuggerEvent(This,riid,punk) (This)->lpVtbl->FireDebuggerEvent(This,riid,punk)
#define IDebugApplication32_HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError) (This)->lpVtbl->HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError)
#define IDebugApplication32_FCanJitDebug(This) (This)->lpVtbl->FCanJitDebug(This)
#define IDebugApplication32_FIsAutoJitDebugEnabled(This) (This)->lpVtbl->FIsAutoJitDebugEnabled(This)
#define IDebugApplication32_AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie) (This)->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie)
#define IDebugApplication32_RemoveGlobalExpressionContextProvider(This,dwCookie) (This)->lpVtbl->RemoveGlobalExpressionContextProvider(This,dwCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplication32_QueryInterface(IDebugApplication32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplication32_AddRef(IDebugApplication32* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplication32_Release(IDebugApplication32* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplication methods ***/
static FORCEINLINE HRESULT IDebugApplication32_ResumeFromBreakPoint(IDebugApplication32* This,IRemoteDebugApplicationThread *prptFocus,BREAKRESUMEACTION bra,ERRORRESUMEACTION era) {
    return This->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era);
}
static FORCEINLINE HRESULT IDebugApplication32_CauseBreak(IDebugApplication32* This) {
    return This->lpVtbl->CauseBreak(This);
}
static FORCEINLINE HRESULT IDebugApplication32_ConnectDebugger(IDebugApplication32* This,IApplicationDebugger *pad) {
    return This->lpVtbl->ConnectDebugger(This,pad);
}
static FORCEINLINE HRESULT IDebugApplication32_DisconnectDebugger(IDebugApplication32* This) {
    return This->lpVtbl->DisconnectDebugger(This);
}
static FORCEINLINE HRESULT IDebugApplication32_GetDebugger(IDebugApplication32* This,IApplicationDebugger **pad) {
    return This->lpVtbl->GetDebugger(This,pad);
}
static FORCEINLINE HRESULT IDebugApplication32_CreateInstanceAtApplication(IDebugApplication32* This,REFCLSID rclsid,IUnknown *pUnkOuter,DWORD dwClsContext,REFIID riid,IUnknown **ppvObject) {
    return This->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject);
}
static FORCEINLINE HRESULT IDebugApplication32_QueryAlive(IDebugApplication32* This) {
    return This->lpVtbl->QueryAlive(This);
}
static FORCEINLINE HRESULT IDebugApplication32_EnumThreads(IDebugApplication32* This,IEnumRemoteDebugApplicationThreads **pperdat) {
    return This->lpVtbl->EnumThreads(This,pperdat);
}
static FORCEINLINE HRESULT IDebugApplication32_GetName(IDebugApplication32* This,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,pbstrName);
}
static FORCEINLINE HRESULT IDebugApplication32_GetRootNode(IDebugApplication32* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootNode(This,ppdanRoot);
}
static FORCEINLINE HRESULT IDebugApplication32_EnumGlobalExpressionContexts(IDebugApplication32* This,IEnumDebugExpressionContexts **ppedec) {
    return This->lpVtbl->EnumGlobalExpressionContexts(This,ppedec);
}
/*** IDebugApplication32 methods ***/
static FORCEINLINE HRESULT IDebugApplication32_SetName(IDebugApplication32* This,LPCOLESTR pstrName) {
    return This->lpVtbl->SetName(This,pstrName);
}
static FORCEINLINE HRESULT IDebugApplication32_StepOutComplete(IDebugApplication32* This) {
    return This->lpVtbl->StepOutComplete(This);
}
static FORCEINLINE HRESULT IDebugApplication32_DebugOutput(IDebugApplication32* This,LPCOLESTR pstr) {
    return This->lpVtbl->DebugOutput(This,pstr);
}
static FORCEINLINE HRESULT IDebugApplication32_StartDebugSession(IDebugApplication32* This) {
    return This->lpVtbl->StartDebugSession(This);
}
static FORCEINLINE HRESULT IDebugApplication32_HandleBreakPoint(IDebugApplication32* This,BREAKREASON br,BREAKRESUMEACTION *pbra) {
    return This->lpVtbl->HandleBreakPoint(This,br,pbra);
}
static FORCEINLINE HRESULT IDebugApplication32_Close(IDebugApplication32* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IDebugApplication32_GetBreakFlags(IDebugApplication32* This,APPBREAKFLAGS *pabf,IRemoteDebugApplicationThread **pprdatSteppingThread) {
    return This->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread);
}
static FORCEINLINE HRESULT IDebugApplication32_GetCurrentThread(IDebugApplication32* This,IDebugApplicationThread **pat) {
    return This->lpVtbl->GetCurrentThread(This,pat);
}
static FORCEINLINE HRESULT IDebugApplication32_CreateAsyncDebugOperation(IDebugApplication32* This,IDebugSyncOperation *psdo,IDebugAsyncOperation **ppado) {
    return This->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado);
}
static FORCEINLINE HRESULT IDebugApplication32_AddStackFrameSniffer(IDebugApplication32* This,IDebugStackFrameSniffer *pdsfs,DWORD *pdwCookie) {
    return This->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie);
}
static FORCEINLINE HRESULT IDebugApplication32_RemoveStackFrameSniffer(IDebugApplication32* This,DWORD dwCookie) {
    return This->lpVtbl->RemoveStackFrameSniffer(This,dwCookie);
}
static FORCEINLINE HRESULT IDebugApplication32_QueryCurrentThreadIsDebuggerThread(IDebugApplication32* This) {
    return This->lpVtbl->QueryCurrentThreadIsDebuggerThread(This);
}
static FORCEINLINE HRESULT IDebugApplication32_SynchronousCallInDebuggerThread(IDebugApplication32* This,IDebugThreadCall32 *pptc,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
    return This->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
static FORCEINLINE HRESULT IDebugApplication32_CreateApplicationNode(IDebugApplication32* This,IDebugApplicationNode **ppdanNew) {
    return This->lpVtbl->CreateApplicationNode(This,ppdanNew);
}
static FORCEINLINE HRESULT IDebugApplication32_FireDebuggerEvent(IDebugApplication32* This,REFGUID riid,IUnknown *punk) {
    return This->lpVtbl->FireDebuggerEvent(This,riid,punk);
}
static FORCEINLINE HRESULT IDebugApplication32_HandleRuntimeError(IDebugApplication32* This,IActiveScriptErrorDebug *pErrorDebug,IActiveScriptSite *pScriptSite,BREAKRESUMEACTION *pbra,ERRORRESUMEACTION *perra,WINBOOL *pfCallOnScriptError) {
    return This->lpVtbl->HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError);
}
static FORCEINLINE WINBOOL IDebugApplication32_FCanJitDebug(IDebugApplication32* This) {
    return This->lpVtbl->FCanJitDebug(This);
}
static FORCEINLINE WINBOOL IDebugApplication32_FIsAutoJitDebugEnabled(IDebugApplication32* This) {
    return This->lpVtbl->FIsAutoJitDebugEnabled(This);
}
static FORCEINLINE HRESULT IDebugApplication32_AddGlobalExpressionContextProvider(IDebugApplication32* This,IProvideExpressionContexts *pdsfs,DWORD *pdwCookie) {
    return This->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie);
}
static FORCEINLINE HRESULT IDebugApplication32_RemoveGlobalExpressionContextProvider(IDebugApplication32* This,DWORD dwCookie) {
    return This->lpVtbl->RemoveGlobalExpressionContextProvider(This,dwCookie);
}
#endif
#endif

#endif


#endif  /* __IDebugApplication32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplication64 interface
 */
#ifndef __IDebugApplication64_INTERFACE_DEFINED__
#define __IDebugApplication64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplication64, 0x4dedc754, 0x04c7, 0x4f10, 0x9e,0x60, 0x16,0xa3,0x90,0xfe,0x6e,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4dedc754-04c7-4f10-9e60-16a390fe6e62")
IDebugApplication64 : public IRemoteDebugApplication
{
    virtual HRESULT STDMETHODCALLTYPE SetName(
        LPCOLESTR pstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE StepOutComplete(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE DebugOutput(
        LPCOLESTR pstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartDebugSession(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE HandleBreakPoint(
        BREAKREASON br,
        BREAKRESUMEACTION *pbra) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBreakFlags(
        APPBREAKFLAGS *pabf,
        IRemoteDebugApplicationThread **pprdatSteppingThread) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentThread(
        IDebugApplicationThread **pat) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAsyncDebugOperation(
        IDebugSyncOperation *psdo,
        IDebugAsyncOperation **ppado) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStackFrameSniffer(
        IDebugStackFrameSniffer *pdsfs,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStackFrameSniffer(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryCurrentThreadIsDebuggerThread(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SynchronousCallInDebuggerThread(
        IDebugThreadCall64 *pptc,
        DWORDLONG dwParam1,
        DWORDLONG dwParam2,
        DWORDLONG dwParam3) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateApplicationNode(
        IDebugApplicationNode **ppdanNew) = 0;

    virtual HRESULT STDMETHODCALLTYPE FireDebuggerEvent(
        REFGUID riid,
        IUnknown *punk) = 0;

    virtual HRESULT STDMETHODCALLTYPE HandleRuntimeError(
        IActiveScriptErrorDebug *pErrorDebug,
        IActiveScriptSite *pScriptSite,
        BREAKRESUMEACTION *pbra,
        ERRORRESUMEACTION *perra,
        WINBOOL *pfCallOnScriptError) = 0;

    virtual WINBOOL STDMETHODCALLTYPE FCanJitDebug(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE FIsAutoJitDebugEnabled(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddGlobalExpressionContextProvider(
        IProvideExpressionContexts *pdsfs,
        DWORDLONG *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveGlobalExpressionContextProvider(
        DWORDLONG dwCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplication64, 0x4dedc754, 0x04c7, 0x4f10, 0x9e,0x60, 0x16,0xa3,0x90,0xfe,0x6e,0x62)
#endif
#else
typedef struct IDebugApplication64Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplication methods ***/
    HRESULT (STDMETHODCALLTYPE *ResumeFromBreakPoint)(
        IDebugApplication64 *This,
        IRemoteDebugApplicationThread *prptFocus,
        BREAKRESUMEACTION bra,
        ERRORRESUMEACTION era);

    HRESULT (STDMETHODCALLTYPE *CauseBreak)(
        IDebugApplication64 *This);

    HRESULT (STDMETHODCALLTYPE *ConnectDebugger)(
        IDebugApplication64 *This,
        IApplicationDebugger *pad);

    HRESULT (STDMETHODCALLTYPE *DisconnectDebugger)(
        IDebugApplication64 *This);

    HRESULT (STDMETHODCALLTYPE *GetDebugger)(
        IDebugApplication64 *This,
        IApplicationDebugger **pad);

    HRESULT (STDMETHODCALLTYPE *CreateInstanceAtApplication)(
        IDebugApplication64 *This,
        REFCLSID rclsid,
        IUnknown *pUnkOuter,
        DWORD dwClsContext,
        REFIID riid,
        IUnknown **ppvObject);

    HRESULT (STDMETHODCALLTYPE *QueryAlive)(
        IDebugApplication64 *This);

    HRESULT (STDMETHODCALLTYPE *EnumThreads)(
        IDebugApplication64 *This,
        IEnumRemoteDebugApplicationThreads **pperdat);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugApplication64 *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetRootNode)(
        IDebugApplication64 *This,
        IDebugApplicationNode **ppdanRoot);

    HRESULT (STDMETHODCALLTYPE *EnumGlobalExpressionContexts)(
        IDebugApplication64 *This,
        IEnumDebugExpressionContexts **ppedec);

    /*** IDebugApplication64 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetName)(
        IDebugApplication64 *This,
        LPCOLESTR pstrName);

    HRESULT (STDMETHODCALLTYPE *StepOutComplete)(
        IDebugApplication64 *This);

    HRESULT (STDMETHODCALLTYPE *DebugOutput)(
        IDebugApplication64 *This,
        LPCOLESTR pstr);

    HRESULT (STDMETHODCALLTYPE *StartDebugSession)(
        IDebugApplication64 *This);

    HRESULT (STDMETHODCALLTYPE *HandleBreakPoint)(
        IDebugApplication64 *This,
        BREAKREASON br,
        BREAKRESUMEACTION *pbra);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IDebugApplication64 *This);

    HRESULT (STDMETHODCALLTYPE *GetBreakFlags)(
        IDebugApplication64 *This,
        APPBREAKFLAGS *pabf,
        IRemoteDebugApplicationThread **pprdatSteppingThread);

    HRESULT (STDMETHODCALLTYPE *GetCurrentThread)(
        IDebugApplication64 *This,
        IDebugApplicationThread **pat);

    HRESULT (STDMETHODCALLTYPE *CreateAsyncDebugOperation)(
        IDebugApplication64 *This,
        IDebugSyncOperation *psdo,
        IDebugAsyncOperation **ppado);

    HRESULT (STDMETHODCALLTYPE *AddStackFrameSniffer)(
        IDebugApplication64 *This,
        IDebugStackFrameSniffer *pdsfs,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *RemoveStackFrameSniffer)(
        IDebugApplication64 *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *QueryCurrentThreadIsDebuggerThread)(
        IDebugApplication64 *This);

    HRESULT (STDMETHODCALLTYPE *SynchronousCallInDebuggerThread)(
        IDebugApplication64 *This,
        IDebugThreadCall64 *pptc,
        DWORDLONG dwParam1,
        DWORDLONG dwParam2,
        DWORDLONG dwParam3);

    HRESULT (STDMETHODCALLTYPE *CreateApplicationNode)(
        IDebugApplication64 *This,
        IDebugApplicationNode **ppdanNew);

    HRESULT (STDMETHODCALLTYPE *FireDebuggerEvent)(
        IDebugApplication64 *This,
        REFGUID riid,
        IUnknown *punk);

    HRESULT (STDMETHODCALLTYPE *HandleRuntimeError)(
        IDebugApplication64 *This,
        IActiveScriptErrorDebug *pErrorDebug,
        IActiveScriptSite *pScriptSite,
        BREAKRESUMEACTION *pbra,
        ERRORRESUMEACTION *perra,
        WINBOOL *pfCallOnScriptError);

    WINBOOL (STDMETHODCALLTYPE *FCanJitDebug)(
        IDebugApplication64 *This);

    WINBOOL (STDMETHODCALLTYPE *FIsAutoJitDebugEnabled)(
        IDebugApplication64 *This);

    HRESULT (STDMETHODCALLTYPE *AddGlobalExpressionContextProvider)(
        IDebugApplication64 *This,
        IProvideExpressionContexts *pdsfs,
        DWORDLONG *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *RemoveGlobalExpressionContextProvider)(
        IDebugApplication64 *This,
        DWORDLONG dwCookie);

    END_INTERFACE
} IDebugApplication64Vtbl;

interface IDebugApplication64 {
    CONST_VTBL IDebugApplication64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplication64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplication64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplication64_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplication methods ***/
#define IDebugApplication64_ResumeFromBreakPoint(This,prptFocus,bra,era) (This)->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era)
#define IDebugApplication64_CauseBreak(This) (This)->lpVtbl->CauseBreak(This)
#define IDebugApplication64_ConnectDebugger(This,pad) (This)->lpVtbl->ConnectDebugger(This,pad)
#define IDebugApplication64_DisconnectDebugger(This) (This)->lpVtbl->DisconnectDebugger(This)
#define IDebugApplication64_GetDebugger(This,pad) (This)->lpVtbl->GetDebugger(This,pad)
#define IDebugApplication64_CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject) (This)->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
#define IDebugApplication64_QueryAlive(This) (This)->lpVtbl->QueryAlive(This)
#define IDebugApplication64_EnumThreads(This,pperdat) (This)->lpVtbl->EnumThreads(This,pperdat)
#define IDebugApplication64_GetName(This,pbstrName) (This)->lpVtbl->GetName(This,pbstrName)
#define IDebugApplication64_GetRootNode(This,ppdanRoot) (This)->lpVtbl->GetRootNode(This,ppdanRoot)
#define IDebugApplication64_EnumGlobalExpressionContexts(This,ppedec) (This)->lpVtbl->EnumGlobalExpressionContexts(This,ppedec)
/*** IDebugApplication64 methods ***/
#define IDebugApplication64_SetName(This,pstrName) (This)->lpVtbl->SetName(This,pstrName)
#define IDebugApplication64_StepOutComplete(This) (This)->lpVtbl->StepOutComplete(This)
#define IDebugApplication64_DebugOutput(This,pstr) (This)->lpVtbl->DebugOutput(This,pstr)
#define IDebugApplication64_StartDebugSession(This) (This)->lpVtbl->StartDebugSession(This)
#define IDebugApplication64_HandleBreakPoint(This,br,pbra) (This)->lpVtbl->HandleBreakPoint(This,br,pbra)
#define IDebugApplication64_Close(This) (This)->lpVtbl->Close(This)
#define IDebugApplication64_GetBreakFlags(This,pabf,pprdatSteppingThread) (This)->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread)
#define IDebugApplication64_GetCurrentThread(This,pat) (This)->lpVtbl->GetCurrentThread(This,pat)
#define IDebugApplication64_CreateAsyncDebugOperation(This,psdo,ppado) (This)->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado)
#define IDebugApplication64_AddStackFrameSniffer(This,pdsfs,pdwCookie) (This)->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie)
#define IDebugApplication64_RemoveStackFrameSniffer(This,dwCookie) (This)->lpVtbl->RemoveStackFrameSniffer(This,dwCookie)
#define IDebugApplication64_QueryCurrentThreadIsDebuggerThread(This) (This)->lpVtbl->QueryCurrentThreadIsDebuggerThread(This)
#define IDebugApplication64_SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3)
#define IDebugApplication64_CreateApplicationNode(This,ppdanNew) (This)->lpVtbl->CreateApplicationNode(This,ppdanNew)
#define IDebugApplication64_FireDebuggerEvent(This,riid,punk) (This)->lpVtbl->FireDebuggerEvent(This,riid,punk)
#define IDebugApplication64_HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError) (This)->lpVtbl->HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError)
#define IDebugApplication64_FCanJitDebug(This) (This)->lpVtbl->FCanJitDebug(This)
#define IDebugApplication64_FIsAutoJitDebugEnabled(This) (This)->lpVtbl->FIsAutoJitDebugEnabled(This)
#define IDebugApplication64_AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie) (This)->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie)
#define IDebugApplication64_RemoveGlobalExpressionContextProvider(This,dwCookie) (This)->lpVtbl->RemoveGlobalExpressionContextProvider(This,dwCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplication64_QueryInterface(IDebugApplication64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplication64_AddRef(IDebugApplication64* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplication64_Release(IDebugApplication64* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplication methods ***/
static FORCEINLINE HRESULT IDebugApplication64_ResumeFromBreakPoint(IDebugApplication64* This,IRemoteDebugApplicationThread *prptFocus,BREAKRESUMEACTION bra,ERRORRESUMEACTION era) {
    return This->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era);
}
static FORCEINLINE HRESULT IDebugApplication64_CauseBreak(IDebugApplication64* This) {
    return This->lpVtbl->CauseBreak(This);
}
static FORCEINLINE HRESULT IDebugApplication64_ConnectDebugger(IDebugApplication64* This,IApplicationDebugger *pad) {
    return This->lpVtbl->ConnectDebugger(This,pad);
}
static FORCEINLINE HRESULT IDebugApplication64_DisconnectDebugger(IDebugApplication64* This) {
    return This->lpVtbl->DisconnectDebugger(This);
}
static FORCEINLINE HRESULT IDebugApplication64_GetDebugger(IDebugApplication64* This,IApplicationDebugger **pad) {
    return This->lpVtbl->GetDebugger(This,pad);
}
static FORCEINLINE HRESULT IDebugApplication64_CreateInstanceAtApplication(IDebugApplication64* This,REFCLSID rclsid,IUnknown *pUnkOuter,DWORD dwClsContext,REFIID riid,IUnknown **ppvObject) {
    return This->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject);
}
static FORCEINLINE HRESULT IDebugApplication64_QueryAlive(IDebugApplication64* This) {
    return This->lpVtbl->QueryAlive(This);
}
static FORCEINLINE HRESULT IDebugApplication64_EnumThreads(IDebugApplication64* This,IEnumRemoteDebugApplicationThreads **pperdat) {
    return This->lpVtbl->EnumThreads(This,pperdat);
}
static FORCEINLINE HRESULT IDebugApplication64_GetName(IDebugApplication64* This,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,pbstrName);
}
static FORCEINLINE HRESULT IDebugApplication64_GetRootNode(IDebugApplication64* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootNode(This,ppdanRoot);
}
static FORCEINLINE HRESULT IDebugApplication64_EnumGlobalExpressionContexts(IDebugApplication64* This,IEnumDebugExpressionContexts **ppedec) {
    return This->lpVtbl->EnumGlobalExpressionContexts(This,ppedec);
}
/*** IDebugApplication64 methods ***/
static FORCEINLINE HRESULT IDebugApplication64_SetName(IDebugApplication64* This,LPCOLESTR pstrName) {
    return This->lpVtbl->SetName(This,pstrName);
}
static FORCEINLINE HRESULT IDebugApplication64_StepOutComplete(IDebugApplication64* This) {
    return This->lpVtbl->StepOutComplete(This);
}
static FORCEINLINE HRESULT IDebugApplication64_DebugOutput(IDebugApplication64* This,LPCOLESTR pstr) {
    return This->lpVtbl->DebugOutput(This,pstr);
}
static FORCEINLINE HRESULT IDebugApplication64_StartDebugSession(IDebugApplication64* This) {
    return This->lpVtbl->StartDebugSession(This);
}
static FORCEINLINE HRESULT IDebugApplication64_HandleBreakPoint(IDebugApplication64* This,BREAKREASON br,BREAKRESUMEACTION *pbra) {
    return This->lpVtbl->HandleBreakPoint(This,br,pbra);
}
static FORCEINLINE HRESULT IDebugApplication64_Close(IDebugApplication64* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IDebugApplication64_GetBreakFlags(IDebugApplication64* This,APPBREAKFLAGS *pabf,IRemoteDebugApplicationThread **pprdatSteppingThread) {
    return This->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread);
}
static FORCEINLINE HRESULT IDebugApplication64_GetCurrentThread(IDebugApplication64* This,IDebugApplicationThread **pat) {
    return This->lpVtbl->GetCurrentThread(This,pat);
}
static FORCEINLINE HRESULT IDebugApplication64_CreateAsyncDebugOperation(IDebugApplication64* This,IDebugSyncOperation *psdo,IDebugAsyncOperation **ppado) {
    return This->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado);
}
static FORCEINLINE HRESULT IDebugApplication64_AddStackFrameSniffer(IDebugApplication64* This,IDebugStackFrameSniffer *pdsfs,DWORD *pdwCookie) {
    return This->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie);
}
static FORCEINLINE HRESULT IDebugApplication64_RemoveStackFrameSniffer(IDebugApplication64* This,DWORD dwCookie) {
    return This->lpVtbl->RemoveStackFrameSniffer(This,dwCookie);
}
static FORCEINLINE HRESULT IDebugApplication64_QueryCurrentThreadIsDebuggerThread(IDebugApplication64* This) {
    return This->lpVtbl->QueryCurrentThreadIsDebuggerThread(This);
}
static FORCEINLINE HRESULT IDebugApplication64_SynchronousCallInDebuggerThread(IDebugApplication64* This,IDebugThreadCall64 *pptc,DWORDLONG dwParam1,DWORDLONG dwParam2,DWORDLONG dwParam3) {
    return This->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
static FORCEINLINE HRESULT IDebugApplication64_CreateApplicationNode(IDebugApplication64* This,IDebugApplicationNode **ppdanNew) {
    return This->lpVtbl->CreateApplicationNode(This,ppdanNew);
}
static FORCEINLINE HRESULT IDebugApplication64_FireDebuggerEvent(IDebugApplication64* This,REFGUID riid,IUnknown *punk) {
    return This->lpVtbl->FireDebuggerEvent(This,riid,punk);
}
static FORCEINLINE HRESULT IDebugApplication64_HandleRuntimeError(IDebugApplication64* This,IActiveScriptErrorDebug *pErrorDebug,IActiveScriptSite *pScriptSite,BREAKRESUMEACTION *pbra,ERRORRESUMEACTION *perra,WINBOOL *pfCallOnScriptError) {
    return This->lpVtbl->HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError);
}
static FORCEINLINE WINBOOL IDebugApplication64_FCanJitDebug(IDebugApplication64* This) {
    return This->lpVtbl->FCanJitDebug(This);
}
static FORCEINLINE WINBOOL IDebugApplication64_FIsAutoJitDebugEnabled(IDebugApplication64* This) {
    return This->lpVtbl->FIsAutoJitDebugEnabled(This);
}
static FORCEINLINE HRESULT IDebugApplication64_AddGlobalExpressionContextProvider(IDebugApplication64* This,IProvideExpressionContexts *pdsfs,DWORDLONG *pdwCookie) {
    return This->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie);
}
static FORCEINLINE HRESULT IDebugApplication64_RemoveGlobalExpressionContextProvider(IDebugApplication64* This,DWORDLONG dwCookie) {
    return This->lpVtbl->RemoveGlobalExpressionContextProvider(This,dwCookie);
}
#endif
#endif

#endif


#endif  /* __IDebugApplication64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRemoteDebugApplicationEvents interface
 */
#ifndef __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__
#define __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRemoteDebugApplicationEvents, 0x51973c33, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c33-cb0c-11d0-b5c9-00a0244a0e7a")
IRemoteDebugApplicationEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnConnectDebugger(
        IApplicationDebugger *pad) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDisconnectDebugger(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnSetName(
        LPCOLESTR pstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDebugOutput(
        LPCOLESTR pstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnClose(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnEnterBreakPoint(
        IRemoteDebugApplicationThread *prdat) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnLeaveBreakPoint(
        IRemoteDebugApplicationThread *prdat) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnCreateThread(
        IRemoteDebugApplicationThread *prdat) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDestroyThread(
        IRemoteDebugApplicationThread *prdat) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnBreakFlagChange(
        APPBREAKFLAGS abf,
        IRemoteDebugApplicationThread *prdatSteppingThread) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRemoteDebugApplicationEvents, 0x51973c33, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IRemoteDebugApplicationEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplicationEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnConnectDebugger)(
        IRemoteDebugApplicationEvents *This,
        IApplicationDebugger *pad);

    HRESULT (STDMETHODCALLTYPE *OnDisconnectDebugger)(
        IRemoteDebugApplicationEvents *This);

    HRESULT (STDMETHODCALLTYPE *OnSetName)(
        IRemoteDebugApplicationEvents *This,
        LPCOLESTR pstrName);

    HRESULT (STDMETHODCALLTYPE *OnDebugOutput)(
        IRemoteDebugApplicationEvents *This,
        LPCOLESTR pstr);

    HRESULT (STDMETHODCALLTYPE *OnClose)(
        IRemoteDebugApplicationEvents *This);

    HRESULT (STDMETHODCALLTYPE *OnEnterBreakPoint)(
        IRemoteDebugApplicationEvents *This,
        IRemoteDebugApplicationThread *prdat);

    HRESULT (STDMETHODCALLTYPE *OnLeaveBreakPoint)(
        IRemoteDebugApplicationEvents *This,
        IRemoteDebugApplicationThread *prdat);

    HRESULT (STDMETHODCALLTYPE *OnCreateThread)(
        IRemoteDebugApplicationEvents *This,
        IRemoteDebugApplicationThread *prdat);

    HRESULT (STDMETHODCALLTYPE *OnDestroyThread)(
        IRemoteDebugApplicationEvents *This,
        IRemoteDebugApplicationThread *prdat);

    HRESULT (STDMETHODCALLTYPE *OnBreakFlagChange)(
        IRemoteDebugApplicationEvents *This,
        APPBREAKFLAGS abf,
        IRemoteDebugApplicationThread *prdatSteppingThread);

    END_INTERFACE
} IRemoteDebugApplicationEventsVtbl;

interface IRemoteDebugApplicationEvents {
    CONST_VTBL IRemoteDebugApplicationEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRemoteDebugApplicationEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRemoteDebugApplicationEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRemoteDebugApplicationEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplicationEvents methods ***/
#define IRemoteDebugApplicationEvents_OnConnectDebugger(This,pad) (This)->lpVtbl->OnConnectDebugger(This,pad)
#define IRemoteDebugApplicationEvents_OnDisconnectDebugger(This) (This)->lpVtbl->OnDisconnectDebugger(This)
#define IRemoteDebugApplicationEvents_OnSetName(This,pstrName) (This)->lpVtbl->OnSetName(This,pstrName)
#define IRemoteDebugApplicationEvents_OnDebugOutput(This,pstr) (This)->lpVtbl->OnDebugOutput(This,pstr)
#define IRemoteDebugApplicationEvents_OnClose(This) (This)->lpVtbl->OnClose(This)
#define IRemoteDebugApplicationEvents_OnEnterBreakPoint(This,prdat) (This)->lpVtbl->OnEnterBreakPoint(This,prdat)
#define IRemoteDebugApplicationEvents_OnLeaveBreakPoint(This,prdat) (This)->lpVtbl->OnLeaveBreakPoint(This,prdat)
#define IRemoteDebugApplicationEvents_OnCreateThread(This,prdat) (This)->lpVtbl->OnCreateThread(This,prdat)
#define IRemoteDebugApplicationEvents_OnDestroyThread(This,prdat) (This)->lpVtbl->OnDestroyThread(This,prdat)
#define IRemoteDebugApplicationEvents_OnBreakFlagChange(This,abf,prdatSteppingThread) (This)->lpVtbl->OnBreakFlagChange(This,abf,prdatSteppingThread)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_QueryInterface(IRemoteDebugApplicationEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRemoteDebugApplicationEvents_AddRef(IRemoteDebugApplicationEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRemoteDebugApplicationEvents_Release(IRemoteDebugApplicationEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplicationEvents methods ***/
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnConnectDebugger(IRemoteDebugApplicationEvents* This,IApplicationDebugger *pad) {
    return This->lpVtbl->OnConnectDebugger(This,pad);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnDisconnectDebugger(IRemoteDebugApplicationEvents* This) {
    return This->lpVtbl->OnDisconnectDebugger(This);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnSetName(IRemoteDebugApplicationEvents* This,LPCOLESTR pstrName) {
    return This->lpVtbl->OnSetName(This,pstrName);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnDebugOutput(IRemoteDebugApplicationEvents* This,LPCOLESTR pstr) {
    return This->lpVtbl->OnDebugOutput(This,pstr);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnClose(IRemoteDebugApplicationEvents* This) {
    return This->lpVtbl->OnClose(This);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnEnterBreakPoint(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
    return This->lpVtbl->OnEnterBreakPoint(This,prdat);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnLeaveBreakPoint(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
    return This->lpVtbl->OnLeaveBreakPoint(This,prdat);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnCreateThread(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
    return This->lpVtbl->OnCreateThread(This,prdat);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnDestroyThread(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
    return This->lpVtbl->OnDestroyThread(This,prdat);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnBreakFlagChange(IRemoteDebugApplicationEvents* This,APPBREAKFLAGS abf,IRemoteDebugApplicationThread *prdatSteppingThread) {
    return This->lpVtbl->OnBreakFlagChange(This,abf,prdatSteppingThread);
}
#endif
#endif

#endif


#endif  /* __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplicationNode interface
 */
#ifndef __IDebugApplicationNode_INTERFACE_DEFINED__
#define __IDebugApplicationNode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplicationNode, 0x51973c34, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c34-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugApplicationNode : public IDebugDocumentProvider
{
    virtual HRESULT STDMETHODCALLTYPE EnumChildren(
        IEnumDebugApplicationNodes **pperddp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetParent(
        IDebugApplicationNode **pprddp) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDocumentProvider(
        IDebugDocumentProvider *pddp) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Attach(
        IDebugApplicationNode *pdanParent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Detach(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplicationNode, 0x51973c34, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugApplicationNodeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugDocumentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugApplicationNode *This,
        DOCUMENTNAMETYPE dnt,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
        IDebugApplicationNode *This,
        CLSID *pclsidDocument);

    /*** IDebugDocumentProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocument)(
        IDebugApplicationNode *This,
        IDebugDocument **ppssd);

    /*** IDebugApplicationNode methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumChildren)(
        IDebugApplicationNode *This,
        IEnumDebugApplicationNodes **pperddp);

    HRESULT (STDMETHODCALLTYPE *GetParent)(
        IDebugApplicationNode *This,
        IDebugApplicationNode **pprddp);

    HRESULT (STDMETHODCALLTYPE *SetDocumentProvider)(
        IDebugApplicationNode *This,
        IDebugDocumentProvider *pddp);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IDebugApplicationNode *This);

    HRESULT (STDMETHODCALLTYPE *Attach)(
        IDebugApplicationNode *This,
        IDebugApplicationNode *pdanParent);

    HRESULT (STDMETHODCALLTYPE *Detach)(
        IDebugApplicationNode *This);

    END_INTERFACE
} IDebugApplicationNodeVtbl;

interface IDebugApplicationNode {
    CONST_VTBL IDebugApplicationNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplicationNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplicationNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplicationNode_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugDocumentInfo methods ***/
#define IDebugApplicationNode_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
#define IDebugApplicationNode_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
/*** IDebugDocumentProvider methods ***/
#define IDebugApplicationNode_GetDocument(This,ppssd) (This)->lpVtbl->GetDocument(This,ppssd)
/*** IDebugApplicationNode methods ***/
#define IDebugApplicationNode_EnumChildren(This,pperddp) (This)->lpVtbl->EnumChildren(This,pperddp)
#define IDebugApplicationNode_GetParent(This,pprddp) (This)->lpVtbl->GetParent(This,pprddp)
#define IDebugApplicationNode_SetDocumentProvider(This,pddp) (This)->lpVtbl->SetDocumentProvider(This,pddp)
#define IDebugApplicationNode_Close(This) (This)->lpVtbl->Close(This)
#define IDebugApplicationNode_Attach(This,pdanParent) (This)->lpVtbl->Attach(This,pdanParent)
#define IDebugApplicationNode_Detach(This) (This)->lpVtbl->Detach(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplicationNode_QueryInterface(IDebugApplicationNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplicationNode_AddRef(IDebugApplicationNode* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplicationNode_Release(IDebugApplicationNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static FORCEINLINE HRESULT IDebugApplicationNode_GetName(IDebugApplicationNode* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static FORCEINLINE HRESULT IDebugApplicationNode_GetDocumentClassId(IDebugApplicationNode* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
/*** IDebugDocumentProvider methods ***/
static FORCEINLINE HRESULT IDebugApplicationNode_GetDocument(IDebugApplicationNode* This,IDebugDocument **ppssd) {
    return This->lpVtbl->GetDocument(This,ppssd);
}
/*** IDebugApplicationNode methods ***/
static FORCEINLINE HRESULT IDebugApplicationNode_EnumChildren(IDebugApplicationNode* This,IEnumDebugApplicationNodes **pperddp) {
    return This->lpVtbl->EnumChildren(This,pperddp);
}
static FORCEINLINE HRESULT IDebugApplicationNode_GetParent(IDebugApplicationNode* This,IDebugApplicationNode **pprddp) {
    return This->lpVtbl->GetParent(This,pprddp);
}
static FORCEINLINE HRESULT IDebugApplicationNode_SetDocumentProvider(IDebugApplicationNode* This,IDebugDocumentProvider *pddp) {
    return This->lpVtbl->SetDocumentProvider(This,pddp);
}
static FORCEINLINE HRESULT IDebugApplicationNode_Close(IDebugApplicationNode* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IDebugApplicationNode_Attach(IDebugApplicationNode* This,IDebugApplicationNode *pdanParent) {
    return This->lpVtbl->Attach(This,pdanParent);
}
static FORCEINLINE HRESULT IDebugApplicationNode_Detach(IDebugApplicationNode* This) {
    return This->lpVtbl->Detach(This);
}
#endif
#endif

#endif


#endif  /* __IDebugApplicationNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplicationNodeEvents interface
 */
#ifndef __IDebugApplicationNodeEvents_INTERFACE_DEFINED__
#define __IDebugApplicationNodeEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplicationNodeEvents, 0x51973c35, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c35-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugApplicationNodeEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE onAddChild(
        IDebugApplicationNode *prddpChild) = 0;

    virtual HRESULT STDMETHODCALLTYPE onRemoveChild(
        IDebugApplicationNode *prddpChild) = 0;

    virtual HRESULT STDMETHODCALLTYPE onDetach(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE onAttach(
        IDebugApplicationNode *prddpParent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplicationNodeEvents, 0x51973c35, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugApplicationNodeEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugApplicationNodeEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *onAddChild)(
        IDebugApplicationNodeEvents *This,
        IDebugApplicationNode *prddpChild);

    HRESULT (STDMETHODCALLTYPE *onRemoveChild)(
        IDebugApplicationNodeEvents *This,
        IDebugApplicationNode *prddpChild);

    HRESULT (STDMETHODCALLTYPE *onDetach)(
        IDebugApplicationNodeEvents *This);

    HRESULT (STDMETHODCALLTYPE *onAttach)(
        IDebugApplicationNodeEvents *This,
        IDebugApplicationNode *prddpParent);

    END_INTERFACE
} IDebugApplicationNodeEventsVtbl;

interface IDebugApplicationNodeEvents {
    CONST_VTBL IDebugApplicationNodeEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplicationNodeEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplicationNodeEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplicationNodeEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugApplicationNodeEvents methods ***/
#define IDebugApplicationNodeEvents_onAddChild(This,prddpChild) (This)->lpVtbl->onAddChild(This,prddpChild)
#define IDebugApplicationNodeEvents_onRemoveChild(This,prddpChild) (This)->lpVtbl->onRemoveChild(This,prddpChild)
#define IDebugApplicationNodeEvents_onDetach(This) (This)->lpVtbl->onDetach(This)
#define IDebugApplicationNodeEvents_onAttach(This,prddpParent) (This)->lpVtbl->onAttach(This,prddpParent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplicationNodeEvents_QueryInterface(IDebugApplicationNodeEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplicationNodeEvents_AddRef(IDebugApplicationNodeEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplicationNodeEvents_Release(IDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugApplicationNodeEvents methods ***/
static FORCEINLINE HRESULT IDebugApplicationNodeEvents_onAddChild(IDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
    return This->lpVtbl->onAddChild(This,prddpChild);
}
static FORCEINLINE HRESULT IDebugApplicationNodeEvents_onRemoveChild(IDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
    return This->lpVtbl->onRemoveChild(This,prddpChild);
}
static FORCEINLINE HRESULT IDebugApplicationNodeEvents_onDetach(IDebugApplicationNodeEvents* This) {
    return This->lpVtbl->onDetach(This);
}
static FORCEINLINE HRESULT IDebugApplicationNodeEvents_onAttach(IDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpParent) {
    return This->lpVtbl->onAttach(This,prddpParent);
}
#endif
#endif

#endif


#endif  /* __IDebugApplicationNodeEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * AsyncIDebugApplicationNodeEvents interface
 */
#ifndef __AsyncIDebugApplicationNodeEvents_INTERFACE_DEFINED__
#define __AsyncIDebugApplicationNodeEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_AsyncIDebugApplicationNodeEvents, 0xa2e3aa3b, 0xaa8d, 0x4ebf, 0x84,0xcd, 0x64,0x8b,0x73,0x7b,0x8c,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a2e3aa3b-aa8d-4ebf-84cd-648b737b8c13")
AsyncIDebugApplicationNodeEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Begin_onAddChild(
        IDebugApplicationNode *prddpChild) = 0;

    virtual HRESULT STDMETHODCALLTYPE Finish_onAddChild(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Begin_onRemoveChild(
        IDebugApplicationNode *prddpChild) = 0;

    virtual HRESULT STDMETHODCALLTYPE Finish_onRemoveChild(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Begin_onDetach(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Finish_onDetach(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Begin_onAttach(
        IDebugApplicationNode *prddpParent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Finish_onAttach(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AsyncIDebugApplicationNodeEvents, 0xa2e3aa3b, 0xaa8d, 0x4ebf, 0x84,0xcd, 0x64,0x8b,0x73,0x7b,0x8c,0x13)
#endif
#else
typedef struct AsyncIDebugApplicationNodeEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** AsyncIDebugApplicationNodeEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *Begin_onAddChild)(
        AsyncIDebugApplicationNodeEvents *This,
        IDebugApplicationNode *prddpChild);

    HRESULT (STDMETHODCALLTYPE *Finish_onAddChild)(
        AsyncIDebugApplicationNodeEvents *This);

    HRESULT (STDMETHODCALLTYPE *Begin_onRemoveChild)(
        AsyncIDebugApplicationNodeEvents *This,
        IDebugApplicationNode *prddpChild);

    HRESULT (STDMETHODCALLTYPE *Finish_onRemoveChild)(
        AsyncIDebugApplicationNodeEvents *This);

    HRESULT (STDMETHODCALLTYPE *Begin_onDetach)(
        AsyncIDebugApplicationNodeEvents *This);

    HRESULT (STDMETHODCALLTYPE *Finish_onDetach)(
        AsyncIDebugApplicationNodeEvents *This);

    HRESULT (STDMETHODCALLTYPE *Begin_onAttach)(
        AsyncIDebugApplicationNodeEvents *This,
        IDebugApplicationNode *prddpParent);

    HRESULT (STDMETHODCALLTYPE *Finish_onAttach)(
        AsyncIDebugApplicationNodeEvents *This);

    END_INTERFACE
} AsyncIDebugApplicationNodeEventsVtbl;

interface AsyncIDebugApplicationNodeEvents {
    CONST_VTBL AsyncIDebugApplicationNodeEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define AsyncIDebugApplicationNodeEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIDebugApplicationNodeEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIDebugApplicationNodeEvents_Release(This) (This)->lpVtbl->Release(This)
/*** AsyncIDebugApplicationNodeEvents methods ***/
#define AsyncIDebugApplicationNodeEvents_Begin_onAddChild(This,prddpChild) (This)->lpVtbl->Begin_onAddChild(This,prddpChild)
#define AsyncIDebugApplicationNodeEvents_Finish_onAddChild(This) (This)->lpVtbl->Finish_onAddChild(This)
#define AsyncIDebugApplicationNodeEvents_Begin_onRemoveChild(This,prddpChild) (This)->lpVtbl->Begin_onRemoveChild(This,prddpChild)
#define AsyncIDebugApplicationNodeEvents_Finish_onRemoveChild(This) (This)->lpVtbl->Finish_onRemoveChild(This)
#define AsyncIDebugApplicationNodeEvents_Begin_onDetach(This) (This)->lpVtbl->Begin_onDetach(This)
#define AsyncIDebugApplicationNodeEvents_Finish_onDetach(This) (This)->lpVtbl->Finish_onDetach(This)
#define AsyncIDebugApplicationNodeEvents_Begin_onAttach(This,prddpParent) (This)->lpVtbl->Begin_onAttach(This,prddpParent)
#define AsyncIDebugApplicationNodeEvents_Finish_onAttach(This) (This)->lpVtbl->Finish_onAttach(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_QueryInterface(AsyncIDebugApplicationNodeEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG AsyncIDebugApplicationNodeEvents_AddRef(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG AsyncIDebugApplicationNodeEvents_Release(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** AsyncIDebugApplicationNodeEvents methods ***/
static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_Begin_onAddChild(AsyncIDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
    return This->lpVtbl->Begin_onAddChild(This,prddpChild);
}
static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_Finish_onAddChild(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Finish_onAddChild(This);
}
static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_Begin_onRemoveChild(AsyncIDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
    return This->lpVtbl->Begin_onRemoveChild(This,prddpChild);
}
static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_Finish_onRemoveChild(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Finish_onRemoveChild(This);
}
static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_Begin_onDetach(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Begin_onDetach(This);
}
static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_Finish_onDetach(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Finish_onDetach(This);
}
static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_Begin_onAttach(AsyncIDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpParent) {
    return This->lpVtbl->Begin_onAttach(This,prddpParent);
}
static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_Finish_onAttach(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Finish_onAttach(This);
}
#endif
#endif

#endif


#endif  /* __AsyncIDebugApplicationNodeEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugThreadCall32 interface
 */
#ifndef __IDebugThreadCall32_INTERFACE_DEFINED__
#define __IDebugThreadCall32_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugThreadCall32, 0x51973c36, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c36-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugThreadCall32 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ThreadCallHandler(
        DWORD dwParam1,
        DWORD dwParam2,
        DWORD dwParam3) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugThreadCall32, 0x51973c36, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugThreadCall32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugThreadCall32 methods ***/
    HRESULT (STDMETHODCALLTYPE *ThreadCallHandler)(
        IDebugThreadCall32 *This,
        DWORD dwParam1,
        DWORD dwParam2,
        DWORD dwParam3);

    END_INTERFACE
} IDebugThreadCall32Vtbl;

interface IDebugThreadCall32 {
    CONST_VTBL IDebugThreadCall32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugThreadCall32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugThreadCall32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugThreadCall32_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugThreadCall32 methods ***/
#define IDebugThreadCall32_ThreadCallHandler(This,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->ThreadCallHandler(This,dwParam1,dwParam2,dwParam3)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugThreadCall32_QueryInterface(IDebugThreadCall32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugThreadCall32_AddRef(IDebugThreadCall32* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugThreadCall32_Release(IDebugThreadCall32* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugThreadCall32 methods ***/
static FORCEINLINE HRESULT IDebugThreadCall32_ThreadCallHandler(IDebugThreadCall32* This,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
    return This->lpVtbl->ThreadCallHandler(This,dwParam1,dwParam2,dwParam3);
}
#endif
#endif

#endif


#endif  /* __IDebugThreadCall32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugThreadCall64 interface
 */
#ifndef __IDebugThreadCall64_INTERFACE_DEFINED__
#define __IDebugThreadCall64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugThreadCall64, 0xcb3fa335, 0xe979, 0x42fd, 0x9f,0xcf, 0xa7,0x54,0x6a,0x0f,0x39,0x05);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cb3fa335-e979-42fd-9fcf-a7546a0f3905")
IDebugThreadCall64 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ThreadCallHandler(
        DWORDLONG dwParam1,
        DWORDLONG dwParam2,
        DWORDLONG dwParam3) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugThreadCall64, 0xcb3fa335, 0xe979, 0x42fd, 0x9f,0xcf, 0xa7,0x54,0x6a,0x0f,0x39,0x05)
#endif
#else
typedef struct IDebugThreadCall64Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugThreadCall64 methods ***/
    HRESULT (STDMETHODCALLTYPE *ThreadCallHandler)(
        IDebugThreadCall64 *This,
        DWORDLONG dwParam1,
        DWORDLONG dwParam2,
        DWORDLONG dwParam3);

    END_INTERFACE
} IDebugThreadCall64Vtbl;

interface IDebugThreadCall64 {
    CONST_VTBL IDebugThreadCall64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugThreadCall64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugThreadCall64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugThreadCall64_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugThreadCall64 methods ***/
#define IDebugThreadCall64_ThreadCallHandler(This,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->ThreadCallHandler(This,dwParam1,dwParam2,dwParam3)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugThreadCall64_QueryInterface(IDebugThreadCall64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugThreadCall64_AddRef(IDebugThreadCall64* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugThreadCall64_Release(IDebugThreadCall64* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugThreadCall64 methods ***/
static FORCEINLINE HRESULT IDebugThreadCall64_ThreadCallHandler(IDebugThreadCall64* This,DWORDLONG dwParam1,DWORDLONG dwParam2,DWORDLONG dwParam3) {
    return This->lpVtbl->ThreadCallHandler(This,dwParam1,dwParam2,dwParam3);
}
#endif
#endif

#endif


#endif  /* __IDebugThreadCall64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRemoteDebugApplicationThread interface
 */
#ifndef __IRemoteDebugApplicationThread_INTERFACE_DEFINED__
#define __IRemoteDebugApplicationThread_INTERFACE_DEFINED__

typedef DWORD THREAD_STATE;
#define THREAD_STATE_RUNNING (0x1)

#define THREAD_STATE_SUSPENDED (0x2)

#define THREAD_BLOCKED (0x4)

#define THREAD_OUT_OF_CONTEXT (0x8)

DEFINE_GUID(IID_IRemoteDebugApplicationThread, 0x51973c37, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c37-cb0c-11d0-b5c9-00a0244a0e7a")
IRemoteDebugApplicationThread : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSystemThreadId(
        DWORD *dwThreadId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetApplication(
        IRemoteDebugApplication **pprda) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumStackFrames(
        IEnumDebugStackFrames **ppedsf) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        BSTR *pbstrDescription,
        BSTR *pbstrState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNextStatement(
        IDebugStackFrame *pStackFrame,
        IDebugCodeContext *pCodeContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetState(
        DWORD *pState) = 0;

    virtual HRESULT STDMETHODCALLTYPE Suspend(
        DWORD *pdwCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        DWORD *pdwCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSuspendCount(
        DWORD *pdwCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRemoteDebugApplicationThread, 0x51973c37, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IRemoteDebugApplicationThreadVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplicationThread methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSystemThreadId)(
        IRemoteDebugApplicationThread *This,
        DWORD *dwThreadId);

    HRESULT (STDMETHODCALLTYPE *GetApplication)(
        IRemoteDebugApplicationThread *This,
        IRemoteDebugApplication **pprda);

    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
        IRemoteDebugApplicationThread *This,
        IEnumDebugStackFrames **ppedsf);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IRemoteDebugApplicationThread *This,
        BSTR *pbstrDescription,
        BSTR *pbstrState);

    HRESULT (STDMETHODCALLTYPE *SetNextStatement)(
        IRemoteDebugApplicationThread *This,
        IDebugStackFrame *pStackFrame,
        IDebugCodeContext *pCodeContext);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IRemoteDebugApplicationThread *This,
        DWORD *pState);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IRemoteDebugApplicationThread *This,
        DWORD *pdwCount);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IRemoteDebugApplicationThread *This,
        DWORD *pdwCount);

    HRESULT (STDMETHODCALLTYPE *GetSuspendCount)(
        IRemoteDebugApplicationThread *This,
        DWORD *pdwCount);

    END_INTERFACE
} IRemoteDebugApplicationThreadVtbl;

interface IRemoteDebugApplicationThread {
    CONST_VTBL IRemoteDebugApplicationThreadVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRemoteDebugApplicationThread_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRemoteDebugApplicationThread_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRemoteDebugApplicationThread_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplicationThread methods ***/
#define IRemoteDebugApplicationThread_GetSystemThreadId(This,dwThreadId) (This)->lpVtbl->GetSystemThreadId(This,dwThreadId)
#define IRemoteDebugApplicationThread_GetApplication(This,pprda) (This)->lpVtbl->GetApplication(This,pprda)
#define IRemoteDebugApplicationThread_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
#define IRemoteDebugApplicationThread_GetDescription(This,pbstrDescription,pbstrState) (This)->lpVtbl->GetDescription(This,pbstrDescription,pbstrState)
#define IRemoteDebugApplicationThread_SetNextStatement(This,pStackFrame,pCodeContext) (This)->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext)
#define IRemoteDebugApplicationThread_GetState(This,pState) (This)->lpVtbl->GetState(This,pState)
#define IRemoteDebugApplicationThread_Suspend(This,pdwCount) (This)->lpVtbl->Suspend(This,pdwCount)
#define IRemoteDebugApplicationThread_Resume(This,pdwCount) (This)->lpVtbl->Resume(This,pdwCount)
#define IRemoteDebugApplicationThread_GetSuspendCount(This,pdwCount) (This)->lpVtbl->GetSuspendCount(This,pdwCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_QueryInterface(IRemoteDebugApplicationThread* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRemoteDebugApplicationThread_AddRef(IRemoteDebugApplicationThread* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRemoteDebugApplicationThread_Release(IRemoteDebugApplicationThread* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplicationThread methods ***/
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetSystemThreadId(IRemoteDebugApplicationThread* This,DWORD *dwThreadId) {
    return This->lpVtbl->GetSystemThreadId(This,dwThreadId);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetApplication(IRemoteDebugApplicationThread* This,IRemoteDebugApplication **pprda) {
    return This->lpVtbl->GetApplication(This,pprda);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_EnumStackFrames(IRemoteDebugApplicationThread* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetDescription(IRemoteDebugApplicationThread* This,BSTR *pbstrDescription,BSTR *pbstrState) {
    return This->lpVtbl->GetDescription(This,pbstrDescription,pbstrState);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_SetNextStatement(IRemoteDebugApplicationThread* This,IDebugStackFrame *pStackFrame,IDebugCodeContext *pCodeContext) {
    return This->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetState(IRemoteDebugApplicationThread* This,DWORD *pState) {
    return This->lpVtbl->GetState(This,pState);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_Suspend(IRemoteDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->Suspend(This,pdwCount);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_Resume(IRemoteDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->Resume(This,pdwCount);
}
static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetSuspendCount(IRemoteDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->GetSuspendCount(This,pdwCount);
}
#endif
#endif

#endif


#endif  /* __IRemoteDebugApplicationThread_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplicationThread interface
 */
#ifndef __IDebugApplicationThread_INTERFACE_DEFINED__
#define __IDebugApplicationThread_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplicationThread, 0x51973c38, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c38-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugApplicationThread : public IRemoteDebugApplicationThread
{
    virtual HRESULT STDMETHODCALLTYPE SynchronousCallIntoThread32(
        IDebugThreadCall32 *pstcb,
        DWORD dwParam1,
        DWORD dwParam2,
        DWORD dwParam3) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryIsCurrentThread(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryIsDebuggerThread(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDescription(
        LPCOLESTR pstrDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStateString(
        LPCOLESTR pstrState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplicationThread, 0x51973c38, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugApplicationThreadVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplicationThread methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSystemThreadId)(
        IDebugApplicationThread *This,
        DWORD *dwThreadId);

    HRESULT (STDMETHODCALLTYPE *GetApplication)(
        IDebugApplicationThread *This,
        IRemoteDebugApplication **pprda);

    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
        IDebugApplicationThread *This,
        IEnumDebugStackFrames **ppedsf);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IDebugApplicationThread *This,
        BSTR *pbstrDescription,
        BSTR *pbstrState);

    HRESULT (STDMETHODCALLTYPE *SetNextStatement)(
        IDebugApplicationThread *This,
        IDebugStackFrame *pStackFrame,
        IDebugCodeContext *pCodeContext);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IDebugApplicationThread *This,
        DWORD *pState);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IDebugApplicationThread *This,
        DWORD *pdwCount);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IDebugApplicationThread *This,
        DWORD *pdwCount);

    HRESULT (STDMETHODCALLTYPE *GetSuspendCount)(
        IDebugApplicationThread *This,
        DWORD *pdwCount);

    /*** IDebugApplicationThread methods ***/
    HRESULT (STDMETHODCALLTYPE *SynchronousCallIntoThread32)(
        IDebugApplicationThread *This,
        IDebugThreadCall32 *pstcb,
        DWORD dwParam1,
        DWORD dwParam2,
        DWORD dwParam3);

    HRESULT (STDMETHODCALLTYPE *QueryIsCurrentThread)(
        IDebugApplicationThread *This);

    HRESULT (STDMETHODCALLTYPE *QueryIsDebuggerThread)(
        IDebugApplicationThread *This);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IDebugApplicationThread *This,
        LPCOLESTR pstrDescription);

    HRESULT (STDMETHODCALLTYPE *SetStateString)(
        IDebugApplicationThread *This,
        LPCOLESTR pstrState);

    END_INTERFACE
} IDebugApplicationThreadVtbl;

interface IDebugApplicationThread {
    CONST_VTBL IDebugApplicationThreadVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplicationThread_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplicationThread_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplicationThread_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplicationThread methods ***/
#define IDebugApplicationThread_GetSystemThreadId(This,dwThreadId) (This)->lpVtbl->GetSystemThreadId(This,dwThreadId)
#define IDebugApplicationThread_GetApplication(This,pprda) (This)->lpVtbl->GetApplication(This,pprda)
#define IDebugApplicationThread_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
#define IDebugApplicationThread_GetDescription(This,pbstrDescription,pbstrState) (This)->lpVtbl->GetDescription(This,pbstrDescription,pbstrState)
#define IDebugApplicationThread_SetNextStatement(This,pStackFrame,pCodeContext) (This)->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext)
#define IDebugApplicationThread_GetState(This,pState) (This)->lpVtbl->GetState(This,pState)
#define IDebugApplicationThread_Suspend(This,pdwCount) (This)->lpVtbl->Suspend(This,pdwCount)
#define IDebugApplicationThread_Resume(This,pdwCount) (This)->lpVtbl->Resume(This,pdwCount)
#define IDebugApplicationThread_GetSuspendCount(This,pdwCount) (This)->lpVtbl->GetSuspendCount(This,pdwCount)
/*** IDebugApplicationThread methods ***/
#define IDebugApplicationThread_SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3)
#define IDebugApplicationThread_QueryIsCurrentThread(This) (This)->lpVtbl->QueryIsCurrentThread(This)
#define IDebugApplicationThread_QueryIsDebuggerThread(This) (This)->lpVtbl->QueryIsDebuggerThread(This)
#define IDebugApplicationThread_SetDescription(This,pstrDescription) (This)->lpVtbl->SetDescription(This,pstrDescription)
#define IDebugApplicationThread_SetStateString(This,pstrState) (This)->lpVtbl->SetStateString(This,pstrState)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread_QueryInterface(IDebugApplicationThread* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplicationThread_AddRef(IDebugApplicationThread* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplicationThread_Release(IDebugApplicationThread* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplicationThread methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread_GetSystemThreadId(IDebugApplicationThread* This,DWORD *dwThreadId) {
    return This->lpVtbl->GetSystemThreadId(This,dwThreadId);
}
static FORCEINLINE HRESULT IDebugApplicationThread_GetApplication(IDebugApplicationThread* This,IRemoteDebugApplication **pprda) {
    return This->lpVtbl->GetApplication(This,pprda);
}
static FORCEINLINE HRESULT IDebugApplicationThread_EnumStackFrames(IDebugApplicationThread* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
static FORCEINLINE HRESULT IDebugApplicationThread_GetDescription(IDebugApplicationThread* This,BSTR *pbstrDescription,BSTR *pbstrState) {
    return This->lpVtbl->GetDescription(This,pbstrDescription,pbstrState);
}
static FORCEINLINE HRESULT IDebugApplicationThread_SetNextStatement(IDebugApplicationThread* This,IDebugStackFrame *pStackFrame,IDebugCodeContext *pCodeContext) {
    return This->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext);
}
static FORCEINLINE HRESULT IDebugApplicationThread_GetState(IDebugApplicationThread* This,DWORD *pState) {
    return This->lpVtbl->GetState(This,pState);
}
static FORCEINLINE HRESULT IDebugApplicationThread_Suspend(IDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->Suspend(This,pdwCount);
}
static FORCEINLINE HRESULT IDebugApplicationThread_Resume(IDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->Resume(This,pdwCount);
}
static FORCEINLINE HRESULT IDebugApplicationThread_GetSuspendCount(IDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->GetSuspendCount(This,pdwCount);
}
/*** IDebugApplicationThread methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread_SynchronousCallIntoThread32(IDebugApplicationThread* This,IDebugThreadCall32 *pstcb,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
    return This->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3);
}
static FORCEINLINE HRESULT IDebugApplicationThread_QueryIsCurrentThread(IDebugApplicationThread* This) {
    return This->lpVtbl->QueryIsCurrentThread(This);
}
static FORCEINLINE HRESULT IDebugApplicationThread_QueryIsDebuggerThread(IDebugApplicationThread* This) {
    return This->lpVtbl->QueryIsDebuggerThread(This);
}
static FORCEINLINE HRESULT IDebugApplicationThread_SetDescription(IDebugApplicationThread* This,LPCOLESTR pstrDescription) {
    return This->lpVtbl->SetDescription(This,pstrDescription);
}
static FORCEINLINE HRESULT IDebugApplicationThread_SetStateString(IDebugApplicationThread* This,LPCOLESTR pstrState) {
    return This->lpVtbl->SetStateString(This,pstrState);
}
#endif
#endif

#endif


#endif  /* __IDebugApplicationThread_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugApplicationThread64 interface
 */
#ifndef __IDebugApplicationThread64_INTERFACE_DEFINED__
#define __IDebugApplicationThread64_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugApplicationThread64, 0x9dac5886, 0xdbad, 0x456d, 0x9d,0xee, 0x5d,0xec,0x39,0xab,0x3d,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9dac5886-dbad-456d-9dee-5dec39ab3dda")
IDebugApplicationThread64 : public IDebugApplicationThread
{
    virtual HRESULT STDMETHODCALLTYPE SynchronousCallIntoThread64(
        IDebugThreadCall64 *pstcb,
        DWORDLONG dwParam1,
        DWORDLONG dwParam2,
        DWORDLONG dwParam3) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugApplicationThread64, 0x9dac5886, 0xdbad, 0x456d, 0x9d,0xee, 0x5d,0xec,0x39,0xab,0x3d,0xda)
#endif
#else
typedef struct IDebugApplicationThread64Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRemoteDebugApplicationThread methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSystemThreadId)(
        IDebugApplicationThread64 *This,
        DWORD *dwThreadId);

    HRESULT (STDMETHODCALLTYPE *GetApplication)(
        IDebugApplicationThread64 *This,
        IRemoteDebugApplication **pprda);

    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
        IDebugApplicationThread64 *This,
        IEnumDebugStackFrames **ppedsf);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IDebugApplicationThread64 *This,
        BSTR *pbstrDescription,
        BSTR *pbstrState);

    HRESULT (STDMETHODCALLTYPE *SetNextStatement)(
        IDebugApplicationThread64 *This,
        IDebugStackFrame *pStackFrame,
        IDebugCodeContext *pCodeContext);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IDebugApplicationThread64 *This,
        DWORD *pState);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IDebugApplicationThread64 *This,
        DWORD *pdwCount);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IDebugApplicationThread64 *This,
        DWORD *pdwCount);

    HRESULT (STDMETHODCALLTYPE *GetSuspendCount)(
        IDebugApplicationThread64 *This,
        DWORD *pdwCount);

    /*** IDebugApplicationThread methods ***/
    HRESULT (STDMETHODCALLTYPE *SynchronousCallIntoThread32)(
        IDebugApplicationThread64 *This,
        IDebugThreadCall32 *pstcb,
        DWORD dwParam1,
        DWORD dwParam2,
        DWORD dwParam3);

    HRESULT (STDMETHODCALLTYPE *QueryIsCurrentThread)(
        IDebugApplicationThread64 *This);

    HRESULT (STDMETHODCALLTYPE *QueryIsDebuggerThread)(
        IDebugApplicationThread64 *This);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IDebugApplicationThread64 *This,
        LPCOLESTR pstrDescription);

    HRESULT (STDMETHODCALLTYPE *SetStateString)(
        IDebugApplicationThread64 *This,
        LPCOLESTR pstrState);

    /*** IDebugApplicationThread64 methods ***/
    HRESULT (STDMETHODCALLTYPE *SynchronousCallIntoThread64)(
        IDebugApplicationThread64 *This,
        IDebugThreadCall64 *pstcb,
        DWORDLONG dwParam1,
        DWORDLONG dwParam2,
        DWORDLONG dwParam3);

    END_INTERFACE
} IDebugApplicationThread64Vtbl;

interface IDebugApplicationThread64 {
    CONST_VTBL IDebugApplicationThread64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugApplicationThread64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugApplicationThread64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugApplicationThread64_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteDebugApplicationThread methods ***/
#define IDebugApplicationThread64_GetSystemThreadId(This,dwThreadId) (This)->lpVtbl->GetSystemThreadId(This,dwThreadId)
#define IDebugApplicationThread64_GetApplication(This,pprda) (This)->lpVtbl->GetApplication(This,pprda)
#define IDebugApplicationThread64_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
#define IDebugApplicationThread64_GetDescription(This,pbstrDescription,pbstrState) (This)->lpVtbl->GetDescription(This,pbstrDescription,pbstrState)
#define IDebugApplicationThread64_SetNextStatement(This,pStackFrame,pCodeContext) (This)->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext)
#define IDebugApplicationThread64_GetState(This,pState) (This)->lpVtbl->GetState(This,pState)
#define IDebugApplicationThread64_Suspend(This,pdwCount) (This)->lpVtbl->Suspend(This,pdwCount)
#define IDebugApplicationThread64_Resume(This,pdwCount) (This)->lpVtbl->Resume(This,pdwCount)
#define IDebugApplicationThread64_GetSuspendCount(This,pdwCount) (This)->lpVtbl->GetSuspendCount(This,pdwCount)
/*** IDebugApplicationThread methods ***/
#define IDebugApplicationThread64_SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3)
#define IDebugApplicationThread64_QueryIsCurrentThread(This) (This)->lpVtbl->QueryIsCurrentThread(This)
#define IDebugApplicationThread64_QueryIsDebuggerThread(This) (This)->lpVtbl->QueryIsDebuggerThread(This)
#define IDebugApplicationThread64_SetDescription(This,pstrDescription) (This)->lpVtbl->SetDescription(This,pstrDescription)
#define IDebugApplicationThread64_SetStateString(This,pstrState) (This)->lpVtbl->SetStateString(This,pstrState)
/*** IDebugApplicationThread64 methods ***/
#define IDebugApplicationThread64_SynchronousCallIntoThread64(This,pstcb,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallIntoThread64(This,pstcb,dwParam1,dwParam2,dwParam3)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread64_QueryInterface(IDebugApplicationThread64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugApplicationThread64_AddRef(IDebugApplicationThread64* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugApplicationThread64_Release(IDebugApplicationThread64* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplicationThread methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread64_GetSystemThreadId(IDebugApplicationThread64* This,DWORD *dwThreadId) {
    return This->lpVtbl->GetSystemThreadId(This,dwThreadId);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_GetApplication(IDebugApplicationThread64* This,IRemoteDebugApplication **pprda) {
    return This->lpVtbl->GetApplication(This,pprda);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_EnumStackFrames(IDebugApplicationThread64* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_GetDescription(IDebugApplicationThread64* This,BSTR *pbstrDescription,BSTR *pbstrState) {
    return This->lpVtbl->GetDescription(This,pbstrDescription,pbstrState);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_SetNextStatement(IDebugApplicationThread64* This,IDebugStackFrame *pStackFrame,IDebugCodeContext *pCodeContext) {
    return This->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_GetState(IDebugApplicationThread64* This,DWORD *pState) {
    return This->lpVtbl->GetState(This,pState);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_Suspend(IDebugApplicationThread64* This,DWORD *pdwCount) {
    return This->lpVtbl->Suspend(This,pdwCount);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_Resume(IDebugApplicationThread64* This,DWORD *pdwCount) {
    return This->lpVtbl->Resume(This,pdwCount);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_GetSuspendCount(IDebugApplicationThread64* This,DWORD *pdwCount) {
    return This->lpVtbl->GetSuspendCount(This,pdwCount);
}
/*** IDebugApplicationThread methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread64_SynchronousCallIntoThread32(IDebugApplicationThread64* This,IDebugThreadCall32 *pstcb,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
    return This->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_QueryIsCurrentThread(IDebugApplicationThread64* This) {
    return This->lpVtbl->QueryIsCurrentThread(This);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_QueryIsDebuggerThread(IDebugApplicationThread64* This) {
    return This->lpVtbl->QueryIsDebuggerThread(This);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_SetDescription(IDebugApplicationThread64* This,LPCOLESTR pstrDescription) {
    return This->lpVtbl->SetDescription(This,pstrDescription);
}
static FORCEINLINE HRESULT IDebugApplicationThread64_SetStateString(IDebugApplicationThread64* This,LPCOLESTR pstrState) {
    return This->lpVtbl->SetStateString(This,pstrState);
}
/*** IDebugApplicationThread64 methods ***/
static FORCEINLINE HRESULT IDebugApplicationThread64_SynchronousCallIntoThread64(IDebugApplicationThread64* This,IDebugThreadCall64 *pstcb,DWORDLONG dwParam1,DWORDLONG dwParam2,DWORDLONG dwParam3) {
    return This->lpVtbl->SynchronousCallIntoThread64(This,pstcb,dwParam1,dwParam2,dwParam3);
}
#endif
#endif

#endif


#endif  /* __IDebugApplicationThread64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugCookie interface
 */
#ifndef __IDebugCookie_INTERFACE_DEFINED__
#define __IDebugCookie_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugCookie, 0x51973c39, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c39-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugCookie : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetDebugCookie(
        DWORD dwDebugAppCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugCookie, 0x51973c39, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugCookieVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugCookie methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDebugCookie)(
        IDebugCookie *This,
        DWORD dwDebugAppCookie);

    END_INTERFACE
} IDebugCookieVtbl;

interface IDebugCookie {
    CONST_VTBL IDebugCookieVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugCookie_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugCookie_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugCookie_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugCookie methods ***/
#define IDebugCookie_SetDebugCookie(This,dwDebugAppCookie) (This)->lpVtbl->SetDebugCookie(This,dwDebugAppCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugCookie_QueryInterface(IDebugCookie* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugCookie_AddRef(IDebugCookie* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugCookie_Release(IDebugCookie* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugCookie methods ***/
static FORCEINLINE HRESULT IDebugCookie_SetDebugCookie(IDebugCookie* This,DWORD dwDebugAppCookie) {
    return This->lpVtbl->SetDebugCookie(This,dwDebugAppCookie);
}
#endif
#endif

#endif


#endif  /* __IDebugCookie_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumDebugApplicationNodes interface
 */
#ifndef __IEnumDebugApplicationNodes_INTERFACE_DEFINED__
#define __IEnumDebugApplicationNodes_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumDebugApplicationNodes, 0x51973c3a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c3a-cb0c-11d0-b5c9-00a0244a0e7a")
IEnumDebugApplicationNodes : public IUnknown
{
    virtual HRESULT __stdcall Next(
        ULONG celt,
        IDebugApplicationNode **pprddp,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumDebugApplicationNodes **pperddp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumDebugApplicationNodes, 0x51973c3a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IEnumDebugApplicationNodesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumDebugApplicationNodes methods ***/
    HRESULT (__stdcall *Next)(
        IEnumDebugApplicationNodes *This,
        ULONG celt,
        IDebugApplicationNode **pprddp,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumDebugApplicationNodes *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumDebugApplicationNodes *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumDebugApplicationNodes *This,
        IEnumDebugApplicationNodes **pperddp);

    END_INTERFACE
} IEnumDebugApplicationNodesVtbl;

interface IEnumDebugApplicationNodes {
    CONST_VTBL IEnumDebugApplicationNodesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumDebugApplicationNodes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumDebugApplicationNodes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumDebugApplicationNodes_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumDebugApplicationNodes methods ***/
#define IEnumDebugApplicationNodes_Next(This,celt,pprddp,pceltFetched) (This)->lpVtbl->Next(This,celt,pprddp,pceltFetched)
#define IEnumDebugApplicationNodes_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumDebugApplicationNodes_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumDebugApplicationNodes_Clone(This,pperddp) (This)->lpVtbl->Clone(This,pperddp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumDebugApplicationNodes_QueryInterface(IEnumDebugApplicationNodes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumDebugApplicationNodes_AddRef(IEnumDebugApplicationNodes* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumDebugApplicationNodes_Release(IEnumDebugApplicationNodes* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugApplicationNodes methods ***/
static FORCEINLINE HRESULT IEnumDebugApplicationNodes_Next(IEnumDebugApplicationNodes* This,ULONG celt,IDebugApplicationNode **pprddp,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,pprddp,pceltFetched);
}
static FORCEINLINE HRESULT IEnumDebugApplicationNodes_Skip(IEnumDebugApplicationNodes* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumDebugApplicationNodes_Reset(IEnumDebugApplicationNodes* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumDebugApplicationNodes_Clone(IEnumDebugApplicationNodes* This,IEnumDebugApplicationNodes **pperddp) {
    return This->lpVtbl->Clone(This,pperddp);
}
#endif
#endif

#endif

HRESULT __stdcall IEnumDebugApplicationNodes_RemoteNext_Proxy(
    IEnumDebugApplicationNodes* This,
    ULONG celt,
    IDebugApplicationNode **pprddp,
    ULONG *pceltFetched);
void __RPC_STUB IEnumDebugApplicationNodes_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumDebugApplicationNodes_Next_Proxy(
    IEnumDebugApplicationNodes* This,
    ULONG celt,
    IDebugApplicationNode **pprddp,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumDebugApplicationNodes_Next_Stub(
    IEnumDebugApplicationNodes* This,
    ULONG celt,
    IDebugApplicationNode **pprddp,
    ULONG *pceltFetched);

#endif  /* __IEnumDebugApplicationNodes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumRemoteDebugApplications interface
 */
#ifndef __IEnumRemoteDebugApplications_INTERFACE_DEFINED__
#define __IEnumRemoteDebugApplications_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumRemoteDebugApplications, 0x51973c3b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c3b-cb0c-11d0-b5c9-00a0244a0e7a")
IEnumRemoteDebugApplications : public IUnknown
{
    virtual HRESULT __stdcall Next(
        ULONG celt,
        IRemoteDebugApplication **ppda,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumRemoteDebugApplications **ppessd) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumRemoteDebugApplications, 0x51973c3b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IEnumRemoteDebugApplicationsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumRemoteDebugApplications methods ***/
    HRESULT (__stdcall *Next)(
        IEnumRemoteDebugApplications *This,
        ULONG celt,
        IRemoteDebugApplication **ppda,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumRemoteDebugApplications *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumRemoteDebugApplications *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumRemoteDebugApplications *This,
        IEnumRemoteDebugApplications **ppessd);

    END_INTERFACE
} IEnumRemoteDebugApplicationsVtbl;

interface IEnumRemoteDebugApplications {
    CONST_VTBL IEnumRemoteDebugApplicationsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumRemoteDebugApplications_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumRemoteDebugApplications_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumRemoteDebugApplications_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumRemoteDebugApplications methods ***/
#define IEnumRemoteDebugApplications_Next(This,celt,ppda,pceltFetched) (This)->lpVtbl->Next(This,celt,ppda,pceltFetched)
#define IEnumRemoteDebugApplications_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumRemoteDebugApplications_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumRemoteDebugApplications_Clone(This,ppessd) (This)->lpVtbl->Clone(This,ppessd)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumRemoteDebugApplications_QueryInterface(IEnumRemoteDebugApplications* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumRemoteDebugApplications_AddRef(IEnumRemoteDebugApplications* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumRemoteDebugApplications_Release(IEnumRemoteDebugApplications* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumRemoteDebugApplications methods ***/
static FORCEINLINE HRESULT IEnumRemoteDebugApplications_Next(IEnumRemoteDebugApplications* This,ULONG celt,IRemoteDebugApplication **ppda,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,ppda,pceltFetched);
}
static FORCEINLINE HRESULT IEnumRemoteDebugApplications_Skip(IEnumRemoteDebugApplications* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumRemoteDebugApplications_Reset(IEnumRemoteDebugApplications* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumRemoteDebugApplications_Clone(IEnumRemoteDebugApplications* This,IEnumRemoteDebugApplications **ppessd) {
    return This->lpVtbl->Clone(This,ppessd);
}
#endif
#endif

#endif

HRESULT __stdcall IEnumRemoteDebugApplications_RemoteNext_Proxy(
    IEnumRemoteDebugApplications* This,
    ULONG celt,
    IRemoteDebugApplication **ppda,
    ULONG *pceltFetched);
void __RPC_STUB IEnumRemoteDebugApplications_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumRemoteDebugApplications_Next_Proxy(
    IEnumRemoteDebugApplications* This,
    ULONG celt,
    IRemoteDebugApplication **ppda,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumRemoteDebugApplications_Next_Stub(
    IEnumRemoteDebugApplications* This,
    ULONG celt,
    IRemoteDebugApplication **ppda,
    ULONG *pceltFetched);

#endif  /* __IEnumRemoteDebugApplications_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumRemoteDebugApplicationThreads interface
 */
#ifndef __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__
#define __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumRemoteDebugApplicationThreads, 0x51973c3c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c3c-cb0c-11d0-b5c9-00a0244a0e7a")
IEnumRemoteDebugApplicationThreads : public IUnknown
{
    virtual HRESULT __stdcall Next(
        ULONG celt,
        IRemoteDebugApplicationThread **pprdat,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumRemoteDebugApplicationThreads **pperdat) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumRemoteDebugApplicationThreads, 0x51973c3c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IEnumRemoteDebugApplicationThreadsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumRemoteDebugApplicationThreads methods ***/
    HRESULT (__stdcall *Next)(
        IEnumRemoteDebugApplicationThreads *This,
        ULONG celt,
        IRemoteDebugApplicationThread **pprdat,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumRemoteDebugApplicationThreads *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumRemoteDebugApplicationThreads *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumRemoteDebugApplicationThreads *This,
        IEnumRemoteDebugApplicationThreads **pperdat);

    END_INTERFACE
} IEnumRemoteDebugApplicationThreadsVtbl;

interface IEnumRemoteDebugApplicationThreads {
    CONST_VTBL IEnumRemoteDebugApplicationThreadsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumRemoteDebugApplicationThreads_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumRemoteDebugApplicationThreads_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumRemoteDebugApplicationThreads_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumRemoteDebugApplicationThreads methods ***/
#define IEnumRemoteDebugApplicationThreads_Next(This,celt,pprdat,pceltFetched) (This)->lpVtbl->Next(This,celt,pprdat,pceltFetched)
#define IEnumRemoteDebugApplicationThreads_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumRemoteDebugApplicationThreads_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumRemoteDebugApplicationThreads_Clone(This,pperdat) (This)->lpVtbl->Clone(This,pperdat)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_QueryInterface(IEnumRemoteDebugApplicationThreads* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumRemoteDebugApplicationThreads_AddRef(IEnumRemoteDebugApplicationThreads* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumRemoteDebugApplicationThreads_Release(IEnumRemoteDebugApplicationThreads* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumRemoteDebugApplicationThreads methods ***/
static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_Next(IEnumRemoteDebugApplicationThreads* This,ULONG celt,IRemoteDebugApplicationThread **pprdat,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,pprdat,pceltFetched);
}
static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_Skip(IEnumRemoteDebugApplicationThreads* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_Reset(IEnumRemoteDebugApplicationThreads* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_Clone(IEnumRemoteDebugApplicationThreads* This,IEnumRemoteDebugApplicationThreads **pperdat) {
    return This->lpVtbl->Clone(This,pperdat);
}
#endif
#endif

#endif

HRESULT __stdcall IEnumRemoteDebugApplicationThreads_RemoteNext_Proxy(
    IEnumRemoteDebugApplicationThreads* This,
    ULONG celt,
    IRemoteDebugApplicationThread **ppdat,
    ULONG *pceltFetched);
void __RPC_STUB IEnumRemoteDebugApplicationThreads_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumRemoteDebugApplicationThreads_Next_Proxy(
    IEnumRemoteDebugApplicationThreads* This,
    ULONG celt,
    IRemoteDebugApplicationThread **pprdat,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumRemoteDebugApplicationThreads_Next_Stub(
    IEnumRemoteDebugApplicationThreads* This,
    ULONG celt,
    IRemoteDebugApplicationThread **ppdat,
    ULONG *pceltFetched);

#endif  /* __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugFormatter interface
 */
#ifndef __IDebugFormatter_INTERFACE_DEFINED__
#define __IDebugFormatter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugFormatter, 0x51973c05, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c05-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugFormatter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStringForVariant(
        VARIANT *pvar,
        ULONG nRadix,
        BSTR *pbstrValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVariantForString(
        LPCOLESTR pwstrValue,
        VARIANT *pvar) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStringForVarType(
        VARTYPE vt,
        TYPEDESC *ptdescArrayType,
        BSTR *pbstr) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugFormatter, 0x51973c05, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugFormatterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugFormatter methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStringForVariant)(
        IDebugFormatter *This,
        VARIANT *pvar,
        ULONG nRadix,
        BSTR *pbstrValue);

    HRESULT (STDMETHODCALLTYPE *GetVariantForString)(
        IDebugFormatter *This,
        LPCOLESTR pwstrValue,
        VARIANT *pvar);

    HRESULT (STDMETHODCALLTYPE *GetStringForVarType)(
        IDebugFormatter *This,
        VARTYPE vt,
        TYPEDESC *ptdescArrayType,
        BSTR *pbstr);

    END_INTERFACE
} IDebugFormatterVtbl;

interface IDebugFormatter {
    CONST_VTBL IDebugFormatterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugFormatter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugFormatter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugFormatter_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugFormatter methods ***/
#define IDebugFormatter_GetStringForVariant(This,pvar,nRadix,pbstrValue) (This)->lpVtbl->GetStringForVariant(This,pvar,nRadix,pbstrValue)
#define IDebugFormatter_GetVariantForString(This,pwstrValue,pvar) (This)->lpVtbl->GetVariantForString(This,pwstrValue,pvar)
#define IDebugFormatter_GetStringForVarType(This,vt,ptdescArrayType,pbstr) (This)->lpVtbl->GetStringForVarType(This,vt,ptdescArrayType,pbstr)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugFormatter_QueryInterface(IDebugFormatter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugFormatter_AddRef(IDebugFormatter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugFormatter_Release(IDebugFormatter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugFormatter methods ***/
static FORCEINLINE HRESULT IDebugFormatter_GetStringForVariant(IDebugFormatter* This,VARIANT *pvar,ULONG nRadix,BSTR *pbstrValue) {
    return This->lpVtbl->GetStringForVariant(This,pvar,nRadix,pbstrValue);
}
static FORCEINLINE HRESULT IDebugFormatter_GetVariantForString(IDebugFormatter* This,LPCOLESTR pwstrValue,VARIANT *pvar) {
    return This->lpVtbl->GetVariantForString(This,pwstrValue,pvar);
}
static FORCEINLINE HRESULT IDebugFormatter_GetStringForVarType(IDebugFormatter* This,VARTYPE vt,TYPEDESC *ptdescArrayType,BSTR *pbstr) {
    return This->lpVtbl->GetStringForVarType(This,vt,ptdescArrayType,pbstr);
}
#endif
#endif

#endif


#endif  /* __IDebugFormatter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISimpleConnectionPoint interface
 */
#ifndef __ISimpleConnectionPoint_INTERFACE_DEFINED__
#define __ISimpleConnectionPoint_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISimpleConnectionPoint, 0x51973c3e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c3e-cb0c-11d0-b5c9-00a0244a0e7a")
ISimpleConnectionPoint : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetEventCount(
        ULONG *pulCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE DescribeEvents(
        ULONG iEvent,
        ULONG cEvents,
        DISPID *prgid,
        BSTR *prgbstr,
        ULONG *pcEventsFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Advise(
        IDispatch *pdisp,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        DWORD dwCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISimpleConnectionPoint, 0x51973c3e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct ISimpleConnectionPointVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISimpleConnectionPoint methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventCount)(
        ISimpleConnectionPoint *This,
        ULONG *pulCount);

    HRESULT (STDMETHODCALLTYPE *DescribeEvents)(
        ISimpleConnectionPoint *This,
        ULONG iEvent,
        ULONG cEvents,
        DISPID *prgid,
        BSTR *prgbstr,
        ULONG *pcEventsFetched);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        ISimpleConnectionPoint *This,
        IDispatch *pdisp,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        ISimpleConnectionPoint *This,
        DWORD dwCookie);

    END_INTERFACE
} ISimpleConnectionPointVtbl;

interface ISimpleConnectionPoint {
    CONST_VTBL ISimpleConnectionPointVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISimpleConnectionPoint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISimpleConnectionPoint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISimpleConnectionPoint_Release(This) (This)->lpVtbl->Release(This)
/*** ISimpleConnectionPoint methods ***/
#define ISimpleConnectionPoint_GetEventCount(This,pulCount) (This)->lpVtbl->GetEventCount(This,pulCount)
#define ISimpleConnectionPoint_DescribeEvents(This,iEvent,cEvents,prgid,prgbstr,pcEventsFetched) (This)->lpVtbl->DescribeEvents(This,iEvent,cEvents,prgid,prgbstr,pcEventsFetched)
#define ISimpleConnectionPoint_Advise(This,pdisp,pdwCookie) (This)->lpVtbl->Advise(This,pdisp,pdwCookie)
#define ISimpleConnectionPoint_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISimpleConnectionPoint_QueryInterface(ISimpleConnectionPoint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISimpleConnectionPoint_AddRef(ISimpleConnectionPoint* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISimpleConnectionPoint_Release(ISimpleConnectionPoint* This) {
    return This->lpVtbl->Release(This);
}
/*** ISimpleConnectionPoint methods ***/
static FORCEINLINE HRESULT ISimpleConnectionPoint_GetEventCount(ISimpleConnectionPoint* This,ULONG *pulCount) {
    return This->lpVtbl->GetEventCount(This,pulCount);
}
static FORCEINLINE HRESULT ISimpleConnectionPoint_DescribeEvents(ISimpleConnectionPoint* This,ULONG iEvent,ULONG cEvents,DISPID *prgid,BSTR *prgbstr,ULONG *pcEventsFetched) {
    return This->lpVtbl->DescribeEvents(This,iEvent,cEvents,prgid,prgbstr,pcEventsFetched);
}
static FORCEINLINE HRESULT ISimpleConnectionPoint_Advise(ISimpleConnectionPoint* This,IDispatch *pdisp,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pdisp,pdwCookie);
}
static FORCEINLINE HRESULT ISimpleConnectionPoint_Unadvise(ISimpleConnectionPoint* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
#endif
#endif

#endif


#endif  /* __ISimpleConnectionPoint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugHelper interface
 */
#ifndef __IDebugHelper_INTERFACE_DEFINED__
#define __IDebugHelper_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugHelper, 0x51973c3f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c3f-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugHelper : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreatePropertyBrowser(
        VARIANT *pvar,
        LPCOLESTR bstrName,
        IDebugApplicationThread *pdat,
        IDebugProperty **ppdob) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePropertyBrowserEx(
        VARIANT *pvar,
        LPCOLESTR bstrName,
        IDebugApplicationThread *pdat,
        IDebugFormatter *pdf,
        IDebugProperty **ppdob) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSimpleConnectionPoint(
        IDispatch *pdisp,
        ISimpleConnectionPoint **ppscp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugHelper, 0x51973c3f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugHelperVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugHelper methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePropertyBrowser)(
        IDebugHelper *This,
        VARIANT *pvar,
        LPCOLESTR bstrName,
        IDebugApplicationThread *pdat,
        IDebugProperty **ppdob);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyBrowserEx)(
        IDebugHelper *This,
        VARIANT *pvar,
        LPCOLESTR bstrName,
        IDebugApplicationThread *pdat,
        IDebugFormatter *pdf,
        IDebugProperty **ppdob);

    HRESULT (STDMETHODCALLTYPE *CreateSimpleConnectionPoint)(
        IDebugHelper *This,
        IDispatch *pdisp,
        ISimpleConnectionPoint **ppscp);

    END_INTERFACE
} IDebugHelperVtbl;

interface IDebugHelper {
    CONST_VTBL IDebugHelperVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugHelper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugHelper_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugHelper_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugHelper methods ***/
#define IDebugHelper_CreatePropertyBrowser(This,pvar,bstrName,pdat,ppdob) (This)->lpVtbl->CreatePropertyBrowser(This,pvar,bstrName,pdat,ppdob)
#define IDebugHelper_CreatePropertyBrowserEx(This,pvar,bstrName,pdat,pdf,ppdob) (This)->lpVtbl->CreatePropertyBrowserEx(This,pvar,bstrName,pdat,pdf,ppdob)
#define IDebugHelper_CreateSimpleConnectionPoint(This,pdisp,ppscp) (This)->lpVtbl->CreateSimpleConnectionPoint(This,pdisp,ppscp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugHelper_QueryInterface(IDebugHelper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugHelper_AddRef(IDebugHelper* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugHelper_Release(IDebugHelper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugHelper methods ***/
static FORCEINLINE HRESULT IDebugHelper_CreatePropertyBrowser(IDebugHelper* This,VARIANT *pvar,LPCOLESTR bstrName,IDebugApplicationThread *pdat,IDebugProperty **ppdob) {
    return This->lpVtbl->CreatePropertyBrowser(This,pvar,bstrName,pdat,ppdob);
}
static FORCEINLINE HRESULT IDebugHelper_CreatePropertyBrowserEx(IDebugHelper* This,VARIANT *pvar,LPCOLESTR bstrName,IDebugApplicationThread *pdat,IDebugFormatter *pdf,IDebugProperty **ppdob) {
    return This->lpVtbl->CreatePropertyBrowserEx(This,pvar,bstrName,pdat,pdf,ppdob);
}
static FORCEINLINE HRESULT IDebugHelper_CreateSimpleConnectionPoint(IDebugHelper* This,IDispatch *pdisp,ISimpleConnectionPoint **ppscp) {
    return This->lpVtbl->CreateSimpleConnectionPoint(This,pdisp,ppscp);
}
#endif
#endif

#endif


#endif  /* __IDebugHelper_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumDebugExpressionContexts interface
 */
#ifndef __IEnumDebugExpressionContexts_INTERFACE_DEFINED__
#define __IEnumDebugExpressionContexts_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumDebugExpressionContexts, 0x51973c40, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c40-cb0c-11d0-b5c9-00a0244a0e7a")
IEnumDebugExpressionContexts : public IUnknown
{
    virtual HRESULT __stdcall Next(
        ULONG celt,
        IDebugExpressionContext **ppdec,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumDebugExpressionContexts **ppedec) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumDebugExpressionContexts, 0x51973c40, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IEnumDebugExpressionContextsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumDebugExpressionContexts methods ***/
    HRESULT (__stdcall *Next)(
        IEnumDebugExpressionContexts *This,
        ULONG celt,
        IDebugExpressionContext **ppdec,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumDebugExpressionContexts *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumDebugExpressionContexts *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumDebugExpressionContexts *This,
        IEnumDebugExpressionContexts **ppedec);

    END_INTERFACE
} IEnumDebugExpressionContextsVtbl;

interface IEnumDebugExpressionContexts {
    CONST_VTBL IEnumDebugExpressionContextsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumDebugExpressionContexts_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumDebugExpressionContexts_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumDebugExpressionContexts_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumDebugExpressionContexts methods ***/
#define IEnumDebugExpressionContexts_Next(This,celt,ppdec,pceltFetched) (This)->lpVtbl->Next(This,celt,ppdec,pceltFetched)
#define IEnumDebugExpressionContexts_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumDebugExpressionContexts_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumDebugExpressionContexts_Clone(This,ppedec) (This)->lpVtbl->Clone(This,ppedec)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumDebugExpressionContexts_QueryInterface(IEnumDebugExpressionContexts* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumDebugExpressionContexts_AddRef(IEnumDebugExpressionContexts* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumDebugExpressionContexts_Release(IEnumDebugExpressionContexts* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugExpressionContexts methods ***/
static FORCEINLINE HRESULT IEnumDebugExpressionContexts_Next(IEnumDebugExpressionContexts* This,ULONG celt,IDebugExpressionContext **ppdec,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,ppdec,pceltFetched);
}
static FORCEINLINE HRESULT IEnumDebugExpressionContexts_Skip(IEnumDebugExpressionContexts* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumDebugExpressionContexts_Reset(IEnumDebugExpressionContexts* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumDebugExpressionContexts_Clone(IEnumDebugExpressionContexts* This,IEnumDebugExpressionContexts **ppedec) {
    return This->lpVtbl->Clone(This,ppedec);
}
#endif
#endif

#endif

HRESULT __stdcall IEnumDebugExpressionContexts_RemoteNext_Proxy(
    IEnumDebugExpressionContexts* This,
    ULONG celt,
    IDebugExpressionContext **pprgdec,
    ULONG *pceltFetched);
void __RPC_STUB IEnumDebugExpressionContexts_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumDebugExpressionContexts_Next_Proxy(
    IEnumDebugExpressionContexts* This,
    ULONG celt,
    IDebugExpressionContext **ppdec,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumDebugExpressionContexts_Next_Stub(
    IEnumDebugExpressionContexts* This,
    ULONG celt,
    IDebugExpressionContext **pprgdec,
    ULONG *pceltFetched);

#endif  /* __IEnumDebugExpressionContexts_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IProvideExpressionContexts interface
 */
#ifndef __IProvideExpressionContexts_INTERFACE_DEFINED__
#define __IProvideExpressionContexts_INTERFACE_DEFINED__

DEFINE_GUID(IID_IProvideExpressionContexts, 0x51973c41, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c41-cb0c-11d0-b5c9-00a0244a0e7a")
IProvideExpressionContexts : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EnumExpressionContexts(
        IEnumDebugExpressionContexts **ppedec) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IProvideExpressionContexts, 0x51973c41, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IProvideExpressionContextsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IProvideExpressionContexts methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumExpressionContexts)(
        IProvideExpressionContexts *This,
        IEnumDebugExpressionContexts **ppedec);

    END_INTERFACE
} IProvideExpressionContextsVtbl;

interface IProvideExpressionContexts {
    CONST_VTBL IProvideExpressionContextsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IProvideExpressionContexts_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProvideExpressionContexts_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProvideExpressionContexts_Release(This) (This)->lpVtbl->Release(This)
/*** IProvideExpressionContexts methods ***/
#define IProvideExpressionContexts_EnumExpressionContexts(This,ppedec) (This)->lpVtbl->EnumExpressionContexts(This,ppedec)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IProvideExpressionContexts_QueryInterface(IProvideExpressionContexts* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IProvideExpressionContexts_AddRef(IProvideExpressionContexts* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IProvideExpressionContexts_Release(IProvideExpressionContexts* This) {
    return This->lpVtbl->Release(This);
}
/*** IProvideExpressionContexts methods ***/
static FORCEINLINE HRESULT IProvideExpressionContexts_EnumExpressionContexts(IProvideExpressionContexts* This,IEnumDebugExpressionContexts **ppedec) {
    return This->lpVtbl->EnumExpressionContexts(This,ppedec);
}
#endif
#endif

#endif


#endif  /* __IProvideExpressionContexts_INTERFACE_DEFINED__ */


DEFINE_GUID(LIBID_ProcessDebugManagerLib, 0x78a51821, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);

#ifndef __IActiveScriptDebug32_FWD_DEFINED__
#define __IActiveScriptDebug32_FWD_DEFINED__
typedef interface IActiveScriptDebug32 IActiveScriptDebug32;
#ifdef __cplusplus
interface IActiveScriptDebug32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptDebug64_FWD_DEFINED__
#define __IActiveScriptDebug64_FWD_DEFINED__
typedef interface IActiveScriptDebug64 IActiveScriptDebug64;
#ifdef __cplusplus
interface IActiveScriptDebug64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
#define __IActiveScriptErrorDebug_FWD_DEFINED__
typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
#ifdef __cplusplus
interface IActiveScriptErrorDebug;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteDebug32_FWD_DEFINED__
#define __IActiveScriptSiteDebug32_FWD_DEFINED__
typedef interface IActiveScriptSiteDebug32 IActiveScriptSiteDebug32;
#ifdef __cplusplus
interface IActiveScriptSiteDebug32;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteDebug64_FWD_DEFINED__
#define __IActiveScriptSiteDebug64_FWD_DEFINED__
typedef interface IActiveScriptSiteDebug64 IActiveScriptSiteDebug64;
#ifdef __cplusplus
interface IActiveScriptSiteDebug64;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptSiteDebugEx_FWD_DEFINED__
#define __IActiveScriptSiteDebugEx_FWD_DEFINED__
typedef interface IActiveScriptSiteDebugEx IActiveScriptSiteDebugEx;
#ifdef __cplusplus
interface IActiveScriptSiteDebugEx;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationDebugger_FWD_DEFINED__
#define __IApplicationDebugger_FWD_DEFINED__
typedef interface IApplicationDebugger IApplicationDebugger;
#ifdef __cplusplus
interface IApplicationDebugger;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationDebuggerUI_FWD_DEFINED__
#define __IApplicationDebuggerUI_FWD_DEFINED__
typedef interface IApplicationDebuggerUI IApplicationDebuggerUI;
#ifdef __cplusplus
interface IApplicationDebuggerUI;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplication32_FWD_DEFINED__
#define __IDebugApplication32_FWD_DEFINED__
typedef interface IDebugApplication32 IDebugApplication32;
#ifdef __cplusplus
interface IDebugApplication32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplication64_FWD_DEFINED__
#define __IDebugApplication64_FWD_DEFINED__
typedef interface IDebugApplication64 IDebugApplication64;
#ifdef __cplusplus
interface IDebugApplication64;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationNode_FWD_DEFINED__
#define __IDebugApplicationNode_FWD_DEFINED__
typedef interface IDebugApplicationNode IDebugApplicationNode;
#ifdef __cplusplus
interface IDebugApplicationNode;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
#define __IDebugApplicationNodeEvents_FWD_DEFINED__
typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
#ifdef __cplusplus
interface IDebugApplicationNodeEvents;
#endif /* __cplusplus */
#endif

#ifndef __IDebugApplicationThread_FWD_DEFINED__
#define __IDebugApplicationThread_FWD_DEFINED__
typedef interface IDebugApplicationThread IDebugApplicationThread;
#ifdef __cplusplus
interface IDebugApplicationThread;
#endif /* __cplusplus */
#endif

#ifndef __IDebugAsyncOperation_FWD_DEFINED__
#define __IDebugAsyncOperation_FWD_DEFINED__
typedef interface IDebugAsyncOperation IDebugAsyncOperation;
#ifdef __cplusplus
interface IDebugAsyncOperation;
#endif /* __cplusplus */
#endif

#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
#ifdef __cplusplus
interface IDebugAsyncOperationCallBack;
#endif /* __cplusplus */
#endif

#ifndef __IDebugCodeContext_FWD_DEFINED__
#define __IDebugCodeContext_FWD_DEFINED__
typedef interface IDebugCodeContext IDebugCodeContext;
#ifdef __cplusplus
interface IDebugCodeContext;
#endif /* __cplusplus */
#endif

#ifndef __IDebugCookie_FWD_DEFINED__
#define __IDebugCookie_FWD_DEFINED__
typedef interface IDebugCookie IDebugCookie;
#ifdef __cplusplus
interface IDebugCookie;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocument_FWD_DEFINED__
#define __IDebugDocument_FWD_DEFINED__
typedef interface IDebugDocument IDebugDocument;
#ifdef __cplusplus
interface IDebugDocument;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentContext_FWD_DEFINED__
#define __IDebugDocumentContext_FWD_DEFINED__
typedef interface IDebugDocumentContext IDebugDocumentContext;
#ifdef __cplusplus
interface IDebugDocumentContext;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentHelper32_FWD_DEFINED__
#define __IDebugDocumentHelper32_FWD_DEFINED__
typedef interface IDebugDocumentHelper32 IDebugDocumentHelper32;
#ifdef __cplusplus
interface IDebugDocumentHelper32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentHelper64_FWD_DEFINED__
#define __IDebugDocumentHelper64_FWD_DEFINED__
typedef interface IDebugDocumentHelper64 IDebugDocumentHelper64;
#ifdef __cplusplus
interface IDebugDocumentHelper64;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentHost_FWD_DEFINED__
#define __IDebugDocumentHost_FWD_DEFINED__
typedef interface IDebugDocumentHost IDebugDocumentHost;
#ifdef __cplusplus
interface IDebugDocumentHost;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentInfo_FWD_DEFINED__
#define __IDebugDocumentInfo_FWD_DEFINED__
typedef interface IDebugDocumentInfo IDebugDocumentInfo;
#ifdef __cplusplus
interface IDebugDocumentInfo;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentProvider_FWD_DEFINED__
#define __IDebugDocumentProvider_FWD_DEFINED__
typedef interface IDebugDocumentProvider IDebugDocumentProvider;
#ifdef __cplusplus
interface IDebugDocumentProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentText_FWD_DEFINED__
#define __IDebugDocumentText_FWD_DEFINED__
typedef interface IDebugDocumentText IDebugDocumentText;
#ifdef __cplusplus
interface IDebugDocumentText;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
#define __IDebugDocumentTextAuthor_FWD_DEFINED__
typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
#ifdef __cplusplus
interface IDebugDocumentTextAuthor;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
#define __IDebugDocumentTextEvents_FWD_DEFINED__
typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
#ifdef __cplusplus
interface IDebugDocumentTextEvents;
#endif /* __cplusplus */
#endif

#ifndef __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
#define __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
typedef interface IDebugDocumentTextExternalAuthor IDebugDocumentTextExternalAuthor;
#ifdef __cplusplus
interface IDebugDocumentTextExternalAuthor;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExpression_FWD_DEFINED__
#define __IDebugExpression_FWD_DEFINED__
typedef interface IDebugExpression IDebugExpression;
#ifdef __cplusplus
interface IDebugExpression;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
#define __IDebugExpressionCallBack_FWD_DEFINED__
typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
#ifdef __cplusplus
interface IDebugExpressionCallBack;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExpressionContext_FWD_DEFINED__
#define __IDebugExpressionContext_FWD_DEFINED__
typedef interface IDebugExpressionContext IDebugExpressionContext;
#ifdef __cplusplus
interface IDebugExpressionContext;
#endif /* __cplusplus */
#endif

#ifndef __IDebugFormatter_FWD_DEFINED__
#define __IDebugFormatter_FWD_DEFINED__
typedef interface IDebugFormatter IDebugFormatter;
#ifdef __cplusplus
interface IDebugFormatter;
#endif /* __cplusplus */
#endif

#ifndef __IDebugHelper_FWD_DEFINED__
#define __IDebugHelper_FWD_DEFINED__
typedef interface IDebugHelper IDebugHelper;
#ifdef __cplusplus
interface IDebugHelper;
#endif /* __cplusplus */
#endif

#ifndef __IDebugSessionProvider_FWD_DEFINED__
#define __IDebugSessionProvider_FWD_DEFINED__
typedef interface IDebugSessionProvider IDebugSessionProvider;
#ifdef __cplusplus
interface IDebugSessionProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrame_FWD_DEFINED__
#define __IDebugStackFrame_FWD_DEFINED__
typedef interface IDebugStackFrame IDebugStackFrame;
#ifdef __cplusplus
interface IDebugStackFrame;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
#define __IDebugStackFrameSniffer_FWD_DEFINED__
typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
#ifdef __cplusplus
interface IDebugStackFrameSniffer;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrameSnifferEx32_FWD_DEFINED__
#define __IDebugStackFrameSnifferEx32_FWD_DEFINED__
typedef interface IDebugStackFrameSnifferEx32 IDebugStackFrameSnifferEx32;
#ifdef __cplusplus
interface IDebugStackFrameSnifferEx32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugStackFrameSnifferEx64_FWD_DEFINED__
#define __IDebugStackFrameSnifferEx64_FWD_DEFINED__
typedef interface IDebugStackFrameSnifferEx64 IDebugStackFrameSnifferEx64;
#ifdef __cplusplus
interface IDebugStackFrameSnifferEx64;
#endif /* __cplusplus */
#endif

#ifndef __IDebugSyncOperation_FWD_DEFINED__
#define __IDebugSyncOperation_FWD_DEFINED__
typedef interface IDebugSyncOperation IDebugSyncOperation;
#ifdef __cplusplus
interface IDebugSyncOperation;
#endif /* __cplusplus */
#endif

#ifndef __IDebugThreadCall32_FWD_DEFINED__
#define __IDebugThreadCall32_FWD_DEFINED__
typedef interface IDebugThreadCall32 IDebugThreadCall32;
#ifdef __cplusplus
interface IDebugThreadCall32;
#endif /* __cplusplus */
#endif

#ifndef __IDebugThreadCall64_FWD_DEFINED__
#define __IDebugThreadCall64_FWD_DEFINED__
typedef interface IDebugThreadCall64 IDebugThreadCall64;
#ifdef __cplusplus
interface IDebugThreadCall64;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
#define __IEnumDebugApplicationNodes_FWD_DEFINED__
typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
#ifdef __cplusplus
interface IEnumDebugApplicationNodes;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
#define __IEnumDebugCodeContexts_FWD_DEFINED__
typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
#ifdef __cplusplus
interface IEnumDebugCodeContexts;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
#define __IEnumDebugExpressionContexts_FWD_DEFINED__
typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
#ifdef __cplusplus
interface IEnumDebugExpressionContexts;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
#define __IEnumDebugStackFrames_FWD_DEFINED__
typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
#ifdef __cplusplus
interface IEnumDebugStackFrames;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugStackFrames64_FWD_DEFINED__
#define __IEnumDebugStackFrames64_FWD_DEFINED__
typedef interface IEnumDebugStackFrames64 IEnumDebugStackFrames64;
#ifdef __cplusplus
interface IEnumDebugStackFrames64;
#endif /* __cplusplus */
#endif

#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
#define __IEnumRemoteDebugApplications_FWD_DEFINED__
typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
#ifdef __cplusplus
interface IEnumRemoteDebugApplications;
#endif /* __cplusplus */
#endif

#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
#ifdef __cplusplus
interface IEnumRemoteDebugApplicationThreads;
#endif /* __cplusplus */
#endif

#ifndef __IProcessDebugManager32_FWD_DEFINED__
#define __IProcessDebugManager32_FWD_DEFINED__
typedef interface IProcessDebugManager32 IProcessDebugManager32;
#ifdef __cplusplus
interface IProcessDebugManager32;
#endif /* __cplusplus */
#endif

#ifndef __IProcessDebugManager64_FWD_DEFINED__
#define __IProcessDebugManager64_FWD_DEFINED__
typedef interface IProcessDebugManager64 IProcessDebugManager64;
#ifdef __cplusplus
interface IProcessDebugManager64;
#endif /* __cplusplus */
#endif

#ifndef __IProvideExpressionContexts_FWD_DEFINED__
#define __IProvideExpressionContexts_FWD_DEFINED__
typedef interface IProvideExpressionContexts IProvideExpressionContexts;
#ifdef __cplusplus
interface IProvideExpressionContexts;
#endif /* __cplusplus */
#endif

#ifndef __IMachineDebugManager_FWD_DEFINED__
#define __IMachineDebugManager_FWD_DEFINED__
typedef interface IMachineDebugManager IMachineDebugManager;
#ifdef __cplusplus
interface IMachineDebugManager;
#endif /* __cplusplus */
#endif

#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
#define __IMachineDebugManagerCookie_FWD_DEFINED__
typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
#ifdef __cplusplus
interface IMachineDebugManagerCookie;
#endif /* __cplusplus */
#endif

#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
#define __IMachineDebugManagerEvents_FWD_DEFINED__
typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
#ifdef __cplusplus
interface IMachineDebugManagerEvents;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugApplication_FWD_DEFINED__
#define __IRemoteDebugApplication_FWD_DEFINED__
typedef interface IRemoteDebugApplication IRemoteDebugApplication;
#ifdef __cplusplus
interface IRemoteDebugApplication;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugApplicationEvents_FWD_DEFINED__
#define __IRemoteDebugApplicationEvents_FWD_DEFINED__
typedef interface IRemoteDebugApplicationEvents IRemoteDebugApplicationEvents;
#ifdef __cplusplus
interface IRemoteDebugApplicationEvents;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
#define __IRemoteDebugApplicationThread_FWD_DEFINED__
typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
#ifdef __cplusplus
interface IRemoteDebugApplicationThread;
#endif /* __cplusplus */
#endif

#ifndef __ISimpleConnectionPoint_FWD_DEFINED__
#define __ISimpleConnectionPoint_FWD_DEFINED__
typedef interface ISimpleConnectionPoint ISimpleConnectionPoint;
#ifdef __cplusplus
interface ISimpleConnectionPoint;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * ProcessDebugManager coclass
 */

DEFINE_GUID(CLSID_ProcessDebugManager, 0x78a51822, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);

#ifdef __cplusplus
class DECLSPEC_UUID("78a51822-51f4-11d0-8f20-00805f2cd064") ProcessDebugManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ProcessDebugManager, 0x78a51822, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
#endif
#endif

/*****************************************************************************
 * DebugHelper coclass
 */

DEFINE_GUID(CLSID_DebugHelper, 0x0bfcc060, 0x8c1d, 0x11d0, 0xac,0xcd, 0x00,0xaa,0x00,0x60,0x27,0x5c);

#ifdef __cplusplus
class DECLSPEC_UUID("0bfcc060-8c1d-11d0-accd-00aa0060275c") DebugHelper;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DebugHelper, 0x0bfcc060, 0x8c1d, 0x11d0, 0xac,0xcd, 0x00,0xaa,0x00,0x60,0x27,0x5c)
#endif
#endif

EXTERN_C const CLSID CLSID_CDebugDocumentHelper;
/*****************************************************************************
 * CDebugDocumentHelper coclass
 */

DEFINE_GUID(CLSID_CDebugDocumentHelper, 0x83b8bca6, 0x687c, 0x11d0, 0xa4,0x05, 0x00,0xaa,0x00,0x60,0x27,0x5c);

#ifdef __cplusplus
class DECLSPEC_UUID("83b8bca6-687c-11d0-a405-00aa0060275c") CDebugDocumentHelper;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CDebugDocumentHelper, 0x83b8bca6, 0x687c, 0x11d0, 0xa4,0x05, 0x00,0xaa,0x00,0x60,0x27,0x5c)
#endif
#endif

#ifdef DEBUG
#define MachineDebugManger MachineDebugManager_DEBUG
#define CLSID_MachineDebugManager CLSID_MachineDebugManager_DEBUG
#else
#define MachineDebugManger MachineDebugManager_RETAIL
#define CLSID_MachineDebugManager CLSID_MachineDebugManager_RETAIL
#endif
/*****************************************************************************
 * MachineDebugManager_RETAIL coclass
 */

DEFINE_GUID(CLSID_MachineDebugManager_RETAIL, 0x0c0a3666, 0x30c9, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);

#ifdef __cplusplus
class DECLSPEC_UUID("0c0a3666-30c9-11d0-8f20-00805f2cd064") MachineDebugManager_RETAIL;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MachineDebugManager_RETAIL, 0x0c0a3666, 0x30c9, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
#endif
#endif

/*****************************************************************************
 * MachineDebugManager_DEBUG coclass
 */

DEFINE_GUID(CLSID_MachineDebugManager_DEBUG, 0x49769cec, 0x3a55, 0x4bb0, 0xb6,0x97, 0x88,0xfe,0xde,0x77,0xe8,0xea);

#ifdef __cplusplus
class DECLSPEC_UUID("49769cec-3a55-4bb0-b697-88fede77e8ea") MachineDebugManager_DEBUG;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MachineDebugManager_DEBUG, 0x49769cec, 0x3a55, 0x4bb0, 0xb6,0x97, 0x88,0xfe,0xde,0x77,0xe8,0xea)
#endif
#endif

/*****************************************************************************
 * DefaultDebugSessionProvider coclass
 */

DEFINE_GUID(CLSID_DefaultDebugSessionProvider, 0x834128a2, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);

#ifdef __cplusplus
class DECLSPEC_UUID("834128a2-51f4-11d0-8f20-00805f2cd064") DefaultDebugSessionProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DefaultDebugSessionProvider, 0x834128a2, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
#endif
#endif

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

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __activdbg_h__ */
