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

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

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

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

#ifndef __activprof_h__
#define __activprof_h__

/* Forward declarations */

#ifndef __IActiveScriptProfilerControl_FWD_DEFINED__
#define __IActiveScriptProfilerControl_FWD_DEFINED__
typedef interface IActiveScriptProfilerControl IActiveScriptProfilerControl;
#ifdef __cplusplus
interface IActiveScriptProfilerControl;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptProfilerControl2_FWD_DEFINED__
#define __IActiveScriptProfilerControl2_FWD_DEFINED__
typedef interface IActiveScriptProfilerControl2 IActiveScriptProfilerControl2;
#ifdef __cplusplus
interface IActiveScriptProfilerControl2;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptProfilerHeapEnum_FWD_DEFINED__
#define __IActiveScriptProfilerHeapEnum_FWD_DEFINED__
typedef interface IActiveScriptProfilerHeapEnum IActiveScriptProfilerHeapEnum;
#ifdef __cplusplus
interface IActiveScriptProfilerHeapEnum;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptProfilerControl3_FWD_DEFINED__
#define __IActiveScriptProfilerControl3_FWD_DEFINED__
typedef interface IActiveScriptProfilerControl3 IActiveScriptProfilerControl3;
#ifdef __cplusplus
interface IActiveScriptProfilerControl3;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptProfilerCallback_FWD_DEFINED__
#define __IActiveScriptProfilerCallback_FWD_DEFINED__
typedef interface IActiveScriptProfilerCallback IActiveScriptProfilerCallback;
#ifdef __cplusplus
interface IActiveScriptProfilerCallback;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptProfilerCallback2_FWD_DEFINED__
#define __IActiveScriptProfilerCallback2_FWD_DEFINED__
typedef interface IActiveScriptProfilerCallback2 IActiveScriptProfilerCallback2;
#ifdef __cplusplus
interface IActiveScriptProfilerCallback2;
#endif /* __cplusplus */
#endif

#ifndef __IActiveScriptProfilerCallback3_FWD_DEFINED__
#define __IActiveScriptProfilerCallback3_FWD_DEFINED__
typedef interface IActiveScriptProfilerCallback3 IActiveScriptProfilerCallback3;
#ifdef __cplusplus
interface IActiveScriptProfilerCallback3;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

const HRESULT ACTIVPROF_E_PROFILER_PRESENT = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0200);
const HRESULT ACTIVPROF_E_PROFILER_ABSENT = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0201);
const HRESULT ACTIVPROF_E_UNABLE_TO_APPLY_ACTION = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0202);
const ULONG PROFILER_HEAP_OBJECT_NAME_ID_UNAVAILABLE=(ULONG)-1;

#ifndef __ActivProf_h
#define __ActivProf_h


#ifndef _NO_SCRIPT_GUIDS
DEFINE_GUID(IID_IActiveScriptProfilerHeapEnum, 0x32e4694e, 0xd37, 0x419b, 0xb9, 0x3d, 0xfa, 0x20, 0xde, 0xd6, 0xe8, 0xea);
DEFINE_GUID(IID_IActiveScriptProfilerControl3, 0xb403015, 0xf381, 0x4023, 0xa5, 0xd0, 0x6f, 0xed, 0x7, 0x6d, 0xe7, 0x16);
#endif

typedef enum __WIDL_activprof_generated_name_00000002 {
    PROFILER_SCRIPT_TYPE_USER = 0,
    PROFILER_SCRIPT_TYPE_DYNAMIC = 1,
    PROFILER_SCRIPT_TYPE_NATIVE = 2,
    PROFILER_SCRIPT_TYPE_DOM = 3
} PROFILER_SCRIPT_TYPE;

typedef enum __WIDL_activprof_generated_name_00000003 {
    PROFILER_EVENT_MASK_TRACE_SCRIPT_FUNCTION_CALL = 0x1,
    PROFILER_EVENT_MASK_TRACE_NATIVE_FUNCTION_CALL = 0x2,
    PROFILER_EVENT_MASK_TRACE_DOM_FUNCTION_CALL = 0x4,
    PROFILER_EVENT_MASK_TRACE_ALL = PROFILER_EVENT_MASK_TRACE_SCRIPT_FUNCTION_CALL | PROFILER_EVENT_MASK_TRACE_NATIVE_FUNCTION_CALL,
    PROFILER_EVENT_MASK_TRACE_ALL_WITH_DOM = PROFILER_EVENT_MASK_TRACE_ALL | PROFILER_EVENT_MASK_TRACE_DOM_FUNCTION_CALL
} PROFILER_EVENT_MASK;

typedef LONG PROFILER_TOKEN;

/*****************************************************************************
 * IActiveScriptProfilerControl interface
 */
#ifndef __IActiveScriptProfilerControl_INTERFACE_DEFINED__
#define __IActiveScriptProfilerControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptProfilerControl, 0x784b5ff0, 0x69b0, 0x47d1, 0xa7,0xdc, 0x25,0x18,0xf4,0x23,0x0e,0x90);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("784b5ff0-69b0-47d1-a7dc-2518f4230e90")
IActiveScriptProfilerControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartProfiling(
        REFCLSID clsidProfilerObject,
        DWORD dwEventMask,
        DWORD dwContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProfilerEventMask(
        DWORD dwEventMask) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopProfiling(
        HRESULT hrShutdownReason) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptProfilerControl, 0x784b5ff0, 0x69b0, 0x47d1, 0xa7,0xdc, 0x25,0x18,0xf4,0x23,0x0e,0x90)
#endif
#else
typedef struct IActiveScriptProfilerControlVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptProfilerControl methods ***/
    HRESULT (STDMETHODCALLTYPE *StartProfiling)(
        IActiveScriptProfilerControl *This,
        REFCLSID clsidProfilerObject,
        DWORD dwEventMask,
        DWORD dwContext);

    HRESULT (STDMETHODCALLTYPE *SetProfilerEventMask)(
        IActiveScriptProfilerControl *This,
        DWORD dwEventMask);

    HRESULT (STDMETHODCALLTYPE *StopProfiling)(
        IActiveScriptProfilerControl *This,
        HRESULT hrShutdownReason);

    END_INTERFACE
} IActiveScriptProfilerControlVtbl;

