/*** Autogenerated by WIDL 6.4 from include/activprof.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 __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_0000000C {
    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_0000000D {
    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_0000000E {
    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_0000000F {
    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_00000010 {
    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__ */
