/*** Autogenerated by WIDL 6.3 from include/activdbg.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

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

#ifndef __ProcessDebugManagerLib_LIBRARY_DEFINED__
#define __ProcessDebugManagerLib_LIBRARY_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 /* __ProcessDebugManagerLib_LIBRARY_DEFINED__ */
#endif
#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __activdbg_h__ */