interface IActiveScriptProfilerControl {
    CONST_VTBL IActiveScriptProfilerControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptProfilerControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptProfilerControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptProfilerControl_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptProfilerControl methods ***/
#define IActiveScriptProfilerControl_StartProfiling(This,clsidProfilerObject,dwEventMask,dwContext) (This)->lpVtbl->StartProfiling(This,clsidProfilerObject,dwEventMask,dwContext)
#define IActiveScriptProfilerControl_SetProfilerEventMask(This,dwEventMask) (This)->lpVtbl->SetProfilerEventMask(This,dwEventMask)
#define IActiveScriptProfilerControl_StopProfiling(This,hrShutdownReason) (This)->lpVtbl->StopProfiling(This,hrShutdownReason)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerControl_QueryInterface(IActiveScriptProfilerControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptProfilerControl_AddRef(IActiveScriptProfilerControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptProfilerControl_Release(IActiveScriptProfilerControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptProfilerControl methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerControl_StartProfiling(IActiveScriptProfilerControl* This,REFCLSID clsidProfilerObject,DWORD dwEventMask,DWORD dwContext) {
    return This->lpVtbl->StartProfiling(This,clsidProfilerObject,dwEventMask,dwContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerControl_SetProfilerEventMask(IActiveScriptProfilerControl* This,DWORD dwEventMask) {
    return This->lpVtbl->SetProfilerEventMask(This,dwEventMask);
}
static FORCEINLINE HRESULT IActiveScriptProfilerControl_StopProfiling(IActiveScriptProfilerControl* This,HRESULT hrShutdownReason) {
    return This->lpVtbl->StopProfiling(This,hrShutdownReason);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptProfilerControl_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptProfilerControl2 interface
 */
#ifndef __IActiveScriptProfilerControl2_INTERFACE_DEFINED__
#define __IActiveScriptProfilerControl2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptProfilerControl2, 0x47810165, 0x498f, 0x40be, 0x94,0xf1, 0x65,0x35,0x57,0xe9,0xe7,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("47810165-498f-40be-94f1-653557e9e7da")
IActiveScriptProfilerControl2 : public IActiveScriptProfilerControl
{
    virtual HRESULT STDMETHODCALLTYPE CompleteProfilerStart(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE PrepareProfilerStop(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptProfilerControl2, 0x47810165, 0x498f, 0x40be, 0x94,0xf1, 0x65,0x35,0x57,0xe9,0xe7,0xda)
#endif
#else
typedef struct IActiveScriptProfilerControl2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptProfilerControl methods ***/
    HRESULT (STDMETHODCALLTYPE *StartProfiling)(
        IActiveScriptProfilerControl2 *This,
        REFCLSID clsidProfilerObject,
        DWORD dwEventMask,
        DWORD dwContext);

    HRESULT (STDMETHODCALLTYPE *SetProfilerEventMask)(
        IActiveScriptProfilerControl2 *This,
        DWORD dwEventMask);

    HRESULT (STDMETHODCALLTYPE *StopProfiling)(
        IActiveScriptProfilerControl2 *This,
        HRESULT hrShutdownReason);

    /*** IActiveScriptProfilerControl2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CompleteProfilerStart)(
        IActiveScriptProfilerControl2 *This);

    HRESULT (STDMETHODCALLTYPE *PrepareProfilerStop)(
        IActiveScriptProfilerControl2 *This);

    END_INTERFACE
} IActiveScriptProfilerControl2Vtbl;

interface IActiveScriptProfilerControl2 {
    CONST_VTBL IActiveScriptProfilerControl2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptProfilerControl2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptProfilerControl2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptProfilerControl2_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptProfilerControl methods ***/
#define IActiveScriptProfilerControl2_StartProfiling(This,clsidProfilerObject,dwEventMask,dwContext) (This)->lpVtbl->StartProfiling(This,clsidProfilerObject,dwEventMask,dwContext)
#define IActiveScriptProfilerControl2_SetProfilerEventMask(This,dwEventMask) (This)->lpVtbl->SetProfilerEventMask(This,dwEventMask)
#define IActiveScriptProfilerControl2_StopProfiling(This,hrShutdownReason) (This)->lpVtbl->StopProfiling(This,hrShutdownReason)
/*** IActiveScriptProfilerControl2 methods ***/
#define IActiveScriptProfilerControl2_CompleteProfilerStart(This) (This)->lpVtbl->CompleteProfilerStart(This)
#define IActiveScriptProfilerControl2_PrepareProfilerStop(This) (This)->lpVtbl->PrepareProfilerStop(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerControl2_QueryInterface(IActiveScriptProfilerControl2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptProfilerControl2_AddRef(IActiveScriptProfilerControl2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptProfilerControl2_Release(IActiveScriptProfilerControl2* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptProfilerControl methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerControl2_StartProfiling(IActiveScriptProfilerControl2* This,REFCLSID clsidProfilerObject,DWORD dwEventMask,DWORD dwContext) {
    return This->lpVtbl->StartProfiling(This,clsidProfilerObject,dwEventMask,dwContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerControl2_SetProfilerEventMask(IActiveScriptProfilerControl2* This,DWORD dwEventMask) {
    return This->lpVtbl->SetProfilerEventMask(This,dwEventMask);
}
static FORCEINLINE HRESULT IActiveScriptProfilerControl2_StopProfiling(IActiveScriptProfilerControl2* This,HRESULT hrShutdownReason) {
    return This->lpVtbl->StopProfiling(This,hrShutdownReason);
}
/*** IActiveScriptProfilerControl2 methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerControl2_CompleteProfilerStart(IActiveScriptProfilerControl2* This) {
    return This->lpVtbl->CompleteProfilerStart(This);
}
static FORCEINLINE HRESULT IActiveScriptProfilerControl2_PrepareProfilerStop(IActiveScriptProfilerControl2* This) {
    return This->lpVtbl->PrepareProfilerStop(This);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptProfilerControl2_INTERFACE_DEFINED__ */


typedef DWORD_PTR PROFILER_HEAP_OBJECT_ID;
typedef UINT PROFILER_HEAP_OBJECT_NAME_ID;
typedef void *PROFILER_EXTERNAL_OBJECT_ADDRESS;

typedef enum __WIDL_activprof_generated_name_00000004 {
    PROFILER_HEAP_OBJECT_FLAGS_NEW_OBJECT = 0x1,
    PROFILER_HEAP_OBJECT_FLAGS_IS_ROOT = 0x2,
    PROFILER_HEAP_OBJECT_FLAGS_SITE_CLOSED = 0x4,
    PROFILER_HEAP_OBJECT_FLAGS_EXTERNAL = 0x8,
    PROFILER_HEAP_OBJECT_FLAGS_EXTERNAL_UNKNOWN = 0x10,
    PROFILER_HEAP_OBJECT_FLAGS_EXTERNAL_DISPATCH = 0x20,
    PROFILER_HEAP_OBJECT_FLAGS_SIZE_APPROXIMATE = 0x40,
    PROFILER_HEAP_OBJECT_FLAGS_SIZE_UNAVAILABLE = 0x80,
    PROFILER_HEAP_OBJECT_FLAGS_NEW_STATE_UNAVAILABLE = 0x100,
    PROFILER_HEAP_OBJECT_FLAGS_WINRT_INSTANCE = 0x200,
    PROFILER_HEAP_OBJECT_FLAGS_WINRT_RUNTIMECLASS = 0x400,
    PROFILER_HEAP_OBJECT_FLAGS_WINRT_DELEGATE = 0x800,
    PROFILER_HEAP_OBJECT_FLAGS_WINRT_NAMESPACE = 0x1000
} PROFILER_HEAP_OBJECT_FLAGS;

typedef enum __WIDL_activprof_generated_name_00000005 {
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_PROTOTYPE = 0x1,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_FUNCTION_NAME = 0x2,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_SCOPE_LIST = 0x3,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_INTERNAL_PROPERTY = 0x4,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_NAME_PROPERTIES = 0x5,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_INDEX_PROPERTIES = 0x6,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_ELEMENT_ATTRIBUTES_SIZE = 0x7,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_ELEMENT_TEXT_CHILDREN_SIZE = 0x8,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_RELATIONSHIPS = 0x9,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_WINRTEVENTS = 0xa,
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_MAX_VALUE = PROFILER_HEAP_OBJECT_OPTIONAL_INFO_WINRTEVENTS
} PROFILER_HEAP_OBJECT_OPTIONAL_INFO_TYPE;

typedef struct _PROFILER_HEAP_OBJECT_SCOPE_LIST {
    UINT count;
    PROFILER_HEAP_OBJECT_ID scopes[1];
} PROFILER_HEAP_OBJECT_SCOPE_LIST;

typedef enum __WIDL_activprof_generated_name_00000006 {
    PROFILER_PROPERTY_TYPE_NUMBER = 0x1,
    PROFILER_PROPERTY_TYPE_STRING = 0x2,
    PROFILER_PROPERTY_TYPE_HEAP_OBJECT = 0x3,
    PROFILER_PROPERTY_TYPE_EXTERNAL_OBJECT = 0x4,
    PROFILER_PROPERTY_TYPE_BSTR = 0x5
} PROFILER_RELATIONSHIP_INFO;

typedef struct _PROFILER_HEAP_OBJECT_RELATIONSHIP {
    PROFILER_HEAP_OBJECT_NAME_ID relationshipId;
    PROFILER_RELATIONSHIP_INFO relationshipInfo;
    __C89_NAMELESS union {
        double numberValue;
        LPCWSTR stringValue;
        BSTR bstrValue;
        PROFILER_HEAP_OBJECT_ID objectId;
        PROFILER_EXTERNAL_OBJECT_ADDRESS externalObjectAddress;
    } __C89_NAMELESSUNIONNAME;
} PROFILER_HEAP_OBJECT_RELATIONSHIP;

typedef struct _PROFILER_HEAP_OBJECT_RELATIONSHIP_LIST {
    UINT count;
    PROFILER_HEAP_OBJECT_RELATIONSHIP elements[1];
} PROFILER_HEAP_OBJECT_RELATIONSHIP_LIST;

typedef struct _PROFILER_HEAP_OBJECT_OPTIONAL_INFO {
    PROFILER_HEAP_OBJECT_OPTIONAL_INFO_TYPE infoType;
    __C89_NAMELESS union {
        PROFILER_HEAP_OBJECT_ID prototype;
        LPCWSTR functionName;
        UINT elementAttributesSize;
        UINT elementTextChildrenSize;
        PROFILER_HEAP_OBJECT_SCOPE_LIST *scopeList;
        PROFILER_HEAP_OBJECT_RELATIONSHIP *internalProperty;
        PROFILER_HEAP_OBJECT_RELATIONSHIP_LIST *namePropertyList;
        PROFILER_HEAP_OBJECT_RELATIONSHIP_LIST *indexPropertyList;
        PROFILER_HEAP_OBJECT_RELATIONSHIP_LIST *relationshipList;
        PROFILER_HEAP_OBJECT_RELATIONSHIP_LIST *eventList;
    } __C89_NAMELESSUNIONNAME;
} PROFILER_HEAP_OBJECT_OPTIONAL_INFO;

typedef struct _PROFILER_HEAP_OBJECT {
    UINT size;
    __C89_NAMELESS union {
        PROFILER_HEAP_OBJECT_ID objectId;
        PROFILER_EXTERNAL_OBJECT_ADDRESS externalObjectAddress;
    } __C89_NAMELESSUNIONNAME;
    PROFILER_HEAP_OBJECT_NAME_ID typeNameId;
    ULONG flags;
    USHORT unused;
    USHORT optionalInfoCount;
} PROFILER_HEAP_OBJECT;

/*****************************************************************************
 * IActiveScriptProfilerHeapEnum interface
 */
#ifndef __IActiveScriptProfilerHeapEnum_INTERFACE_DEFINED__
#define __IActiveScriptProfilerHeapEnum_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptProfilerHeapEnum, 0x32e4694e, 0x0d37, 0x419b, 0xb9,0x3d, 0xfa,0x20,0xde,0xd6,0xe8,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("32e4694e-0d37-419b-b93d-fa20ded6e8ea")
IActiveScriptProfilerHeapEnum : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        PROFILER_HEAP_OBJECT **heapObjects,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOptionalInfo(
        PROFILER_HEAP_OBJECT *heapObject,
        ULONG celt,
        PROFILER_HEAP_OBJECT_OPTIONAL_INFO *optionalInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE FreeObjectAndOptionalInfo(
        ULONG celt,
        PROFILER_HEAP_OBJECT **heapObjects) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNameIdMap(
        LPCWSTR * pNameList[],
        UINT *pcelt) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptProfilerHeapEnum, 0x32e4694e, 0x0d37, 0x419b, 0xb9,0x3d, 0xfa,0x20,0xde,0xd6,0xe8,0xea)
#endif
#else
typedef struct IActiveScriptProfilerHeapEnumVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptProfilerHeapEnum methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IActiveScriptProfilerHeapEnum *This,
        ULONG celt,
        PROFILER_HEAP_OBJECT **heapObjects,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *GetOptionalInfo)(
        IActiveScriptProfilerHeapEnum *This,
        PROFILER_HEAP_OBJECT *heapObject,
        ULONG celt,
        PROFILER_HEAP_OBJECT_OPTIONAL_INFO *optionalInfo);

    HRESULT (STDMETHODCALLTYPE *FreeObjectAndOptionalInfo)(
        IActiveScriptProfilerHeapEnum *This,
        ULONG celt,
        PROFILER_HEAP_OBJECT **heapObjects);

    HRESULT (STDMETHODCALLTYPE *GetNameIdMap)(
        IActiveScriptProfilerHeapEnum *This,
        LPCWSTR * pNameList[],
        UINT *pcelt);

    END_INTERFACE
} IActiveScriptProfilerHeapEnumVtbl;

interface IActiveScriptProfilerHeapEnum {
    CONST_VTBL IActiveScriptProfilerHeapEnumVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptProfilerHeapEnum_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptProfilerHeapEnum_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptProfilerHeapEnum_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptProfilerHeapEnum methods ***/
#define IActiveScriptProfilerHeapEnum_Next(This,celt,heapObjects,pceltFetched) (This)->lpVtbl->Next(This,celt,heapObjects,pceltFetched)
#define IActiveScriptProfilerHeapEnum_GetOptionalInfo(This,heapObject,celt,optionalInfo) (This)->lpVtbl->GetOptionalInfo(This,heapObject,celt,optionalInfo)
#define IActiveScriptProfilerHeapEnum_FreeObjectAndOptionalInfo(This,celt,heapObjects) (This)->lpVtbl->FreeObjectAndOptionalInfo(This,celt,heapObjects)
#define IActiveScriptProfilerHeapEnum_GetNameIdMap(This,pNameList,pcelt) (This)->lpVtbl->GetNameIdMap(This,pNameList,pcelt)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerHeapEnum_QueryInterface(IActiveScriptProfilerHeapEnum* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptProfilerHeapEnum_AddRef(IActiveScriptProfilerHeapEnum* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptProfilerHeapEnum_Release(IActiveScriptProfilerHeapEnum* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptProfilerHeapEnum methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerHeapEnum_Next(IActiveScriptProfilerHeapEnum* This,ULONG celt,PROFILER_HEAP_OBJECT **heapObjects,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,heapObjects,pceltFetched);
}
static FORCEINLINE HRESULT IActiveScriptProfilerHeapEnum_GetOptionalInfo(IActiveScriptProfilerHeapEnum* This,PROFILER_HEAP_OBJECT *heapObject,ULONG celt,PROFILER_HEAP_OBJECT_OPTIONAL_INFO *optionalInfo) {
    return This->lpVtbl->GetOptionalInfo(This,heapObject,celt,optionalInfo);
}
static FORCEINLINE HRESULT IActiveScriptProfilerHeapEnum_FreeObjectAndOptionalInfo(IActiveScriptProfilerHeapEnum* This,ULONG celt,PROFILER_HEAP_OBJECT **heapObjects) {
    return This->lpVtbl->FreeObjectAndOptionalInfo(This,celt,heapObjects);
}
static FORCEINLINE HRESULT IActiveScriptProfilerHeapEnum_GetNameIdMap(IActiveScriptProfilerHeapEnum* This,LPCWSTR * pNameList[],UINT *pcelt) {
    return This->lpVtbl->GetNameIdMap(This,pNameList,pcelt);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptProfilerHeapEnum_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptProfilerControl3 interface
 */
#ifndef __IActiveScriptProfilerControl3_INTERFACE_DEFINED__
#define __IActiveScriptProfilerControl3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptProfilerControl3, 0x0b403015, 0xf381, 0x4023, 0xa5,0xd0, 0x6f,0xed,0x07,0x6d,0xe7,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0b403015-f381-4023-a5d0-6fed076de716")
IActiveScriptProfilerControl3 : public IActiveScriptProfilerControl2
{
    virtual HRESULT STDMETHODCALLTYPE EnumHeap(
        IActiveScriptProfilerHeapEnum **ppEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptProfilerControl3, 0x0b403015, 0xf381, 0x4023, 0xa5,0xd0, 0x6f,0xed,0x07,0x6d,0xe7,0x16)
#endif
#else
typedef struct IActiveScriptProfilerControl3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptProfilerControl methods ***/
    HRESULT (STDMETHODCALLTYPE *StartProfiling)(
        IActiveScriptProfilerControl3 *This,
        REFCLSID clsidProfilerObject,
        DWORD dwEventMask,
        DWORD dwContext);

    HRESULT (STDMETHODCALLTYPE *SetProfilerEventMask)(
        IActiveScriptProfilerControl3 *This,
        DWORD dwEventMask);

    HRESULT (STDMETHODCALLTYPE *StopProfiling)(
        IActiveScriptProfilerControl3 *This,
        HRESULT hrShutdownReason);

    /*** IActiveScriptProfilerControl2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CompleteProfilerStart)(
        IActiveScriptProfilerControl3 *This);

    HRESULT (STDMETHODCALLTYPE *PrepareProfilerStop)(
        IActiveScriptProfilerControl3 *This);

    /*** IActiveScriptProfilerControl3 methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumHeap)(
        IActiveScriptProfilerControl3 *This,
        IActiveScriptProfilerHeapEnum **ppEnum);

    END_INTERFACE
} IActiveScriptProfilerControl3Vtbl;

interface IActiveScriptProfilerControl3 {
    CONST_VTBL IActiveScriptProfilerControl3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptProfilerControl3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptProfilerControl3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptProfilerControl3_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptProfilerControl methods ***/
#define IActiveScriptProfilerControl3_StartProfiling(This,clsidProfilerObject,dwEventMask,dwContext) (This)->lpVtbl->StartProfiling(This,clsidProfilerObject,dwEventMask,dwContext)
#define IActiveScriptProfilerControl3_SetProfilerEventMask(This,dwEventMask) (This)->lpVtbl->SetProfilerEventMask(This,dwEventMask)
#define IActiveScriptProfilerControl3_StopProfiling(This,hrShutdownReason) (This)->lpVtbl->StopProfiling(This,hrShutdownReason)
/*** IActiveScriptProfilerControl2 methods ***/
#define IActiveScriptProfilerControl3_CompleteProfilerStart(This) (This)->lpVtbl->CompleteProfilerStart(This)
#define IActiveScriptProfilerControl3_PrepareProfilerStop(This) (This)->lpVtbl->PrepareProfilerStop(This)
/*** IActiveScriptProfilerControl3 methods ***/
#define IActiveScriptProfilerControl3_EnumHeap(This,ppEnum) (This)->lpVtbl->EnumHeap(This,ppEnum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerControl3_QueryInterface(IActiveScriptProfilerControl3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptProfilerControl3_AddRef(IActiveScriptProfilerControl3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptProfilerControl3_Release(IActiveScriptProfilerControl3* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptProfilerControl methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerControl3_StartProfiling(IActiveScriptProfilerControl3* This,REFCLSID clsidProfilerObject,DWORD dwEventMask,DWORD dwContext) {
    return This->lpVtbl->StartProfiling(This,clsidProfilerObject,dwEventMask,dwContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerControl3_SetProfilerEventMask(IActiveScriptProfilerControl3* This,DWORD dwEventMask) {
    return This->lpVtbl->SetProfilerEventMask(This,dwEventMask);
}
static FORCEINLINE HRESULT IActiveScriptProfilerControl3_StopProfiling(IActiveScriptProfilerControl3* This,HRESULT hrShutdownReason) {
    return This->lpVtbl->StopProfiling(This,hrShutdownReason);
}
/*** IActiveScriptProfilerControl2 methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerControl3_CompleteProfilerStart(IActiveScriptProfilerControl3* This) {
    return This->lpVtbl->CompleteProfilerStart(This);
}
static FORCEINLINE HRESULT IActiveScriptProfilerControl3_PrepareProfilerStop(IActiveScriptProfilerControl3* This) {
    return This->lpVtbl->PrepareProfilerStop(This);
}
/*** IActiveScriptProfilerControl3 methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerControl3_EnumHeap(IActiveScriptProfilerControl3* This,IActiveScriptProfilerHeapEnum **ppEnum) {
    return This->lpVtbl->EnumHeap(This,ppEnum);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptProfilerControl3_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptProfilerCallback interface
 */
#ifndef __IActiveScriptProfilerCallback_INTERFACE_DEFINED__
#define __IActiveScriptProfilerCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptProfilerCallback, 0x740eca23, 0x7d9d, 0x42e5, 0xba,0x9d, 0xf8,0xb2,0x4b,0x1c,0x7a,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("740eca23-7d9d-42e5-ba9d-f8b24b1c7a9b")
IActiveScriptProfilerCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        DWORD dwContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE Shutdown(
        HRESULT hrReason) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScriptCompiled(
        PROFILER_TOKEN scriptId,
        PROFILER_SCRIPT_TYPE type,
        IUnknown *pIDebugDocumentContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE FunctionCompiled(
        PROFILER_TOKEN functionId,
        PROFILER_TOKEN scriptId,
        const WCHAR *pwszFunctionName,
        const WCHAR *pwszFunctionNameHint,
        IUnknown *pIDebugDocumentContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnFunctionEnter(
        PROFILER_TOKEN scriptId,
        PROFILER_TOKEN functionId) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnFunctionExit(
        PROFILER_TOKEN scriptId,
        PROFILER_TOKEN functionId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptProfilerCallback, 0x740eca23, 0x7d9d, 0x42e5, 0xba,0x9d, 0xf8,0xb2,0x4b,0x1c,0x7a,0x9b)
#endif
#else
typedef struct IActiveScriptProfilerCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptProfilerCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IActiveScriptProfilerCallback *This,
        DWORD dwContext);

    HRESULT (STDMETHODCALLTYPE *Shutdown)(
        IActiveScriptProfilerCallback *This,
        HRESULT hrReason);

    HRESULT (STDMETHODCALLTYPE *ScriptCompiled)(
        IActiveScriptProfilerCallback *This,
        PROFILER_TOKEN scriptId,
        PROFILER_SCRIPT_TYPE type,
        IUnknown *pIDebugDocumentContext);

    HRESULT (STDMETHODCALLTYPE *FunctionCompiled)(
        IActiveScriptProfilerCallback *This,
        PROFILER_TOKEN functionId,
        PROFILER_TOKEN scriptId,
        const WCHAR *pwszFunctionName,
        const WCHAR *pwszFunctionNameHint,
        IUnknown *pIDebugDocumentContext);

    HRESULT (STDMETHODCALLTYPE *OnFunctionEnter)(
        IActiveScriptProfilerCallback *This,
        PROFILER_TOKEN scriptId,
        PROFILER_TOKEN functionId);

    HRESULT (STDMETHODCALLTYPE *OnFunctionExit)(
        IActiveScriptProfilerCallback *This,
        PROFILER_TOKEN scriptId,
        PROFILER_TOKEN functionId);

    END_INTERFACE
} IActiveScriptProfilerCallbackVtbl;

interface IActiveScriptProfilerCallback {
    CONST_VTBL IActiveScriptProfilerCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptProfilerCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptProfilerCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptProfilerCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptProfilerCallback methods ***/
#define IActiveScriptProfilerCallback_Initialize(This,dwContext) (This)->lpVtbl->Initialize(This,dwContext)
#define IActiveScriptProfilerCallback_Shutdown(This,hrReason) (This)->lpVtbl->Shutdown(This,hrReason)
#define IActiveScriptProfilerCallback_ScriptCompiled(This,scriptId,type,pIDebugDocumentContext) (This)->lpVtbl->ScriptCompiled(This,scriptId,type,pIDebugDocumentContext)
#define IActiveScriptProfilerCallback_FunctionCompiled(This,functionId,scriptId,pwszFunctionName,pwszFunctionNameHint,pIDebugDocumentContext) (This)->lpVtbl->FunctionCompiled(This,functionId,scriptId,pwszFunctionName,pwszFunctionNameHint,pIDebugDocumentContext)
#define IActiveScriptProfilerCallback_OnFunctionEnter(This,scriptId,functionId) (This)->lpVtbl->OnFunctionEnter(This,scriptId,functionId)
#define IActiveScriptProfilerCallback_OnFunctionExit(This,scriptId,functionId) (This)->lpVtbl->OnFunctionExit(This,scriptId,functionId)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerCallback_QueryInterface(IActiveScriptProfilerCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptProfilerCallback_AddRef(IActiveScriptProfilerCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptProfilerCallback_Release(IActiveScriptProfilerCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptProfilerCallback methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerCallback_Initialize(IActiveScriptProfilerCallback* This,DWORD dwContext) {
    return This->lpVtbl->Initialize(This,dwContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback_Shutdown(IActiveScriptProfilerCallback* This,HRESULT hrReason) {
    return This->lpVtbl->Shutdown(This,hrReason);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback_ScriptCompiled(IActiveScriptProfilerCallback* This,PROFILER_TOKEN scriptId,PROFILER_SCRIPT_TYPE type,IUnknown *pIDebugDocumentContext) {
    return This->lpVtbl->ScriptCompiled(This,scriptId,type,pIDebugDocumentContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback_FunctionCompiled(IActiveScriptProfilerCallback* This,PROFILER_TOKEN functionId,PROFILER_TOKEN scriptId,const WCHAR *pwszFunctionName,const WCHAR *pwszFunctionNameHint,IUnknown *pIDebugDocumentContext) {
    return This->lpVtbl->FunctionCompiled(This,functionId,scriptId,pwszFunctionName,pwszFunctionNameHint,pIDebugDocumentContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback_OnFunctionEnter(IActiveScriptProfilerCallback* This,PROFILER_TOKEN scriptId,PROFILER_TOKEN functionId) {
    return This->lpVtbl->OnFunctionEnter(This,scriptId,functionId);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback_OnFunctionExit(IActiveScriptProfilerCallback* This,PROFILER_TOKEN scriptId,PROFILER_TOKEN functionId) {
    return This->lpVtbl->OnFunctionExit(This,scriptId,functionId);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptProfilerCallback_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptProfilerCallback2 interface
 */
#ifndef __IActiveScriptProfilerCallback2_INTERFACE_DEFINED__
#define __IActiveScriptProfilerCallback2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptProfilerCallback2, 0x31b7f8ad, 0xa637, 0x409c, 0xb2,0x2f, 0x04,0x09,0x95,0xb6,0x10,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("31b7f8ad-a637-409c-b22f-040995b6103d")
IActiveScriptProfilerCallback2 : public IActiveScriptProfilerCallback
{
    virtual HRESULT STDMETHODCALLTYPE OnFunctionEnterByName(
        const WCHAR *pwszFunctionName,
        PROFILER_SCRIPT_TYPE type) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnFunctionExitByName(
        const WCHAR *pwszFunctionName,
        PROFILER_SCRIPT_TYPE type) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptProfilerCallback2, 0x31b7f8ad, 0xa637, 0x409c, 0xb2,0x2f, 0x04,0x09,0x95,0xb6,0x10,0x3d)
#endif
#else
typedef struct IActiveScriptProfilerCallback2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptProfilerCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IActiveScriptProfilerCallback2 *This,
        DWORD dwContext);

    HRESULT (STDMETHODCALLTYPE *Shutdown)(
        IActiveScriptProfilerCallback2 *This,
        HRESULT hrReason);

    HRESULT (STDMETHODCALLTYPE *ScriptCompiled)(
        IActiveScriptProfilerCallback2 *This,
        PROFILER_TOKEN scriptId,
        PROFILER_SCRIPT_TYPE type,
        IUnknown *pIDebugDocumentContext);

    HRESULT (STDMETHODCALLTYPE *FunctionCompiled)(
        IActiveScriptProfilerCallback2 *This,
        PROFILER_TOKEN functionId,
        PROFILER_TOKEN scriptId,
        const WCHAR *pwszFunctionName,
        const WCHAR *pwszFunctionNameHint,
        IUnknown *pIDebugDocumentContext);

    HRESULT (STDMETHODCALLTYPE *OnFunctionEnter)(
        IActiveScriptProfilerCallback2 *This,
        PROFILER_TOKEN scriptId,
        PROFILER_TOKEN functionId);

    HRESULT (STDMETHODCALLTYPE *OnFunctionExit)(
        IActiveScriptProfilerCallback2 *This,
        PROFILER_TOKEN scriptId,
        PROFILER_TOKEN functionId);

    /*** IActiveScriptProfilerCallback2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnFunctionEnterByName)(
        IActiveScriptProfilerCallback2 *This,
        const WCHAR *pwszFunctionName,
        PROFILER_SCRIPT_TYPE type);

    HRESULT (STDMETHODCALLTYPE *OnFunctionExitByName)(
        IActiveScriptProfilerCallback2 *This,
        const WCHAR *pwszFunctionName,
        PROFILER_SCRIPT_TYPE type);

    END_INTERFACE
} IActiveScriptProfilerCallback2Vtbl;

interface IActiveScriptProfilerCallback2 {
    CONST_VTBL IActiveScriptProfilerCallback2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptProfilerCallback2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptProfilerCallback2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptProfilerCallback2_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptProfilerCallback methods ***/
#define IActiveScriptProfilerCallback2_Initialize(This,dwContext) (This)->lpVtbl->Initialize(This,dwContext)
#define IActiveScriptProfilerCallback2_Shutdown(This,hrReason) (This)->lpVtbl->Shutdown(This,hrReason)
#define IActiveScriptProfilerCallback2_ScriptCompiled(This,scriptId,type,pIDebugDocumentContext) (This)->lpVtbl->ScriptCompiled(This,scriptId,type,pIDebugDocumentContext)
#define IActiveScriptProfilerCallback2_FunctionCompiled(This,functionId,scriptId,pwszFunctionName,pwszFunctionNameHint,pIDebugDocumentContext) (This)->lpVtbl->FunctionCompiled(This,functionId,scriptId,pwszFunctionName,pwszFunctionNameHint,pIDebugDocumentContext)
#define IActiveScriptProfilerCallback2_OnFunctionEnter(This,scriptId,functionId) (This)->lpVtbl->OnFunctionEnter(This,scriptId,functionId)
#define IActiveScriptProfilerCallback2_OnFunctionExit(This,scriptId,functionId) (This)->lpVtbl->OnFunctionExit(This,scriptId,functionId)
/*** IActiveScriptProfilerCallback2 methods ***/
#define IActiveScriptProfilerCallback2_OnFunctionEnterByName(This,pwszFunctionName,type) (This)->lpVtbl->OnFunctionEnterByName(This,pwszFunctionName,type)
#define IActiveScriptProfilerCallback2_OnFunctionExitByName(This,pwszFunctionName,type) (This)->lpVtbl->OnFunctionExitByName(This,pwszFunctionName,type)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerCallback2_QueryInterface(IActiveScriptProfilerCallback2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptProfilerCallback2_AddRef(IActiveScriptProfilerCallback2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptProfilerCallback2_Release(IActiveScriptProfilerCallback2* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptProfilerCallback methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerCallback2_Initialize(IActiveScriptProfilerCallback2* This,DWORD dwContext) {
    return This->lpVtbl->Initialize(This,dwContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback2_Shutdown(IActiveScriptProfilerCallback2* This,HRESULT hrReason) {
    return This->lpVtbl->Shutdown(This,hrReason);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback2_ScriptCompiled(IActiveScriptProfilerCallback2* This,PROFILER_TOKEN scriptId,PROFILER_SCRIPT_TYPE type,IUnknown *pIDebugDocumentContext) {
    return This->lpVtbl->ScriptCompiled(This,scriptId,type,pIDebugDocumentContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback2_FunctionCompiled(IActiveScriptProfilerCallback2* This,PROFILER_TOKEN functionId,PROFILER_TOKEN scriptId,const WCHAR *pwszFunctionName,const WCHAR *pwszFunctionNameHint,IUnknown *pIDebugDocumentContext) {
    return This->lpVtbl->FunctionCompiled(This,functionId,scriptId,pwszFunctionName,pwszFunctionNameHint,pIDebugDocumentContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback2_OnFunctionEnter(IActiveScriptProfilerCallback2* This,PROFILER_TOKEN scriptId,PROFILER_TOKEN functionId) {
    return This->lpVtbl->OnFunctionEnter(This,scriptId,functionId);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback2_OnFunctionExit(IActiveScriptProfilerCallback2* This,PROFILER_TOKEN scriptId,PROFILER_TOKEN functionId) {
    return This->lpVtbl->OnFunctionExit(This,scriptId,functionId);
}
/*** IActiveScriptProfilerCallback2 methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerCallback2_OnFunctionEnterByName(IActiveScriptProfilerCallback2* This,const WCHAR *pwszFunctionName,PROFILER_SCRIPT_TYPE type) {
    return This->lpVtbl->OnFunctionEnterByName(This,pwszFunctionName,type);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback2_OnFunctionExitByName(IActiveScriptProfilerCallback2* This,const WCHAR *pwszFunctionName,PROFILER_SCRIPT_TYPE type) {
    return This->lpVtbl->OnFunctionExitByName(This,pwszFunctionName,type);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptProfilerCallback2_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActiveScriptProfilerCallback3 interface
 */
#ifndef __IActiveScriptProfilerCallback3_INTERFACE_DEFINED__
#define __IActiveScriptProfilerCallback3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActiveScriptProfilerCallback3, 0x6ac5ad25, 0x2037, 0x4687, 0x91,0xdf, 0xb5,0x99,0x79,0xd9,0x3d,0x73);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6ac5ad25-2037-4687-91df-b59979d93d73")
IActiveScriptProfilerCallback3 : public IActiveScriptProfilerCallback2
{
    virtual HRESULT STDMETHODCALLTYPE SetWebWorkerId(
        DWORD webWorkerId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActiveScriptProfilerCallback3, 0x6ac5ad25, 0x2037, 0x4687, 0x91,0xdf, 0xb5,0x99,0x79,0xd9,0x3d,0x73)
#endif
#else
typedef struct IActiveScriptProfilerCallback3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IActiveScriptProfilerCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IActiveScriptProfilerCallback3 *This,
        DWORD dwContext);

    HRESULT (STDMETHODCALLTYPE *Shutdown)(
        IActiveScriptProfilerCallback3 *This,
        HRESULT hrReason);

    HRESULT (STDMETHODCALLTYPE *ScriptCompiled)(
        IActiveScriptProfilerCallback3 *This,
        PROFILER_TOKEN scriptId,
        PROFILER_SCRIPT_TYPE type,
        IUnknown *pIDebugDocumentContext);

    HRESULT (STDMETHODCALLTYPE *FunctionCompiled)(
        IActiveScriptProfilerCallback3 *This,
        PROFILER_TOKEN functionId,
        PROFILER_TOKEN scriptId,
        const WCHAR *pwszFunctionName,
        const WCHAR *pwszFunctionNameHint,
        IUnknown *pIDebugDocumentContext);

    HRESULT (STDMETHODCALLTYPE *OnFunctionEnter)(
        IActiveScriptProfilerCallback3 *This,
        PROFILER_TOKEN scriptId,
        PROFILER_TOKEN functionId);

    HRESULT (STDMETHODCALLTYPE *OnFunctionExit)(
        IActiveScriptProfilerCallback3 *This,
        PROFILER_TOKEN scriptId,
        PROFILER_TOKEN functionId);

    /*** IActiveScriptProfilerCallback2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnFunctionEnterByName)(
        IActiveScriptProfilerCallback3 *This,
        const WCHAR *pwszFunctionName,
        PROFILER_SCRIPT_TYPE type);

    HRESULT (STDMETHODCALLTYPE *OnFunctionExitByName)(
        IActiveScriptProfilerCallback3 *This,
        const WCHAR *pwszFunctionName,
        PROFILER_SCRIPT_TYPE type);

    /*** IActiveScriptProfilerCallback3 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetWebWorkerId)(
        IActiveScriptProfilerCallback3 *This,
        DWORD webWorkerId);

    END_INTERFACE
} IActiveScriptProfilerCallback3Vtbl;

interface IActiveScriptProfilerCallback3 {
    CONST_VTBL IActiveScriptProfilerCallback3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActiveScriptProfilerCallback3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActiveScriptProfilerCallback3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActiveScriptProfilerCallback3_Release(This) (This)->lpVtbl->Release(This)
/*** IActiveScriptProfilerCallback methods ***/
#define IActiveScriptProfilerCallback3_Initialize(This,dwContext) (This)->lpVtbl->Initialize(This,dwContext)
#define IActiveScriptProfilerCallback3_Shutdown(This,hrReason) (This)->lpVtbl->Shutdown(This,hrReason)
#define IActiveScriptProfilerCallback3_ScriptCompiled(This,scriptId,type,pIDebugDocumentContext) (This)->lpVtbl->ScriptCompiled(This,scriptId,type,pIDebugDocumentContext)
#define IActiveScriptProfilerCallback3_FunctionCompiled(This,functionId,scriptId,pwszFunctionName,pwszFunctionNameHint,pIDebugDocumentContext) (This)->lpVtbl->FunctionCompiled(This,functionId,scriptId,pwszFunctionName,pwszFunctionNameHint,pIDebugDocumentContext)
#define IActiveScriptProfilerCallback3_OnFunctionEnter(This,scriptId,functionId) (This)->lpVtbl->OnFunctionEnter(This,scriptId,functionId)
#define IActiveScriptProfilerCallback3_OnFunctionExit(This,scriptId,functionId) (This)->lpVtbl->OnFunctionExit(This,scriptId,functionId)
/*** IActiveScriptProfilerCallback2 methods ***/
#define IActiveScriptProfilerCallback3_OnFunctionEnterByName(This,pwszFunctionName,type) (This)->lpVtbl->OnFunctionEnterByName(This,pwszFunctionName,type)
#define IActiveScriptProfilerCallback3_OnFunctionExitByName(This,pwszFunctionName,type) (This)->lpVtbl->OnFunctionExitByName(This,pwszFunctionName,type)
/*** IActiveScriptProfilerCallback3 methods ***/
#define IActiveScriptProfilerCallback3_SetWebWorkerId(This,webWorkerId) (This)->lpVtbl->SetWebWorkerId(This,webWorkerId)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_QueryInterface(IActiveScriptProfilerCallback3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActiveScriptProfilerCallback3_AddRef(IActiveScriptProfilerCallback3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActiveScriptProfilerCallback3_Release(IActiveScriptProfilerCallback3* This) {
    return This->lpVtbl->Release(This);
}
/*** IActiveScriptProfilerCallback methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_Initialize(IActiveScriptProfilerCallback3* This,DWORD dwContext) {
    return This->lpVtbl->Initialize(This,dwContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_Shutdown(IActiveScriptProfilerCallback3* This,HRESULT hrReason) {
    return This->lpVtbl->Shutdown(This,hrReason);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_ScriptCompiled(IActiveScriptProfilerCallback3* This,PROFILER_TOKEN scriptId,PROFILER_SCRIPT_TYPE type,IUnknown *pIDebugDocumentContext) {
    return This->lpVtbl->ScriptCompiled(This,scriptId,type,pIDebugDocumentContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_FunctionCompiled(IActiveScriptProfilerCallback3* This,PROFILER_TOKEN functionId,PROFILER_TOKEN scriptId,const WCHAR *pwszFunctionName,const WCHAR *pwszFunctionNameHint,IUnknown *pIDebugDocumentContext) {
    return This->lpVtbl->FunctionCompiled(This,functionId,scriptId,pwszFunctionName,pwszFunctionNameHint,pIDebugDocumentContext);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_OnFunctionEnter(IActiveScriptProfilerCallback3* This,PROFILER_TOKEN scriptId,PROFILER_TOKEN functionId) {
    return This->lpVtbl->OnFunctionEnter(This,scriptId,functionId);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_OnFunctionExit(IActiveScriptProfilerCallback3* This,PROFILER_TOKEN scriptId,PROFILER_TOKEN functionId) {
    return This->lpVtbl->OnFunctionExit(This,scriptId,functionId);
}
/*** IActiveScriptProfilerCallback2 methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_OnFunctionEnterByName(IActiveScriptProfilerCallback3* This,const WCHAR *pwszFunctionName,PROFILER_SCRIPT_TYPE type) {
    return This->lpVtbl->OnFunctionEnterByName(This,pwszFunctionName,type);
}
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_OnFunctionExitByName(IActiveScriptProfilerCallback3* This,const WCHAR *pwszFunctionName,PROFILER_SCRIPT_TYPE type) {
    return This->lpVtbl->OnFunctionExitByName(This,pwszFunctionName,type);
}
/*** IActiveScriptProfilerCallback3 methods ***/
static FORCEINLINE HRESULT IActiveScriptProfilerCallback3_SetWebWorkerId(IActiveScriptProfilerCallback3* This,DWORD webWorkerId) {
    return This->lpVtbl->SetWebWorkerId(This,webWorkerId);
}
#endif
#endif

#endif


#endif  /* __IActiveScriptProfilerCallback3_INTERFACE_DEFINED__ */

#endif

#endif
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __activprof_h__ */
