/*** Autogenerated by WIDL 10.4 from include/relogger.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 __relogger_h__
#define __relogger_h__

/* Forward declarations */

#ifndef __ITraceEvent_FWD_DEFINED__
#define __ITraceEvent_FWD_DEFINED__
typedef interface ITraceEvent ITraceEvent;
#ifdef __cplusplus
interface ITraceEvent;
#endif /* __cplusplus */
#endif

#ifndef __ITraceEventCallback_FWD_DEFINED__
#define __ITraceEventCallback_FWD_DEFINED__
typedef interface ITraceEventCallback ITraceEventCallback;
#ifdef __cplusplus
interface ITraceEventCallback;
#endif /* __cplusplus */
#endif

#ifndef __ITraceRelogger_FWD_DEFINED__
#define __ITraceRelogger_FWD_DEFINED__
typedef interface ITraceRelogger ITraceRelogger;
#ifdef __cplusplus
interface ITraceRelogger;
#endif /* __cplusplus */
#endif

#ifndef __CTraceRelogger_FWD_DEFINED__
#define __CTraceRelogger_FWD_DEFINED__
#ifdef __cplusplus
typedef class CTraceRelogger CTraceRelogger;
#else
typedef struct CTraceRelogger CTraceRelogger;
#endif /* defined __cplusplus */
#endif /* defined __CTraceRelogger_FWD_DEFINED__ */

/* Headers for imported files */

#include <unknwn.h>
#include <oaidl.h>
#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct _EVENT_DESCRIPTOR {
    USHORT Id;
    UCHAR Version;
    UCHAR Channel;
    UCHAR Level;
    UCHAR Opcode;
    USHORT Task;
    ULONGLONG Keyword;
} EVENT_DESCRIPTOR;
typedef struct _EVENT_DESCRIPTOR *PEVENT_DESCRIPTOR;
typedef const EVENT_DESCRIPTOR *PCEVENT_DESCRIPTOR;
typedef struct _EVENT_HEADER {
    USHORT Size;
    USHORT HeaderType;
    USHORT Flags;
    USHORT EventProperty;
    ULONG ThreadId;
    ULONG ProcessId;
    LARGE_INTEGER TimeStamp;
    GUID ProviderId;
    EVENT_DESCRIPTOR EventDescriptor;
    union {
        struct {
            ULONG KernelTime;
            ULONG UserTime;
        } DUMMYSTRUCTNAME;
        ULONG64 ProcessorTime;
    } DUMMYUNIONNAME;
    GUID ActivityId;
} EVENT_HEADER;
typedef struct _EVENT_HEADER *PEVENT_HEADER;
typedef struct _ETW_BUFFER_CONTEXT {
    union {
        struct {
            UCHAR ProcessorNumber;
            UCHAR Alignment;
        } DUMMYSTRUCTNAME;
        USHORT ProcessorIndex;
    } DUMMYUNIONNAME;
    USHORT LoggerId;
} ETW_BUFFER_CONTEXT;
typedef struct _ETW_BUFFER_CONTEXT *PETW_BUFFER_CONTEXT;
typedef struct _EVENT_HEADER_EXTENDED_DATA_ITEM {
    USHORT Reserved1;
    USHORT ExtType;
    USHORT Linkage;
    USHORT DataSize;
    ULONGLONG DataPtr;
} EVENT_HEADER_EXTENDED_DATA_ITEM;
typedef struct _EVENT_HEADER_EXTENDED_DATA_ITEM *PEVENT_HEADER_EXTENDED_DATA_ITEM;
typedef struct _EVENT_RECORD {
    EVENT_HEADER EventHeader;
    ETW_BUFFER_CONTEXT BufferContext;
    USHORT ExtendedDataCount;
    USHORT UserDataLength;
    EVENT_HEADER_EXTENDED_DATA_ITEM *ExtendedData;
    void *UserData;
    void *UserContext;
} EVENT_RECORD;
typedef struct _EVENT_RECORD *PEVENT_RECORD;
typedef ULONG64 TRACEHANDLE;
typedef ULONG64 *PTRACEHANDLE;
/*****************************************************************************
 * ITraceEvent interface
 */
