/*** Autogenerated by WIDL 8.12 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__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* 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 __WIDL_INLINE HRESULT IActiveScriptDebug32_QueryInterface(IActiveScriptDebug32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IActiveScriptDebug32_AddRef(IActiveScriptDebug32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IActiveScriptDebug32_Release(IActiveScriptDebug32* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptDebug32 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IActiveScriptDebug64_QueryInterface(IActiveScriptDebug64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IActiveScriptDebug64_AddRef(IActiveScriptDebug64* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IActiveScriptDebug64_Release(IActiveScriptDebug64* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptDebug64 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IActiveScriptSiteDebug32_QueryInterface(IActiveScriptSiteDebug32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IActiveScriptSiteDebug32_AddRef(IActiveScriptSiteDebug32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IActiveScriptSiteDebug32_Release(IActiveScriptSiteDebug32* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteDebug32 methods ***/
static __WIDL_INLINE HRESULT IActiveScriptSiteDebug32_GetDocumentContextFromPosition(IActiveScriptSiteDebug32* This,DWORD dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IDebugDocumentContext **ppsc) {
    return This->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc);
}
static __WIDL_INLINE HRESULT IActiveScriptSiteDebug32_GetApplication(IActiveScriptSiteDebug32* This,IDebugApplication32 **ppda) {
    return This->lpVtbl->GetApplication(This,ppda);
}
static __WIDL_INLINE HRESULT IActiveScriptSiteDebug32_GetRootApplicationNode(IActiveScriptSiteDebug32* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootApplicationNode(This,ppdanRoot);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IActiveScriptSiteDebug64_QueryInterface(IActiveScriptSiteDebug64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IActiveScriptSiteDebug64_AddRef(IActiveScriptSiteDebug64* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IActiveScriptSiteDebug64_Release(IActiveScriptSiteDebug64* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteDebug64 methods ***/
static __WIDL_INLINE HRESULT IActiveScriptSiteDebug64_GetDocumentContextFromPosition(IActiveScriptSiteDebug64* This,DWORDLONG dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IDebugDocumentContext **ppsc) {
    return This->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc);
}
static __WIDL_INLINE HRESULT IActiveScriptSiteDebug64_GetApplication(IActiveScriptSiteDebug64* This,IDebugApplication64 **ppda) {
    return This->lpVtbl->GetApplication(This,ppda);
}
static __WIDL_INLINE HRESULT IActiveScriptSiteDebug64_GetRootApplicationNode(IActiveScriptSiteDebug64* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootApplicationNode(This,ppdanRoot);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IActiveScriptSiteDebugEx_QueryInterface(IActiveScriptSiteDebugEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IActiveScriptSiteDebugEx_AddRef(IActiveScriptSiteDebugEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IActiveScriptSiteDebugEx_Release(IActiveScriptSiteDebugEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptSiteDebugEx methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IActiveScriptErrorDebug_QueryInterface(IActiveScriptErrorDebug* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IActiveScriptErrorDebug_AddRef(IActiveScriptErrorDebug* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IActiveScriptErrorDebug_Release(IActiveScriptErrorDebug* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptError methods ***/
static __WIDL_INLINE HRESULT IActiveScriptErrorDebug_GetExceptionInfo(IActiveScriptErrorDebug* This,EXCEPINFO *pexcepinfo) {
    return This->lpVtbl->GetExceptionInfo(This,pexcepinfo);
}
static __WIDL_INLINE HRESULT IActiveScriptErrorDebug_GetSourcePosition(IActiveScriptErrorDebug* This,DWORD *pdwSourceContext,ULONG *pulLineNumber,LONG *plCharacterPosition) {
    return This->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition);
}
static __WIDL_INLINE HRESULT IActiveScriptErrorDebug_GetSourceLineText(IActiveScriptErrorDebug* This,BSTR *pbstrSourceLine) {
    return This->lpVtbl->GetSourceLineText(This,pbstrSourceLine);
}
/*** IActiveScriptErrorDebug methods ***/
static __WIDL_INLINE HRESULT IActiveScriptErrorDebug_GetDocumentContext(IActiveScriptErrorDebug* This,IDebugDocumentContext **ppssc) {
    return This->lpVtbl->GetDocumentContext(This,ppssc);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugCodeContext_QueryInterface(IDebugCodeContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugCodeContext_AddRef(IDebugCodeContext* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugCodeContext_Release(IDebugCodeContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugCodeContext methods ***/
static __WIDL_INLINE HRESULT IDebugCodeContext_GetDocumentContext(IDebugCodeContext* This,IDebugDocumentContext **ppsc) {
    return This->lpVtbl->GetDocumentContext(This,ppsc);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugExpression_QueryInterface(IDebugExpression* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugExpression_AddRef(IDebugExpression* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugExpression_Release(IDebugExpression* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugExpression methods ***/
static __WIDL_INLINE HRESULT IDebugExpression_Start(IDebugExpression* This,IDebugExpressionCallBack *pdecb) {
    return This->lpVtbl->Start(This,pdecb);
}
static __WIDL_INLINE HRESULT IDebugExpression_Abort(IDebugExpression* This) {
    return This->lpVtbl->Abort(This);
}
static __WIDL_INLINE HRESULT IDebugExpression_QueryIsComplete(IDebugExpression* This) {
    return This->lpVtbl->QueryIsComplete(This);
}
static __WIDL_INLINE HRESULT IDebugExpression_GetResultAsString(IDebugExpression* This,HRESULT *phrResult,BSTR *pbstrResult) {
    return This->lpVtbl->GetResultAsString(This,phrResult,pbstrResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugExpressionContext_QueryInterface(IDebugExpressionContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugExpressionContext_AddRef(IDebugExpressionContext* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugExpressionContext_Release(IDebugExpressionContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugExpressionContext methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugExpressionCallBack_QueryInterface(IDebugExpressionCallBack* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugExpressionCallBack_AddRef(IDebugExpressionCallBack* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugExpressionCallBack_Release(IDebugExpressionCallBack* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugExpressionCallBack methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugStackFrame_QueryInterface(IDebugStackFrame* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugStackFrame_AddRef(IDebugStackFrame* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugStackFrame_Release(IDebugStackFrame* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugStackFrame methods ***/
static __WIDL_INLINE HRESULT IDebugStackFrame_GetCodeContext(IDebugStackFrame* This,IDebugCodeContext **ppcc) {
    return This->lpVtbl->GetCodeContext(This,ppcc);
}
static __WIDL_INLINE HRESULT IDebugStackFrame_GetDescriptionString(IDebugStackFrame* This,WINBOOL fLong,BSTR *pbstrDescription) {
    return This->lpVtbl->GetDescriptionString(This,fLong,pbstrDescription);
}
static __WIDL_INLINE HRESULT IDebugStackFrame_GetLanguageString(IDebugStackFrame* This,WINBOOL fLong,BSTR *pbstrLanguage) {
    return This->lpVtbl->GetLanguageString(This,fLong,pbstrLanguage);
}
static __WIDL_INLINE HRESULT IDebugStackFrame_GetThread(IDebugStackFrame* This,IDebugApplicationThread **ppat) {
    return This->lpVtbl->GetThread(This,ppat);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugStackFrameSniffer_QueryInterface(IDebugStackFrameSniffer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugStackFrameSniffer_AddRef(IDebugStackFrameSniffer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugStackFrameSniffer_Release(IDebugStackFrameSniffer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugStackFrameSniffer methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugStackFrameSnifferEx32_QueryInterface(IDebugStackFrameSnifferEx32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugStackFrameSnifferEx32_AddRef(IDebugStackFrameSnifferEx32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugStackFrameSnifferEx32_Release(IDebugStackFrameSnifferEx32* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugStackFrameSniffer methods ***/
static __WIDL_INLINE HRESULT IDebugStackFrameSnifferEx32_EnumStackFrames(IDebugStackFrameSnifferEx32* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
/*** IDebugStackFrameSnifferEx32 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugStackFrameSnifferEx64_QueryInterface(IDebugStackFrameSnifferEx64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugStackFrameSnifferEx64_AddRef(IDebugStackFrameSnifferEx64* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugStackFrameSnifferEx64_Release(IDebugStackFrameSnifferEx64* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugStackFrameSniffer methods ***/
static __WIDL_INLINE HRESULT IDebugStackFrameSnifferEx64_EnumStackFrames(IDebugStackFrameSnifferEx64* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
/*** IDebugStackFrameSnifferEx64 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugSyncOperation_QueryInterface(IDebugSyncOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugSyncOperation_AddRef(IDebugSyncOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugSyncOperation_Release(IDebugSyncOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugSyncOperation methods ***/
static __WIDL_INLINE HRESULT IDebugSyncOperation_GetTargetThread(IDebugSyncOperation* This,IDebugApplicationThread **ppatTarget) {
    return This->lpVtbl->GetTargetThread(This,ppatTarget);
}
static __WIDL_INLINE HRESULT IDebugSyncOperation_Execute(IDebugSyncOperation* This,IUnknown **ppunkResult) {
    return This->lpVtbl->Execute(This,ppunkResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugAsyncOperation_QueryInterface(IDebugAsyncOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugAsyncOperation_AddRef(IDebugAsyncOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugAsyncOperation_Release(IDebugAsyncOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugAsyncOperation methods ***/
static __WIDL_INLINE HRESULT IDebugAsyncOperation_GetSyncDebugOperation(IDebugAsyncOperation* This,IDebugSyncOperation **ppsdo) {
    return This->lpVtbl->GetSyncDebugOperation(This,ppsdo);
}
static __WIDL_INLINE HRESULT IDebugAsyncOperation_Start(IDebugAsyncOperation* This,IDebugAsyncOperationCallBack *padocb) {
    return This->lpVtbl->Start(This,padocb);
}
static __WIDL_INLINE HRESULT IDebugAsyncOperation_Abort(IDebugAsyncOperation* This) {
    return This->lpVtbl->Abort(This);
}
static __WIDL_INLINE HRESULT IDebugAsyncOperation_QueryIsComplete(IDebugAsyncOperation* This) {
    return This->lpVtbl->QueryIsComplete(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugAsyncOperationCallBack_QueryInterface(IDebugAsyncOperationCallBack* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugAsyncOperationCallBack_AddRef(IDebugAsyncOperationCallBack* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugAsyncOperationCallBack_Release(IDebugAsyncOperationCallBack* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugAsyncOperationCallBack methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEnumDebugCodeContexts_QueryInterface(IEnumDebugCodeContexts* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumDebugCodeContexts_AddRef(IEnumDebugCodeContexts* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumDebugCodeContexts_Release(IEnumDebugCodeContexts* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugCodeContexts methods ***/
static __WIDL_INLINE HRESULT IEnumDebugCodeContexts_Next(IEnumDebugCodeContexts* This,ULONG celt,IDebugCodeContext **pscc,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,pscc,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumDebugCodeContexts_Skip(IEnumDebugCodeContexts* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumDebugCodeContexts_Reset(IEnumDebugCodeContexts* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEnumDebugStackFrames_QueryInterface(IEnumDebugStackFrames* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumDebugStackFrames_AddRef(IEnumDebugStackFrames* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumDebugStackFrames_Release(IEnumDebugStackFrames* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugStackFrames methods ***/
static __WIDL_INLINE HRESULT IEnumDebugStackFrames_Next(IEnumDebugStackFrames* This,ULONG celt,DebugStackFrameDescriptor *prgdsfd,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,prgdsfd,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumDebugStackFrames_Skip(IEnumDebugStackFrames* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumDebugStackFrames_Reset(IEnumDebugStackFrames* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEnumDebugStackFrames64_QueryInterface(IEnumDebugStackFrames64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumDebugStackFrames64_AddRef(IEnumDebugStackFrames64* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumDebugStackFrames64_Release(IEnumDebugStackFrames64* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugStackFrames methods ***/
static __WIDL_INLINE HRESULT IEnumDebugStackFrames64_Next(IEnumDebugStackFrames64* This,ULONG celt,DebugStackFrameDescriptor *prgdsfd,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,prgdsfd,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumDebugStackFrames64_Skip(IEnumDebugStackFrames64* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumDebugStackFrames64_Reset(IEnumDebugStackFrames64* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE HRESULT IEnumDebugStackFrames64_Clone(IEnumDebugStackFrames64* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->Clone(This,ppedsf);
}
/*** IEnumDebugStackFrames64 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentInfo_QueryInterface(IDebugDocumentInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentInfo_AddRef(IDebugDocumentInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentInfo_Release(IDebugDocumentInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentInfo_GetName(IDebugDocumentInfo* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentProvider_QueryInterface(IDebugDocumentProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentProvider_AddRef(IDebugDocumentProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentProvider_Release(IDebugDocumentProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentProvider_GetName(IDebugDocumentProvider* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static __WIDL_INLINE HRESULT IDebugDocumentProvider_GetDocumentClassId(IDebugDocumentProvider* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
/*** IDebugDocumentProvider methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocument_QueryInterface(IDebugDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocument_AddRef(IDebugDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocument_Release(IDebugDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static __WIDL_INLINE HRESULT IDebugDocument_GetName(IDebugDocument* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentText_QueryInterface(IDebugDocumentText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentText_AddRef(IDebugDocumentText* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentText_Release(IDebugDocumentText* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentText_GetName(IDebugDocumentText* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static __WIDL_INLINE HRESULT IDebugDocumentText_GetDocumentClassId(IDebugDocumentText* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
/*** IDebugDocumentText methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentText_GetDocumentAttributes(IDebugDocumentText* This,TEXT_DOC_ATTR *ptextdocattr) {
    return This->lpVtbl->GetDocumentAttributes(This,ptextdocattr);
}
static __WIDL_INLINE HRESULT IDebugDocumentText_GetSize(IDebugDocumentText* This,ULONG *pcNumLines,ULONG *pcNumChars) {
    return This->lpVtbl->GetSize(This,pcNumLines,pcNumChars);
}
static __WIDL_INLINE HRESULT IDebugDocumentText_GetPositionOfLine(IDebugDocumentText* This,ULONG cLineNumber,ULONG *pcCharacterPosition) {
    return This->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition);
}
static __WIDL_INLINE HRESULT IDebugDocumentText_GetLineOfPosition(IDebugDocumentText* This,ULONG cCharacterPosition,ULONG *pcLineNumber,ULONG *pcCharacterOffsetInLine) {
    return This->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentText_GetPositionOfContext(IDebugDocumentText* This,IDebugDocumentContext *psc,ULONG *pcCharacterPosition,ULONG *cNumChars) {
    return This->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentTextEvents_QueryInterface(IDebugDocumentTextEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentTextEvents_AddRef(IDebugDocumentTextEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentTextEvents_Release(IDebugDocumentTextEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentTextEvents methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentTextEvents_onDestroy(IDebugDocumentTextEvents* This) {
    return This->lpVtbl->onDestroy(This);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextEvents_onInsertText(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToInsert) {
    return This->lpVtbl->onInsertText(This,cCharacterPosition,cNumToInsert);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextEvents_onRemoveText(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToRemove) {
    return This->lpVtbl->onRemoveText(This,cCharacterPosition,cNumToRemove);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextEvents_onReplaceText(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToReplace) {
    return This->lpVtbl->onReplaceText(This,cCharacterPosition,cNumToReplace);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextEvents_onUpdateTextAttributes(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToUpdate) {
    return This->lpVtbl->onUpdateTextAttributes(This,cCharacterPosition,cNumToUpdate);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_QueryInterface(IDebugDocumentTextAuthor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentTextAuthor_AddRef(IDebugDocumentTextAuthor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentTextAuthor_Release(IDebugDocumentTextAuthor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_GetName(IDebugDocumentTextAuthor* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_GetDocumentClassId(IDebugDocumentTextAuthor* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
/*** IDebugDocumentText methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_GetDocumentAttributes(IDebugDocumentTextAuthor* This,TEXT_DOC_ATTR *ptextdocattr) {
    return This->lpVtbl->GetDocumentAttributes(This,ptextdocattr);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_GetSize(IDebugDocumentTextAuthor* This,ULONG *pcNumLines,ULONG *pcNumChars) {
    return This->lpVtbl->GetSize(This,pcNumLines,pcNumChars);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_GetPositionOfLine(IDebugDocumentTextAuthor* This,ULONG cLineNumber,ULONG *pcCharacterPosition) {
    return This->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_GetLineOfPosition(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG *pcLineNumber,ULONG *pcCharacterOffsetInLine) {
    return This->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_GetPositionOfContext(IDebugDocumentTextAuthor* This,IDebugDocumentContext *psc,ULONG *pcCharacterPosition,ULONG *cNumChars) {
    return This->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_GetContextOfPosition(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumChars,IDebugDocumentContext **ppsc) {
    return This->lpVtbl->GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc);
}
/*** IDebugDocumentTextAuthor methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_InsertText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumToInsert,OLECHAR pcharText[]) {
    return This->lpVtbl->InsertText(This,cCharacterPosition,cNumToInsert,pcharText);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextAuthor_RemoveText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumToRemove) {
    return This->lpVtbl->RemoveText(This,cCharacterPosition,cNumToRemove);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentTextExternalAuthor_QueryInterface(IDebugDocumentTextExternalAuthor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentTextExternalAuthor_AddRef(IDebugDocumentTextExternalAuthor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentTextExternalAuthor_Release(IDebugDocumentTextExternalAuthor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentTextExternalAuthor methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentTextExternalAuthor_GetPathName(IDebugDocumentTextExternalAuthor* This,BSTR *pbstrLongName,WINBOOL *pfIsOriginalFile) {
    return This->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile);
}
static __WIDL_INLINE HRESULT IDebugDocumentTextExternalAuthor_GetFileName(IDebugDocumentTextExternalAuthor* This,BSTR *pbstrShortName) {
    return This->lpVtbl->GetFileName(This,pbstrShortName);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentHelper32_QueryInterface(IDebugDocumentHelper32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentHelper32_AddRef(IDebugDocumentHelper32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentHelper32_Release(IDebugDocumentHelper32* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentHelper32 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentHelper32_Attach(IDebugDocumentHelper32* This,IDebugDocumentHelper32 *pddhParent) {
    return This->lpVtbl->Attach(This,pddhParent);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_Detach(IDebugDocumentHelper32* This) {
    return This->lpVtbl->Detach(This);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_AddUnicodeText(IDebugDocumentHelper32* This,LPCOLESTR pszText) {
    return This->lpVtbl->AddUnicodeText(This,pszText);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_AddDBCSText(IDebugDocumentHelper32* This,LPCSTR pszText) {
    return This->lpVtbl->AddDBCSText(This,pszText);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_SetDebugDocumentHost(IDebugDocumentHelper32* This,IDebugDocumentHost *pddh) {
    return This->lpVtbl->SetDebugDocumentHost(This,pddh);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_AddDeferredText(IDebugDocumentHelper32* This,ULONG cChars,DWORD dwTextStartCookie) {
    return This->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentHelper32_SetDefaultTextAttr(IDebugDocumentHelper32* This,SOURCE_TEXT_ATTR staTextAttr) {
    return This->lpVtbl->SetDefaultTextAttr(This,staTextAttr);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_SetTextAttributes(IDebugDocumentHelper32* This,ULONG ulCharOffset,ULONG cChars,SOURCE_TEXT_ATTR *pstaTextAttr) {
    return This->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_SetLongName(IDebugDocumentHelper32* This,LPCOLESTR pszLongName) {
    return This->lpVtbl->SetLongName(This,pszLongName);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_SetShortName(IDebugDocumentHelper32* This,LPCOLESTR pszShortName) {
    return This->lpVtbl->SetShortName(This,pszShortName);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_SetDocumentAttr(IDebugDocumentHelper32* This,TEXT_DOC_ATTR pszAttributes) {
    return This->lpVtbl->SetDocumentAttr(This,pszAttributes);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_GetDebugApplicationNode(IDebugDocumentHelper32* This,IDebugApplicationNode **ppdan) {
    return This->lpVtbl->GetDebugApplicationNode(This,ppdan);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_GetScriptBlockInfo(IDebugDocumentHelper32* This,DWORD dwSourceContext,IActiveScript **ppasd,ULONG *piCharPos,ULONG *pcChars) {
    return This->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_CreateDebugDocumentContext(IDebugDocumentHelper32* This,ULONG iCharPos,ULONG cChars,IDebugDocumentContext **ppddc) {
    return This->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper32_BringDocumentToTop(IDebugDocumentHelper32* This) {
    return This->lpVtbl->BringDocumentToTop(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentHelper64_QueryInterface(IDebugDocumentHelper64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentHelper64_AddRef(IDebugDocumentHelper64* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentHelper64_Release(IDebugDocumentHelper64* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentHelper64 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentHelper64_Attach(IDebugDocumentHelper64* This,IDebugDocumentHelper64 *pddhParent) {
    return This->lpVtbl->Attach(This,pddhParent);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_Detach(IDebugDocumentHelper64* This) {
    return This->lpVtbl->Detach(This);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_AddUnicodeText(IDebugDocumentHelper64* This,LPCOLESTR pszText) {
    return This->lpVtbl->AddUnicodeText(This,pszText);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_AddDBCSText(IDebugDocumentHelper64* This,LPCSTR pszText) {
    return This->lpVtbl->AddDBCSText(This,pszText);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_SetDebugDocumentHost(IDebugDocumentHelper64* This,IDebugDocumentHost *pddh) {
    return This->lpVtbl->SetDebugDocumentHost(This,pddh);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_AddDeferredText(IDebugDocumentHelper64* This,ULONG cChars,DWORD dwTextStartCookie) {
    return This->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentHelper64_SetDefaultTextAttr(IDebugDocumentHelper64* This,SOURCE_TEXT_ATTR staTextAttr) {
    return This->lpVtbl->SetDefaultTextAttr(This,staTextAttr);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_SetTextAttributes(IDebugDocumentHelper64* This,ULONG ulCharOffset,ULONG cChars,SOURCE_TEXT_ATTR *pstaTextAttr) {
    return This->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_SetLongName(IDebugDocumentHelper64* This,LPCOLESTR pszLongName) {
    return This->lpVtbl->SetLongName(This,pszLongName);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_SetShortName(IDebugDocumentHelper64* This,LPCOLESTR pszShortName) {
    return This->lpVtbl->SetShortName(This,pszShortName);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_SetDocumentAttr(IDebugDocumentHelper64* This,TEXT_DOC_ATTR pszAttributes) {
    return This->lpVtbl->SetDocumentAttr(This,pszAttributes);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_GetDebugApplicationNode(IDebugDocumentHelper64* This,IDebugApplicationNode **ppdan) {
    return This->lpVtbl->GetDebugApplicationNode(This,ppdan);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_GetScriptBlockInfo(IDebugDocumentHelper64* This,DWORDLONG dwSourceContext,IActiveScript **ppasd,ULONG *piCharPos,ULONG *pcChars) {
    return This->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_CreateDebugDocumentContext(IDebugDocumentHelper64* This,ULONG iCharPos,ULONG cChars,IDebugDocumentContext **ppddc) {
    return This->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc);
}
static __WIDL_INLINE HRESULT IDebugDocumentHelper64_BringDocumentToTop(IDebugDocumentHelper64* This) {
    return This->lpVtbl->BringDocumentToTop(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentHost_QueryInterface(IDebugDocumentHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentHost_AddRef(IDebugDocumentHost* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentHost_Release(IDebugDocumentHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentHost methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentHost_OnCreateDocumentContext(IDebugDocumentHost* This,IUnknown **ppunkOuter) {
    return This->lpVtbl->OnCreateDocumentContext(This,ppunkOuter);
}
static __WIDL_INLINE HRESULT IDebugDocumentHost_GetPathName(IDebugDocumentHost* This,BSTR *pbstrLongName,WINBOOL *pfIsOriginalFile) {
    return This->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile);
}
static __WIDL_INLINE HRESULT IDebugDocumentHost_GetFileName(IDebugDocumentHost* This,BSTR *pbstrShortName) {
    return This->lpVtbl->GetFileName(This,pbstrShortName);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugDocumentContext_QueryInterface(IDebugDocumentContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugDocumentContext_AddRef(IDebugDocumentContext* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugDocumentContext_Release(IDebugDocumentContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentContext methods ***/
static __WIDL_INLINE HRESULT IDebugDocumentContext_GetDocument(IDebugDocumentContext* This,IDebugDocument **ppsd) {
    return This->lpVtbl->GetDocument(This,ppsd);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugSessionProvider_QueryInterface(IDebugSessionProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugSessionProvider_AddRef(IDebugSessionProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugSessionProvider_Release(IDebugSessionProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugSessionProvider methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IApplicationDebugger_QueryInterface(IApplicationDebugger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IApplicationDebugger_AddRef(IApplicationDebugger* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IApplicationDebugger_Release(IApplicationDebugger* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDebugger methods ***/
static __WIDL_INLINE HRESULT IApplicationDebugger_QueryAlive(IApplicationDebugger* This) {
    return This->lpVtbl->QueryAlive(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IApplicationDebugger_onDebugOutput(IApplicationDebugger* This,LPCOLESTR pstr) {
    return This->lpVtbl->onDebugOutput(This,pstr);
}
static __WIDL_INLINE HRESULT IApplicationDebugger_onHandleBreakPoint(IApplicationDebugger* This,IRemoteDebugApplicationThread *prpt,BREAKREASON br,IActiveScriptErrorDebug *pError) {
    return This->lpVtbl->onHandleBreakPoint(This,prpt,br,pError);
}
static __WIDL_INLINE HRESULT IApplicationDebugger_onClose(IApplicationDebugger* This) {
    return This->lpVtbl->onClose(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IApplicationDebuggerUI_QueryInterface(IApplicationDebuggerUI* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IApplicationDebuggerUI_AddRef(IApplicationDebuggerUI* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IApplicationDebuggerUI_Release(IApplicationDebuggerUI* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDebuggerUI methods ***/
static __WIDL_INLINE HRESULT IApplicationDebuggerUI_BringDocumentToTop(IApplicationDebuggerUI* This,IDebugDocumentText *pddt) {
    return This->lpVtbl->BringDocumentToTop(This,pddt);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMachineDebugManager_QueryInterface(IMachineDebugManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMachineDebugManager_AddRef(IMachineDebugManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMachineDebugManager_Release(IMachineDebugManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IMachineDebugManager methods ***/
static __WIDL_INLINE HRESULT IMachineDebugManager_AddApplication(IMachineDebugManager* This,IRemoteDebugApplication *pda,DWORD *pdwAppCookie) {
    return This->lpVtbl->AddApplication(This,pda,pdwAppCookie);
}
static __WIDL_INLINE HRESULT IMachineDebugManager_RemoveApplication(IMachineDebugManager* This,DWORD dwAppCookie) {
    return This->lpVtbl->RemoveApplication(This,dwAppCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMachineDebugManagerCookie_QueryInterface(IMachineDebugManagerCookie* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMachineDebugManagerCookie_AddRef(IMachineDebugManagerCookie* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMachineDebugManagerCookie_Release(IMachineDebugManagerCookie* This) {
    return This->lpVtbl->Release(This);
}
/*** IMachineDebugManagerCookie methods ***/
static __WIDL_INLINE HRESULT IMachineDebugManagerCookie_AddApplication(IMachineDebugManagerCookie* This,IRemoteDebugApplication *pda,DWORD dwDebugAppCookie,DWORD *pdwAppCookie) {
    return This->lpVtbl->AddApplication(This,pda,dwDebugAppCookie,pdwAppCookie);
}
static __WIDL_INLINE HRESULT IMachineDebugManagerCookie_RemoveApplication(IMachineDebugManagerCookie* This,DWORD dwDebugAppCookie,DWORD dwAppCookie) {
    return This->lpVtbl->RemoveApplication(This,dwDebugAppCookie,dwAppCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMachineDebugManagerEvents_QueryInterface(IMachineDebugManagerEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMachineDebugManagerEvents_AddRef(IMachineDebugManagerEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMachineDebugManagerEvents_Release(IMachineDebugManagerEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IMachineDebugManagerEvents methods ***/
static __WIDL_INLINE HRESULT IMachineDebugManagerEvents_onAddApplication(IMachineDebugManagerEvents* This,IRemoteDebugApplication *pda,DWORD dwAppCookie) {
    return This->lpVtbl->onAddApplication(This,pda,dwAppCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IProcessDebugManager32_QueryInterface(IProcessDebugManager32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IProcessDebugManager32_AddRef(IProcessDebugManager32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IProcessDebugManager32_Release(IProcessDebugManager32* This) {
    return This->lpVtbl->Release(This);
}
/*** IProcessDebugManager32 methods ***/
static __WIDL_INLINE HRESULT IProcessDebugManager32_CreateApplication(IProcessDebugManager32* This,IDebugApplication32 **ppda) {
    return This->lpVtbl->CreateApplication(This,ppda);
}
static __WIDL_INLINE HRESULT IProcessDebugManager32_GetDefaultApplication(IProcessDebugManager32* This,IDebugApplication32 **ppda) {
    return This->lpVtbl->GetDefaultApplication(This,ppda);
}
static __WIDL_INLINE HRESULT IProcessDebugManager32_AddApplication(IProcessDebugManager32* This,IDebugApplication32 *pda,DWORD *pdwAppCookie) {
    return This->lpVtbl->AddApplication(This,pda,pdwAppCookie);
}
static __WIDL_INLINE HRESULT IProcessDebugManager32_RemoveApplication(IProcessDebugManager32* This,DWORD dwAppCookie) {
    return This->lpVtbl->RemoveApplication(This,dwAppCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IProcessDebugManager64_QueryInterface(IProcessDebugManager64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IProcessDebugManager64_AddRef(IProcessDebugManager64* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IProcessDebugManager64_Release(IProcessDebugManager64* This) {
    return This->lpVtbl->Release(This);
}
/*** IProcessDebugManager64 methods ***/
static __WIDL_INLINE HRESULT IProcessDebugManager64_CreateApplication(IProcessDebugManager64* This,IDebugApplication64 **ppda) {
    return This->lpVtbl->CreateApplication(This,ppda);
}
static __WIDL_INLINE HRESULT IProcessDebugManager64_GetDefaultApplication(IProcessDebugManager64* This,IDebugApplication64 **ppda) {
    return This->lpVtbl->GetDefaultApplication(This,ppda);
}
static __WIDL_INLINE HRESULT IProcessDebugManager64_AddApplication(IProcessDebugManager64* This,IDebugApplication64 *pda,DWORD *pdwAppCookie) {
    return This->lpVtbl->AddApplication(This,pda,pdwAppCookie);
}
static __WIDL_INLINE HRESULT IProcessDebugManager64_RemoveApplication(IProcessDebugManager64* This,DWORD dwAppCookie) {
    return This->lpVtbl->RemoveApplication(This,dwAppCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRemoteDebugApplication_QueryInterface(IRemoteDebugApplication* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRemoteDebugApplication_AddRef(IRemoteDebugApplication* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRemoteDebugApplication_Release(IRemoteDebugApplication* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplication methods ***/
static __WIDL_INLINE HRESULT IRemoteDebugApplication_ResumeFromBreakPoint(IRemoteDebugApplication* This,IRemoteDebugApplicationThread *prptFocus,BREAKRESUMEACTION bra,ERRORRESUMEACTION era) {
    return This->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplication_CauseBreak(IRemoteDebugApplication* This) {
    return This->lpVtbl->CauseBreak(This);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplication_ConnectDebugger(IRemoteDebugApplication* This,IApplicationDebugger *pad) {
    return This->lpVtbl->ConnectDebugger(This,pad);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplication_DisconnectDebugger(IRemoteDebugApplication* This) {
    return This->lpVtbl->DisconnectDebugger(This);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplication_GetDebugger(IRemoteDebugApplication* This,IApplicationDebugger **pad) {
    return This->lpVtbl->GetDebugger(This,pad);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRemoteDebugApplication_QueryAlive(IRemoteDebugApplication* This) {
    return This->lpVtbl->QueryAlive(This);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplication_EnumThreads(IRemoteDebugApplication* This,IEnumRemoteDebugApplicationThreads **pperdat) {
    return This->lpVtbl->EnumThreads(This,pperdat);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplication_GetName(IRemoteDebugApplication* This,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,pbstrName);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplication_GetRootNode(IRemoteDebugApplication* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootNode(This,ppdanRoot);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugApplication32_QueryInterface(IDebugApplication32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugApplication32_AddRef(IDebugApplication32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugApplication32_Release(IDebugApplication32* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplication methods ***/
static __WIDL_INLINE HRESULT IDebugApplication32_ResumeFromBreakPoint(IDebugApplication32* This,IRemoteDebugApplicationThread *prptFocus,BREAKRESUMEACTION bra,ERRORRESUMEACTION era) {
    return This->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era);
}
static __WIDL_INLINE HRESULT IDebugApplication32_CauseBreak(IDebugApplication32* This) {
    return This->lpVtbl->CauseBreak(This);
}
static __WIDL_INLINE HRESULT IDebugApplication32_ConnectDebugger(IDebugApplication32* This,IApplicationDebugger *pad) {
    return This->lpVtbl->ConnectDebugger(This,pad);
}
static __WIDL_INLINE HRESULT IDebugApplication32_DisconnectDebugger(IDebugApplication32* This) {
    return This->lpVtbl->DisconnectDebugger(This);
}
static __WIDL_INLINE HRESULT IDebugApplication32_GetDebugger(IDebugApplication32* This,IApplicationDebugger **pad) {
    return This->lpVtbl->GetDebugger(This,pad);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugApplication32_QueryAlive(IDebugApplication32* This) {
    return This->lpVtbl->QueryAlive(This);
}
static __WIDL_INLINE HRESULT IDebugApplication32_EnumThreads(IDebugApplication32* This,IEnumRemoteDebugApplicationThreads **pperdat) {
    return This->lpVtbl->EnumThreads(This,pperdat);
}
static __WIDL_INLINE HRESULT IDebugApplication32_GetName(IDebugApplication32* This,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,pbstrName);
}
static __WIDL_INLINE HRESULT IDebugApplication32_GetRootNode(IDebugApplication32* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootNode(This,ppdanRoot);
}
static __WIDL_INLINE HRESULT IDebugApplication32_EnumGlobalExpressionContexts(IDebugApplication32* This,IEnumDebugExpressionContexts **ppedec) {
    return This->lpVtbl->EnumGlobalExpressionContexts(This,ppedec);
}
/*** IDebugApplication32 methods ***/
static __WIDL_INLINE HRESULT IDebugApplication32_SetName(IDebugApplication32* This,LPCOLESTR pstrName) {
    return This->lpVtbl->SetName(This,pstrName);
}
static __WIDL_INLINE HRESULT IDebugApplication32_StepOutComplete(IDebugApplication32* This) {
    return This->lpVtbl->StepOutComplete(This);
}
static __WIDL_INLINE HRESULT IDebugApplication32_DebugOutput(IDebugApplication32* This,LPCOLESTR pstr) {
    return This->lpVtbl->DebugOutput(This,pstr);
}
static __WIDL_INLINE HRESULT IDebugApplication32_StartDebugSession(IDebugApplication32* This) {
    return This->lpVtbl->StartDebugSession(This);
}
static __WIDL_INLINE HRESULT IDebugApplication32_HandleBreakPoint(IDebugApplication32* This,BREAKREASON br,BREAKRESUMEACTION *pbra) {
    return This->lpVtbl->HandleBreakPoint(This,br,pbra);
}
static __WIDL_INLINE HRESULT IDebugApplication32_Close(IDebugApplication32* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT IDebugApplication32_GetBreakFlags(IDebugApplication32* This,APPBREAKFLAGS *pabf,IRemoteDebugApplicationThread **pprdatSteppingThread) {
    return This->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread);
}
static __WIDL_INLINE HRESULT IDebugApplication32_GetCurrentThread(IDebugApplication32* This,IDebugApplicationThread **pat) {
    return This->lpVtbl->GetCurrentThread(This,pat);
}
static __WIDL_INLINE HRESULT IDebugApplication32_CreateAsyncDebugOperation(IDebugApplication32* This,IDebugSyncOperation *psdo,IDebugAsyncOperation **ppado) {
    return This->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado);
}
static __WIDL_INLINE HRESULT IDebugApplication32_AddStackFrameSniffer(IDebugApplication32* This,IDebugStackFrameSniffer *pdsfs,DWORD *pdwCookie) {
    return This->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie);
}
static __WIDL_INLINE HRESULT IDebugApplication32_RemoveStackFrameSniffer(IDebugApplication32* This,DWORD dwCookie) {
    return This->lpVtbl->RemoveStackFrameSniffer(This,dwCookie);
}
static __WIDL_INLINE HRESULT IDebugApplication32_QueryCurrentThreadIsDebuggerThread(IDebugApplication32* This) {
    return This->lpVtbl->QueryCurrentThreadIsDebuggerThread(This);
}
static __WIDL_INLINE HRESULT IDebugApplication32_SynchronousCallInDebuggerThread(IDebugApplication32* This,IDebugThreadCall32 *pptc,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
    return This->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
static __WIDL_INLINE HRESULT IDebugApplication32_CreateApplicationNode(IDebugApplication32* This,IDebugApplicationNode **ppdanNew) {
    return This->lpVtbl->CreateApplicationNode(This,ppdanNew);
}
static __WIDL_INLINE HRESULT IDebugApplication32_FireDebuggerEvent(IDebugApplication32* This,REFGUID riid,IUnknown *punk) {
    return This->lpVtbl->FireDebuggerEvent(This,riid,punk);
}
static __WIDL_INLINE 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 __WIDL_INLINE WINBOOL IDebugApplication32_FCanJitDebug(IDebugApplication32* This) {
    return This->lpVtbl->FCanJitDebug(This);
}
static __WIDL_INLINE WINBOOL IDebugApplication32_FIsAutoJitDebugEnabled(IDebugApplication32* This) {
    return This->lpVtbl->FIsAutoJitDebugEnabled(This);
}
static __WIDL_INLINE HRESULT IDebugApplication32_AddGlobalExpressionContextProvider(IDebugApplication32* This,IProvideExpressionContexts *pdsfs,DWORD *pdwCookie) {
    return This->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugApplication64_QueryInterface(IDebugApplication64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugApplication64_AddRef(IDebugApplication64* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugApplication64_Release(IDebugApplication64* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplication methods ***/
static __WIDL_INLINE HRESULT IDebugApplication64_ResumeFromBreakPoint(IDebugApplication64* This,IRemoteDebugApplicationThread *prptFocus,BREAKRESUMEACTION bra,ERRORRESUMEACTION era) {
    return This->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era);
}
static __WIDL_INLINE HRESULT IDebugApplication64_CauseBreak(IDebugApplication64* This) {
    return This->lpVtbl->CauseBreak(This);
}
static __WIDL_INLINE HRESULT IDebugApplication64_ConnectDebugger(IDebugApplication64* This,IApplicationDebugger *pad) {
    return This->lpVtbl->ConnectDebugger(This,pad);
}
static __WIDL_INLINE HRESULT IDebugApplication64_DisconnectDebugger(IDebugApplication64* This) {
    return This->lpVtbl->DisconnectDebugger(This);
}
static __WIDL_INLINE HRESULT IDebugApplication64_GetDebugger(IDebugApplication64* This,IApplicationDebugger **pad) {
    return This->lpVtbl->GetDebugger(This,pad);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugApplication64_QueryAlive(IDebugApplication64* This) {
    return This->lpVtbl->QueryAlive(This);
}
static __WIDL_INLINE HRESULT IDebugApplication64_EnumThreads(IDebugApplication64* This,IEnumRemoteDebugApplicationThreads **pperdat) {
    return This->lpVtbl->EnumThreads(This,pperdat);
}
static __WIDL_INLINE HRESULT IDebugApplication64_GetName(IDebugApplication64* This,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,pbstrName);
}
static __WIDL_INLINE HRESULT IDebugApplication64_GetRootNode(IDebugApplication64* This,IDebugApplicationNode **ppdanRoot) {
    return This->lpVtbl->GetRootNode(This,ppdanRoot);
}
static __WIDL_INLINE HRESULT IDebugApplication64_EnumGlobalExpressionContexts(IDebugApplication64* This,IEnumDebugExpressionContexts **ppedec) {
    return This->lpVtbl->EnumGlobalExpressionContexts(This,ppedec);
}
/*** IDebugApplication64 methods ***/
static __WIDL_INLINE HRESULT IDebugApplication64_SetName(IDebugApplication64* This,LPCOLESTR pstrName) {
    return This->lpVtbl->SetName(This,pstrName);
}
static __WIDL_INLINE HRESULT IDebugApplication64_StepOutComplete(IDebugApplication64* This) {
    return This->lpVtbl->StepOutComplete(This);
}
static __WIDL_INLINE HRESULT IDebugApplication64_DebugOutput(IDebugApplication64* This,LPCOLESTR pstr) {
    return This->lpVtbl->DebugOutput(This,pstr);
}
static __WIDL_INLINE HRESULT IDebugApplication64_StartDebugSession(IDebugApplication64* This) {
    return This->lpVtbl->StartDebugSession(This);
}
static __WIDL_INLINE HRESULT IDebugApplication64_HandleBreakPoint(IDebugApplication64* This,BREAKREASON br,BREAKRESUMEACTION *pbra) {
    return This->lpVtbl->HandleBreakPoint(This,br,pbra);
}
static __WIDL_INLINE HRESULT IDebugApplication64_Close(IDebugApplication64* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT IDebugApplication64_GetBreakFlags(IDebugApplication64* This,APPBREAKFLAGS *pabf,IRemoteDebugApplicationThread **pprdatSteppingThread) {
    return This->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread);
}
static __WIDL_INLINE HRESULT IDebugApplication64_GetCurrentThread(IDebugApplication64* This,IDebugApplicationThread **pat) {
    return This->lpVtbl->GetCurrentThread(This,pat);
}
static __WIDL_INLINE HRESULT IDebugApplication64_CreateAsyncDebugOperation(IDebugApplication64* This,IDebugSyncOperation *psdo,IDebugAsyncOperation **ppado) {
    return This->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado);
}
static __WIDL_INLINE HRESULT IDebugApplication64_AddStackFrameSniffer(IDebugApplication64* This,IDebugStackFrameSniffer *pdsfs,DWORD *pdwCookie) {
    return This->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie);
}
static __WIDL_INLINE HRESULT IDebugApplication64_RemoveStackFrameSniffer(IDebugApplication64* This,DWORD dwCookie) {
    return This->lpVtbl->RemoveStackFrameSniffer(This,dwCookie);
}
static __WIDL_INLINE HRESULT IDebugApplication64_QueryCurrentThreadIsDebuggerThread(IDebugApplication64* This) {
    return This->lpVtbl->QueryCurrentThreadIsDebuggerThread(This);
}
static __WIDL_INLINE HRESULT IDebugApplication64_SynchronousCallInDebuggerThread(IDebugApplication64* This,IDebugThreadCall64 *pptc,DWORDLONG dwParam1,DWORDLONG dwParam2,DWORDLONG dwParam3) {
    return This->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3);
}
static __WIDL_INLINE HRESULT IDebugApplication64_CreateApplicationNode(IDebugApplication64* This,IDebugApplicationNode **ppdanNew) {
    return This->lpVtbl->CreateApplicationNode(This,ppdanNew);
}
static __WIDL_INLINE HRESULT IDebugApplication64_FireDebuggerEvent(IDebugApplication64* This,REFGUID riid,IUnknown *punk) {
    return This->lpVtbl->FireDebuggerEvent(This,riid,punk);
}
static __WIDL_INLINE 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 __WIDL_INLINE WINBOOL IDebugApplication64_FCanJitDebug(IDebugApplication64* This) {
    return This->lpVtbl->FCanJitDebug(This);
}
static __WIDL_INLINE WINBOOL IDebugApplication64_FIsAutoJitDebugEnabled(IDebugApplication64* This) {
    return This->lpVtbl->FIsAutoJitDebugEnabled(This);
}
static __WIDL_INLINE HRESULT IDebugApplication64_AddGlobalExpressionContextProvider(IDebugApplication64* This,IProvideExpressionContexts *pdsfs,DWORDLONG *pdwCookie) {
    return This->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_QueryInterface(IRemoteDebugApplicationEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRemoteDebugApplicationEvents_AddRef(IRemoteDebugApplicationEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRemoteDebugApplicationEvents_Release(IRemoteDebugApplicationEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplicationEvents methods ***/
static __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_OnConnectDebugger(IRemoteDebugApplicationEvents* This,IApplicationDebugger *pad) {
    return This->lpVtbl->OnConnectDebugger(This,pad);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_OnDisconnectDebugger(IRemoteDebugApplicationEvents* This) {
    return This->lpVtbl->OnDisconnectDebugger(This);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_OnSetName(IRemoteDebugApplicationEvents* This,LPCOLESTR pstrName) {
    return This->lpVtbl->OnSetName(This,pstrName);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_OnDebugOutput(IRemoteDebugApplicationEvents* This,LPCOLESTR pstr) {
    return This->lpVtbl->OnDebugOutput(This,pstr);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_OnClose(IRemoteDebugApplicationEvents* This) {
    return This->lpVtbl->OnClose(This);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_OnEnterBreakPoint(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
    return This->lpVtbl->OnEnterBreakPoint(This,prdat);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_OnLeaveBreakPoint(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
    return This->lpVtbl->OnLeaveBreakPoint(This,prdat);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_OnCreateThread(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
    return This->lpVtbl->OnCreateThread(This,prdat);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationEvents_OnDestroyThread(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
    return This->lpVtbl->OnDestroyThread(This,prdat);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugApplicationNode_QueryInterface(IDebugApplicationNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugApplicationNode_AddRef(IDebugApplicationNode* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugApplicationNode_Release(IDebugApplicationNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugDocumentInfo methods ***/
static __WIDL_INLINE HRESULT IDebugApplicationNode_GetName(IDebugApplicationNode* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,dnt,pbstrName);
}
static __WIDL_INLINE HRESULT IDebugApplicationNode_GetDocumentClassId(IDebugApplicationNode* This,CLSID *pclsidDocument) {
    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
}
/*** IDebugDocumentProvider methods ***/
static __WIDL_INLINE HRESULT IDebugApplicationNode_GetDocument(IDebugApplicationNode* This,IDebugDocument **ppssd) {
    return This->lpVtbl->GetDocument(This,ppssd);
}
/*** IDebugApplicationNode methods ***/
static __WIDL_INLINE HRESULT IDebugApplicationNode_EnumChildren(IDebugApplicationNode* This,IEnumDebugApplicationNodes **pperddp) {
    return This->lpVtbl->EnumChildren(This,pperddp);
}
static __WIDL_INLINE HRESULT IDebugApplicationNode_GetParent(IDebugApplicationNode* This,IDebugApplicationNode **pprddp) {
    return This->lpVtbl->GetParent(This,pprddp);
}
static __WIDL_INLINE HRESULT IDebugApplicationNode_SetDocumentProvider(IDebugApplicationNode* This,IDebugDocumentProvider *pddp) {
    return This->lpVtbl->SetDocumentProvider(This,pddp);
}
static __WIDL_INLINE HRESULT IDebugApplicationNode_Close(IDebugApplicationNode* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT IDebugApplicationNode_Attach(IDebugApplicationNode* This,IDebugApplicationNode *pdanParent) {
    return This->lpVtbl->Attach(This,pdanParent);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugApplicationNodeEvents_QueryInterface(IDebugApplicationNodeEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugApplicationNodeEvents_AddRef(IDebugApplicationNodeEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugApplicationNodeEvents_Release(IDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugApplicationNodeEvents methods ***/
static __WIDL_INLINE HRESULT IDebugApplicationNodeEvents_onAddChild(IDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
    return This->lpVtbl->onAddChild(This,prddpChild);
}
static __WIDL_INLINE HRESULT IDebugApplicationNodeEvents_onRemoveChild(IDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
    return This->lpVtbl->onRemoveChild(This,prddpChild);
}
static __WIDL_INLINE HRESULT IDebugApplicationNodeEvents_onDetach(IDebugApplicationNodeEvents* This) {
    return This->lpVtbl->onDetach(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT AsyncIDebugApplicationNodeEvents_QueryInterface(AsyncIDebugApplicationNodeEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG AsyncIDebugApplicationNodeEvents_AddRef(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG AsyncIDebugApplicationNodeEvents_Release(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** AsyncIDebugApplicationNodeEvents methods ***/
static __WIDL_INLINE HRESULT AsyncIDebugApplicationNodeEvents_Begin_onAddChild(AsyncIDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
    return This->lpVtbl->Begin_onAddChild(This,prddpChild);
}
static __WIDL_INLINE HRESULT AsyncIDebugApplicationNodeEvents_Finish_onAddChild(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Finish_onAddChild(This);
}
static __WIDL_INLINE HRESULT AsyncIDebugApplicationNodeEvents_Begin_onRemoveChild(AsyncIDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
    return This->lpVtbl->Begin_onRemoveChild(This,prddpChild);
}
static __WIDL_INLINE HRESULT AsyncIDebugApplicationNodeEvents_Finish_onRemoveChild(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Finish_onRemoveChild(This);
}
static __WIDL_INLINE HRESULT AsyncIDebugApplicationNodeEvents_Begin_onDetach(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Begin_onDetach(This);
}
static __WIDL_INLINE HRESULT AsyncIDebugApplicationNodeEvents_Finish_onDetach(AsyncIDebugApplicationNodeEvents* This) {
    return This->lpVtbl->Finish_onDetach(This);
}
static __WIDL_INLINE HRESULT AsyncIDebugApplicationNodeEvents_Begin_onAttach(AsyncIDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpParent) {
    return This->lpVtbl->Begin_onAttach(This,prddpParent);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugThreadCall32_QueryInterface(IDebugThreadCall32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugThreadCall32_AddRef(IDebugThreadCall32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugThreadCall32_Release(IDebugThreadCall32* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugThreadCall32 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugThreadCall64_QueryInterface(IDebugThreadCall64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugThreadCall64_AddRef(IDebugThreadCall64* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugThreadCall64_Release(IDebugThreadCall64* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugThreadCall64 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRemoteDebugApplicationThread_QueryInterface(IRemoteDebugApplicationThread* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRemoteDebugApplicationThread_AddRef(IRemoteDebugApplicationThread* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRemoteDebugApplicationThread_Release(IRemoteDebugApplicationThread* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplicationThread methods ***/
static __WIDL_INLINE HRESULT IRemoteDebugApplicationThread_GetSystemThreadId(IRemoteDebugApplicationThread* This,DWORD *dwThreadId) {
    return This->lpVtbl->GetSystemThreadId(This,dwThreadId);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationThread_GetApplication(IRemoteDebugApplicationThread* This,IRemoteDebugApplication **pprda) {
    return This->lpVtbl->GetApplication(This,pprda);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationThread_EnumStackFrames(IRemoteDebugApplicationThread* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationThread_GetDescription(IRemoteDebugApplicationThread* This,BSTR *pbstrDescription,BSTR *pbstrState) {
    return This->lpVtbl->GetDescription(This,pbstrDescription,pbstrState);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationThread_SetNextStatement(IRemoteDebugApplicationThread* This,IDebugStackFrame *pStackFrame,IDebugCodeContext *pCodeContext) {
    return This->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationThread_GetState(IRemoteDebugApplicationThread* This,DWORD *pState) {
    return This->lpVtbl->GetState(This,pState);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationThread_Suspend(IRemoteDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->Suspend(This,pdwCount);
}
static __WIDL_INLINE HRESULT IRemoteDebugApplicationThread_Resume(IRemoteDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->Resume(This,pdwCount);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugApplicationThread_QueryInterface(IDebugApplicationThread* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugApplicationThread_AddRef(IDebugApplicationThread* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugApplicationThread_Release(IDebugApplicationThread* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplicationThread methods ***/
static __WIDL_INLINE HRESULT IDebugApplicationThread_GetSystemThreadId(IDebugApplicationThread* This,DWORD *dwThreadId) {
    return This->lpVtbl->GetSystemThreadId(This,dwThreadId);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_GetApplication(IDebugApplicationThread* This,IRemoteDebugApplication **pprda) {
    return This->lpVtbl->GetApplication(This,pprda);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_EnumStackFrames(IDebugApplicationThread* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_GetDescription(IDebugApplicationThread* This,BSTR *pbstrDescription,BSTR *pbstrState) {
    return This->lpVtbl->GetDescription(This,pbstrDescription,pbstrState);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_SetNextStatement(IDebugApplicationThread* This,IDebugStackFrame *pStackFrame,IDebugCodeContext *pCodeContext) {
    return This->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_GetState(IDebugApplicationThread* This,DWORD *pState) {
    return This->lpVtbl->GetState(This,pState);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_Suspend(IDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->Suspend(This,pdwCount);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_Resume(IDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->Resume(This,pdwCount);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_GetSuspendCount(IDebugApplicationThread* This,DWORD *pdwCount) {
    return This->lpVtbl->GetSuspendCount(This,pdwCount);
}
/*** IDebugApplicationThread methods ***/
static __WIDL_INLINE HRESULT IDebugApplicationThread_SynchronousCallIntoThread32(IDebugApplicationThread* This,IDebugThreadCall32 *pstcb,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
    return This->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_QueryIsCurrentThread(IDebugApplicationThread* This) {
    return This->lpVtbl->QueryIsCurrentThread(This);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_QueryIsDebuggerThread(IDebugApplicationThread* This) {
    return This->lpVtbl->QueryIsDebuggerThread(This);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread_SetDescription(IDebugApplicationThread* This,LPCOLESTR pstrDescription) {
    return This->lpVtbl->SetDescription(This,pstrDescription);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugApplicationThread64_QueryInterface(IDebugApplicationThread64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugApplicationThread64_AddRef(IDebugApplicationThread64* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugApplicationThread64_Release(IDebugApplicationThread64* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteDebugApplicationThread methods ***/
static __WIDL_INLINE HRESULT IDebugApplicationThread64_GetSystemThreadId(IDebugApplicationThread64* This,DWORD *dwThreadId) {
    return This->lpVtbl->GetSystemThreadId(This,dwThreadId);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_GetApplication(IDebugApplicationThread64* This,IRemoteDebugApplication **pprda) {
    return This->lpVtbl->GetApplication(This,pprda);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_EnumStackFrames(IDebugApplicationThread64* This,IEnumDebugStackFrames **ppedsf) {
    return This->lpVtbl->EnumStackFrames(This,ppedsf);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_GetDescription(IDebugApplicationThread64* This,BSTR *pbstrDescription,BSTR *pbstrState) {
    return This->lpVtbl->GetDescription(This,pbstrDescription,pbstrState);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_SetNextStatement(IDebugApplicationThread64* This,IDebugStackFrame *pStackFrame,IDebugCodeContext *pCodeContext) {
    return This->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_GetState(IDebugApplicationThread64* This,DWORD *pState) {
    return This->lpVtbl->GetState(This,pState);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_Suspend(IDebugApplicationThread64* This,DWORD *pdwCount) {
    return This->lpVtbl->Suspend(This,pdwCount);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_Resume(IDebugApplicationThread64* This,DWORD *pdwCount) {
    return This->lpVtbl->Resume(This,pdwCount);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_GetSuspendCount(IDebugApplicationThread64* This,DWORD *pdwCount) {
    return This->lpVtbl->GetSuspendCount(This,pdwCount);
}
/*** IDebugApplicationThread methods ***/
static __WIDL_INLINE HRESULT IDebugApplicationThread64_SynchronousCallIntoThread32(IDebugApplicationThread64* This,IDebugThreadCall32 *pstcb,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
    return This->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_QueryIsCurrentThread(IDebugApplicationThread64* This) {
    return This->lpVtbl->QueryIsCurrentThread(This);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_QueryIsDebuggerThread(IDebugApplicationThread64* This) {
    return This->lpVtbl->QueryIsDebuggerThread(This);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_SetDescription(IDebugApplicationThread64* This,LPCOLESTR pstrDescription) {
    return This->lpVtbl->SetDescription(This,pstrDescription);
}
static __WIDL_INLINE HRESULT IDebugApplicationThread64_SetStateString(IDebugApplicationThread64* This,LPCOLESTR pstrState) {
    return This->lpVtbl->SetStateString(This,pstrState);
}
/*** IDebugApplicationThread64 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugCookie_QueryInterface(IDebugCookie* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugCookie_AddRef(IDebugCookie* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugCookie_Release(IDebugCookie* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugCookie methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEnumDebugApplicationNodes_QueryInterface(IEnumDebugApplicationNodes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumDebugApplicationNodes_AddRef(IEnumDebugApplicationNodes* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumDebugApplicationNodes_Release(IEnumDebugApplicationNodes* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugApplicationNodes methods ***/
static __WIDL_INLINE HRESULT IEnumDebugApplicationNodes_Next(IEnumDebugApplicationNodes* This,ULONG celt,IDebugApplicationNode **pprddp,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,pprddp,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumDebugApplicationNodes_Skip(IEnumDebugApplicationNodes* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumDebugApplicationNodes_Reset(IEnumDebugApplicationNodes* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEnumRemoteDebugApplications_QueryInterface(IEnumRemoteDebugApplications* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumRemoteDebugApplications_AddRef(IEnumRemoteDebugApplications* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumRemoteDebugApplications_Release(IEnumRemoteDebugApplications* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumRemoteDebugApplications methods ***/
static __WIDL_INLINE HRESULT IEnumRemoteDebugApplications_Next(IEnumRemoteDebugApplications* This,ULONG celt,IRemoteDebugApplication **ppda,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,ppda,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumRemoteDebugApplications_Skip(IEnumRemoteDebugApplications* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumRemoteDebugApplications_Reset(IEnumRemoteDebugApplications* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEnumRemoteDebugApplicationThreads_QueryInterface(IEnumRemoteDebugApplicationThreads* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumRemoteDebugApplicationThreads_AddRef(IEnumRemoteDebugApplicationThreads* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumRemoteDebugApplicationThreads_Release(IEnumRemoteDebugApplicationThreads* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumRemoteDebugApplicationThreads methods ***/
static __WIDL_INLINE HRESULT IEnumRemoteDebugApplicationThreads_Next(IEnumRemoteDebugApplicationThreads* This,ULONG celt,IRemoteDebugApplicationThread **pprdat,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,pprdat,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumRemoteDebugApplicationThreads_Skip(IEnumRemoteDebugApplicationThreads* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumRemoteDebugApplicationThreads_Reset(IEnumRemoteDebugApplicationThreads* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugFormatter_QueryInterface(IDebugFormatter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugFormatter_AddRef(IDebugFormatter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugFormatter_Release(IDebugFormatter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugFormatter methods ***/
static __WIDL_INLINE HRESULT IDebugFormatter_GetStringForVariant(IDebugFormatter* This,VARIANT *pvar,ULONG nRadix,BSTR *pbstrValue) {
    return This->lpVtbl->GetStringForVariant(This,pvar,nRadix,pbstrValue);
}
static __WIDL_INLINE HRESULT IDebugFormatter_GetVariantForString(IDebugFormatter* This,LPCOLESTR pwstrValue,VARIANT *pvar) {
    return This->lpVtbl->GetVariantForString(This,pwstrValue,pvar);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISimpleConnectionPoint_QueryInterface(ISimpleConnectionPoint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISimpleConnectionPoint_AddRef(ISimpleConnectionPoint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISimpleConnectionPoint_Release(ISimpleConnectionPoint* This) {
    return This->lpVtbl->Release(This);
}
/*** ISimpleConnectionPoint methods ***/
static __WIDL_INLINE HRESULT ISimpleConnectionPoint_GetEventCount(ISimpleConnectionPoint* This,ULONG *pulCount) {
    return This->lpVtbl->GetEventCount(This,pulCount);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISimpleConnectionPoint_Advise(ISimpleConnectionPoint* This,IDispatch *pdisp,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pdisp,pdwCookie);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugHelper_QueryInterface(IDebugHelper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugHelper_AddRef(IDebugHelper* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugHelper_Release(IDebugHelper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugHelper methods ***/
static __WIDL_INLINE HRESULT IDebugHelper_CreatePropertyBrowser(IDebugHelper* This,VARIANT *pvar,LPCOLESTR bstrName,IDebugApplicationThread *pdat,IDebugProperty **ppdob) {
    return This->lpVtbl->CreatePropertyBrowser(This,pvar,bstrName,pdat,ppdob);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEnumDebugExpressionContexts_QueryInterface(IEnumDebugExpressionContexts* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumDebugExpressionContexts_AddRef(IEnumDebugExpressionContexts* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumDebugExpressionContexts_Release(IEnumDebugExpressionContexts* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugExpressionContexts methods ***/
static __WIDL_INLINE HRESULT IEnumDebugExpressionContexts_Next(IEnumDebugExpressionContexts* This,ULONG celt,IDebugExpressionContext **ppdec,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,ppdec,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumDebugExpressionContexts_Skip(IEnumDebugExpressionContexts* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumDebugExpressionContexts_Reset(IEnumDebugExpressionContexts* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IProvideExpressionContexts_QueryInterface(IProvideExpressionContexts* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IProvideExpressionContexts_AddRef(IProvideExpressionContexts* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IProvideExpressionContexts_Release(IProvideExpressionContexts* This) {
    return This->lpVtbl->Release(This);
}
/*** IProvideExpressionContexts methods ***/
static __WIDL_INLINE 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__ */