#ifndef __ITraceEvent_INTERFACE_DEFINED__
#define __ITraceEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITraceEvent, 0x8cc97f40, 0x9028, 0x4ff3, 0x9b,0x62, 0x7d,0x1f,0x79,0xca,0x7b,0xcb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8cc97f40-9028-4ff3-9b62-7d1f79ca7bcb")
ITraceEvent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Clone(
        ITraceEvent **NewEvent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUserContext(
        void **UserContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEventRecord(
        PEVENT_RECORD *EventRecord) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPayload(
        BYTE *Payload,
        ULONG PayloadSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEventDescriptor(
        PCEVENT_DESCRIPTOR EventDescriptor) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProcessId(
        ULONG ProcessId) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProcessorIndex(
        ULONG ProcessorIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetThreadId(
        ULONG ThreadId) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetThreadTimes(
        ULONG KernelTime,
        ULONG UserTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetActivityId(
        LPCGUID ActivityId) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTimeStamp(
        LARGE_INTEGER *TimeStamp) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProviderId(
        LPCGUID ProviderId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITraceEvent, 0x8cc97f40, 0x9028, 0x4ff3, 0x9b,0x62, 0x7d,0x1f,0x79,0xca,0x7b,0xcb)
#endif
#else
typedef struct ITraceEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITraceEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *Clone)(
        ITraceEvent *This,
        ITraceEvent **NewEvent);

    HRESULT (STDMETHODCALLTYPE *GetUserContext)(
        ITraceEvent *This,
        void **UserContext);

    HRESULT (STDMETHODCALLTYPE *GetEventRecord)(
        ITraceEvent *This,
        PEVENT_RECORD *EventRecord);

    HRESULT (STDMETHODCALLTYPE *SetPayload)(
        ITraceEvent *This,
        BYTE *Payload,
        ULONG PayloadSize);

    HRESULT (STDMETHODCALLTYPE *SetEventDescriptor)(
        ITraceEvent *This,
        PCEVENT_DESCRIPTOR EventDescriptor);

    HRESULT (STDMETHODCALLTYPE *SetProcessId)(
        ITraceEvent *This,
        ULONG ProcessId);

    HRESULT (STDMETHODCALLTYPE *SetProcessorIndex)(
        ITraceEvent *This,
        ULONG ProcessorIndex);

    HRESULT (STDMETHODCALLTYPE *SetThreadId)(
        ITraceEvent *This,
        ULONG ThreadId);

    HRESULT (STDMETHODCALLTYPE *SetThreadTimes)(
        ITraceEvent *This,
        ULONG KernelTime,
        ULONG UserTime);

    HRESULT (STDMETHODCALLTYPE *SetActivityId)(
        ITraceEvent *This,
        LPCGUID ActivityId);

    HRESULT (STDMETHODCALLTYPE *SetTimeStamp)(
        ITraceEvent *This,
        LARGE_INTEGER *TimeStamp);

    HRESULT (STDMETHODCALLTYPE *SetProviderId)(
        ITraceEvent *This,
        LPCGUID ProviderId);

    END_INTERFACE
} ITraceEventVtbl;

interface ITraceEvent {
    CONST_VTBL ITraceEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITraceEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITraceEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITraceEvent_Release(This) (This)->lpVtbl->Release(This)
/*** ITraceEvent methods ***/
#define ITraceEvent_Clone(This,NewEvent) (This)->lpVtbl->Clone(This,NewEvent)
#define ITraceEvent_GetUserContext(This,UserContext) (This)->lpVtbl->GetUserContext(This,UserContext)
#define ITraceEvent_GetEventRecord(This,EventRecord) (This)->lpVtbl->GetEventRecord(This,EventRecord)
#define ITraceEvent_SetPayload(This,Payload,PayloadSize) (This)->lpVtbl->SetPayload(This,Payload,PayloadSize)
#define ITraceEvent_SetEventDescriptor(This,EventDescriptor) (This)->lpVtbl->SetEventDescriptor(This,EventDescriptor)
#define ITraceEvent_SetProcessId(This,ProcessId) (This)->lpVtbl->SetProcessId(This,ProcessId)
#define ITraceEvent_SetProcessorIndex(This,ProcessorIndex) (This)->lpVtbl->SetProcessorIndex(This,ProcessorIndex)
#define ITraceEvent_SetThreadId(This,ThreadId) (This)->lpVtbl->SetThreadId(This,ThreadId)
#define ITraceEvent_SetThreadTimes(This,KernelTime,UserTime) (This)->lpVtbl->SetThreadTimes(This,KernelTime,UserTime)
#define ITraceEvent_SetActivityId(This,ActivityId) (This)->lpVtbl->SetActivityId(This,ActivityId)
#define ITraceEvent_SetTimeStamp(This,TimeStamp) (This)->lpVtbl->SetTimeStamp(This,TimeStamp)
#define ITraceEvent_SetProviderId(This,ProviderId) (This)->lpVtbl->SetProviderId(This,ProviderId)
#else
/*** IUnknown methods ***/
static inline HRESULT ITraceEvent_QueryInterface(ITraceEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITraceEvent_AddRef(ITraceEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITraceEvent_Release(ITraceEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** ITraceEvent methods ***/
static inline HRESULT ITraceEvent_Clone(ITraceEvent* This,ITraceEvent **NewEvent) {
    return This->lpVtbl->Clone(This,NewEvent);
}
static inline HRESULT ITraceEvent_GetUserContext(ITraceEvent* This,void **UserContext) {
    return This->lpVtbl->GetUserContext(This,UserContext);
}
static inline HRESULT ITraceEvent_GetEventRecord(ITraceEvent* This,PEVENT_RECORD *EventRecord) {
    return This->lpVtbl->GetEventRecord(This,EventRecord);
}
static inline HRESULT ITraceEvent_SetPayload(ITraceEvent* This,BYTE *Payload,ULONG PayloadSize) {
    return This->lpVtbl->SetPayload(This,Payload,PayloadSize);
}
static inline HRESULT ITraceEvent_SetEventDescriptor(ITraceEvent* This,PCEVENT_DESCRIPTOR EventDescriptor) {
    return This->lpVtbl->SetEventDescriptor(This,EventDescriptor);
}
static inline HRESULT ITraceEvent_SetProcessId(ITraceEvent* This,ULONG ProcessId) {
    return This->lpVtbl->SetProcessId(This,ProcessId);
}
static inline HRESULT ITraceEvent_SetProcessorIndex(ITraceEvent* This,ULONG ProcessorIndex) {
    return This->lpVtbl->SetProcessorIndex(This,ProcessorIndex);
}
static inline HRESULT ITraceEvent_SetThreadId(ITraceEvent* This,ULONG ThreadId) {
    return This->lpVtbl->SetThreadId(This,ThreadId);
}
static inline HRESULT ITraceEvent_SetThreadTimes(ITraceEvent* This,ULONG KernelTime,ULONG UserTime) {
    return This->lpVtbl->SetThreadTimes(This,KernelTime,UserTime);
}
static inline HRESULT ITraceEvent_SetActivityId(ITraceEvent* This,LPCGUID ActivityId) {
    return This->lpVtbl->SetActivityId(This,ActivityId);
}
static inline HRESULT ITraceEvent_SetTimeStamp(ITraceEvent* This,LARGE_INTEGER *TimeStamp) {
    return This->lpVtbl->SetTimeStamp(This,TimeStamp);
}
static inline HRESULT ITraceEvent_SetProviderId(ITraceEvent* This,LPCGUID ProviderId) {
    return This->lpVtbl->SetProviderId(This,ProviderId);
}
#endif
#endif

#endif


#endif  /* __ITraceEvent_INTERFACE_DEFINED__ */

#ifndef __ITraceRelogger_FWD_DEFINED__
#define __ITraceRelogger_FWD_DEFINED__
typedef interface ITraceRelogger ITraceRelogger;
#ifdef __cplusplus
interface ITraceRelogger;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * ITraceEventCallback interface
 */
#ifndef __ITraceEventCallback_INTERFACE_DEFINED__
#define __ITraceEventCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITraceEventCallback, 0x3ed25501, 0x593f, 0x43e9, 0x8f,0x38, 0x3a,0xb4,0x6f,0x5a,0x4a,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3ed25501-593f-43e9-8f38-3ab46f5a4a52")
ITraceEventCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnBeginProcessTrace(
        ITraceEvent *HeaderEvent,
        ITraceRelogger *Relogger) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnFinalizeProcessTrace(
        ITraceRelogger *Relogger) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnEvent(
        ITraceEvent *Event,
        ITraceRelogger *Relogger) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITraceEventCallback, 0x3ed25501, 0x593f, 0x43e9, 0x8f,0x38, 0x3a,0xb4,0x6f,0x5a,0x4a,0x52)
#endif
#else
typedef struct ITraceEventCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITraceEventCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnBeginProcessTrace)(
        ITraceEventCallback *This,
        ITraceEvent *HeaderEvent,
        ITraceRelogger *Relogger);

    HRESULT (STDMETHODCALLTYPE *OnFinalizeProcessTrace)(
        ITraceEventCallback *This,
        ITraceRelogger *Relogger);

    HRESULT (STDMETHODCALLTYPE *OnEvent)(
        ITraceEventCallback *This,
        ITraceEvent *Event,
        ITraceRelogger *Relogger);

    END_INTERFACE
} ITraceEventCallbackVtbl;

interface ITraceEventCallback {
    CONST_VTBL ITraceEventCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITraceEventCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITraceEventCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITraceEventCallback_Release(This) (This)->lpVtbl->Release(This)
/*** ITraceEventCallback methods ***/
#define ITraceEventCallback_OnBeginProcessTrace(This,HeaderEvent,Relogger) (This)->lpVtbl->OnBeginProcessTrace(This,HeaderEvent,Relogger)
#define ITraceEventCallback_OnFinalizeProcessTrace(This,Relogger) (This)->lpVtbl->OnFinalizeProcessTrace(This,Relogger)
#define ITraceEventCallback_OnEvent(This,Event,Relogger) (This)->lpVtbl->OnEvent(This,Event,Relogger)
#else
/*** IUnknown methods ***/
static inline HRESULT ITraceEventCallback_QueryInterface(ITraceEventCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITraceEventCallback_AddRef(ITraceEventCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITraceEventCallback_Release(ITraceEventCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** ITraceEventCallback methods ***/
static inline HRESULT ITraceEventCallback_OnBeginProcessTrace(ITraceEventCallback* This,ITraceEvent *HeaderEvent,ITraceRelogger *Relogger) {
    return This->lpVtbl->OnBeginProcessTrace(This,HeaderEvent,Relogger);
}
static inline HRESULT ITraceEventCallback_OnFinalizeProcessTrace(ITraceEventCallback* This,ITraceRelogger *Relogger) {
    return This->lpVtbl->OnFinalizeProcessTrace(This,Relogger);
}
static inline HRESULT ITraceEventCallback_OnEvent(ITraceEventCallback* This,ITraceEvent *Event,ITraceRelogger *Relogger) {
    return This->lpVtbl->OnEvent(This,Event,Relogger);
}
#endif
#endif

#endif


#endif  /* __ITraceEventCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITraceRelogger interface
 */
#ifndef __ITraceRelogger_INTERFACE_DEFINED__
#define __ITraceRelogger_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITraceRelogger, 0xf754ad43, 0x3bcc, 0x4286, 0x80,0x09, 0x9c,0x5d,0xa2,0x14,0xe8,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f754ad43-3bcc-4286-8009-9c5da214e84e")
ITraceRelogger : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddLogfileTraceStream(
        BSTR LogfileName,
        void *UserContext,
        TRACEHANDLE *TraceHandle) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddRealtimeTraceStream(
        BSTR LoggerName,
        void *UserContext,
        TRACEHANDLE *TraceHandle) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterCallback(
        ITraceEventCallback *Callback) = 0;

    virtual HRESULT STDMETHODCALLTYPE Inject(
        ITraceEvent *Event) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateEventInstance(
        TRACEHANDLE TraceHandle,
        ULONG Flags,
        ITraceEvent **Event) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProcessTrace(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputFilename(
        BSTR LogfileName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCompressionMode(
        BOOLEAN CompressionMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITraceRelogger, 0xf754ad43, 0x3bcc, 0x4286, 0x80,0x09, 0x9c,0x5d,0xa2,0x14,0xe8,0x4e)
#endif
#else
typedef struct ITraceReloggerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITraceRelogger methods ***/
    HRESULT (STDMETHODCALLTYPE *AddLogfileTraceStream)(
        ITraceRelogger *This,
        BSTR LogfileName,
        void *UserContext,
        TRACEHANDLE *TraceHandle);

    HRESULT (STDMETHODCALLTYPE *AddRealtimeTraceStream)(
        ITraceRelogger *This,
        BSTR LoggerName,
        void *UserContext,
        TRACEHANDLE *TraceHandle);

    HRESULT (STDMETHODCALLTYPE *RegisterCallback)(
        ITraceRelogger *This,
        ITraceEventCallback *Callback);

    HRESULT (STDMETHODCALLTYPE *Inject)(
        ITraceRelogger *This,
        ITraceEvent *Event);

    HRESULT (STDMETHODCALLTYPE *CreateEventInstance)(
        ITraceRelogger *This,
        TRACEHANDLE TraceHandle,
        ULONG Flags,
        ITraceEvent **Event);

    HRESULT (STDMETHODCALLTYPE *ProcessTrace)(
        ITraceRelogger *This);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilename)(
        ITraceRelogger *This,
        BSTR LogfileName);

    HRESULT (STDMETHODCALLTYPE *SetCompressionMode)(
        ITraceRelogger *This,
        BOOLEAN CompressionMode);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        ITraceRelogger *This);

    END_INTERFACE
} ITraceReloggerVtbl;

interface ITraceRelogger {
    CONST_VTBL ITraceReloggerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITraceRelogger_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITraceRelogger_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITraceRelogger_Release(This) (This)->lpVtbl->Release(This)
/*** ITraceRelogger methods ***/
#define ITraceRelogger_AddLogfileTraceStream(This,LogfileName,UserContext,TraceHandle) (This)->lpVtbl->AddLogfileTraceStream(This,LogfileName,UserContext,TraceHandle)
#define ITraceRelogger_AddRealtimeTraceStream(This,LoggerName,UserContext,TraceHandle) (This)->lpVtbl->AddRealtimeTraceStream(This,LoggerName,UserContext,TraceHandle)
#define ITraceRelogger_RegisterCallback(This,Callback) (This)->lpVtbl->RegisterCallback(This,Callback)
#define ITraceRelogger_Inject(This,Event) (This)->lpVtbl->Inject(This,Event)
#define ITraceRelogger_CreateEventInstance(This,TraceHandle,Flags,Event) (This)->lpVtbl->CreateEventInstance(This,TraceHandle,Flags,Event)
#define ITraceRelogger_ProcessTrace(This) (This)->lpVtbl->ProcessTrace(This)
#define ITraceRelogger_SetOutputFilename(This,LogfileName) (This)->lpVtbl->SetOutputFilename(This,LogfileName)
#define ITraceRelogger_SetCompressionMode(This,CompressionMode) (This)->lpVtbl->SetCompressionMode(This,CompressionMode)
#define ITraceRelogger_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static inline HRESULT ITraceRelogger_QueryInterface(ITraceRelogger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITraceRelogger_AddRef(ITraceRelogger* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITraceRelogger_Release(ITraceRelogger* This) {
    return This->lpVtbl->Release(This);
}
/*** ITraceRelogger methods ***/
static inline HRESULT ITraceRelogger_AddLogfileTraceStream(ITraceRelogger* This,BSTR LogfileName,void *UserContext,TRACEHANDLE *TraceHandle) {
    return This->lpVtbl->AddLogfileTraceStream(This,LogfileName,UserContext,TraceHandle);
}
static inline HRESULT ITraceRelogger_AddRealtimeTraceStream(ITraceRelogger* This,BSTR LoggerName,void *UserContext,TRACEHANDLE *TraceHandle) {
    return This->lpVtbl->AddRealtimeTraceStream(This,LoggerName,UserContext,TraceHandle);
}
static inline HRESULT ITraceRelogger_RegisterCallback(ITraceRelogger* This,ITraceEventCallback *Callback) {
    return This->lpVtbl->RegisterCallback(This,Callback);
}
static inline HRESULT ITraceRelogger_Inject(ITraceRelogger* This,ITraceEvent *Event) {
    return This->lpVtbl->Inject(This,Event);
}
static inline HRESULT ITraceRelogger_CreateEventInstance(ITraceRelogger* This,TRACEHANDLE TraceHandle,ULONG Flags,ITraceEvent **Event) {
    return This->lpVtbl->CreateEventInstance(This,TraceHandle,Flags,Event);
}
static inline HRESULT ITraceRelogger_ProcessTrace(ITraceRelogger* This) {
    return This->lpVtbl->ProcessTrace(This);
}
static inline HRESULT ITraceRelogger_SetOutputFilename(ITraceRelogger* This,BSTR LogfileName) {
    return This->lpVtbl->SetOutputFilename(This,LogfileName);
}
static inline HRESULT ITraceRelogger_SetCompressionMode(ITraceRelogger* This,BOOLEAN CompressionMode) {
    return This->lpVtbl->SetCompressionMode(This,CompressionMode);
}
static inline HRESULT ITraceRelogger_Cancel(ITraceRelogger* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif


#endif  /* __ITraceRelogger_INTERFACE_DEFINED__ */

/*****************************************************************************
 * CTraceRelogger coclass
 */

DEFINE_GUID(CLSID_CTraceRelogger, 0x7b40792d, 0x05ff, 0x44c4, 0x90,0x58, 0xf4,0x40,0xc7,0x1f,0x17,0xd4);

#ifdef __cplusplus
class DECLSPEC_UUID("7b40792d-05ff-44c4-9058-f440c71f17d4") CTraceRelogger;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CTraceRelogger, 0x7b40792d, 0x05ff, 0x44c4, 0x90,0x58, 0xf4,0x40,0xc7,0x1f,0x17,0xd4)
#endif
#endif

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __relogger_h__ */
