/*** Autogenerated by WIDL 6.0-rc1 from include/windows.system.threading.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 __windows_system_threading_h__
#define __windows_system_threading_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface TimerElapsedHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface TimerDestroyedHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface WorkItemHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface IThreadPoolStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface IThreadPoolTimer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface IThreadPoolTimerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <windows.foundation.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIAsyncAction __x_ABI_CWindows_CFoundation_CIAsyncAction;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IAsyncAction;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            struct TimeSpan;
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CFoundation_CTimeSpan;
#endif

#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                enum WorkItemPriority;
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority;
#endif

#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                enum WorkItemOptions;
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemOptions;
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface TimerElapsedHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface TimerDestroyedHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface WorkItemHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface IThreadPoolStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface IThreadPoolTimer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics;
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                interface IThreadPoolTimerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * TimerElapsedHandler interface
 *
 */
#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler, 0xfaaea667, 0xfbeb, 0x49cb, 0xad,0xb2, 0x71,0x18,0x4c,0x55,0x6e,0x43);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                MIDL_INTERFACE("faaea667-fbeb-49cb-adb2-71184c556e43")
                TimerElapsedHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        IThreadPoolTimer *timer) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ABI::Windows::System::Threading::TimerElapsedHandler, 0xfaaea667, 0xfbeb, 0x49cb, 0xad,0xb2, 0x71,0x18,0x4c,0x55,0x6e,0x43)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** TimerElapsedHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *This,
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *timer);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandlerVtbl;

interface __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler {
    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_Release(This) (This)->lpVtbl->Release(This)
/*** TimerElapsedHandler methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_Invoke(This,timer) (This)->lpVtbl->Invoke(This,timer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_AddRef(__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_Release(__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** TimerElapsedHandler methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_Invoke(__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler* This,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *timer) {
    return This->lpVtbl->Invoke(This,timer);
}
#endif
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * TimerDestroyedHandler interface
 *
 */
#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler, 0x34ed19fa, 0x8384, 0x4eb9, 0x82,0x09, 0xfb,0x50,0x94,0xee,0xec,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                MIDL_INTERFACE("34ed19fa-8384-4eb9-8209-fb5094eeec35")
                TimerDestroyedHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        IThreadPoolTimer *timer) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ABI::Windows::System::Threading::TimerDestroyedHandler, 0x34ed19fa, 0x8384, 0x4eb9, 0x82,0x09, 0xfb,0x50,0x94,0xee,0xec,0x35)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** TimerDestroyedHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *This,
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *timer);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandlerVtbl;

interface __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler {
    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_Release(This) (This)->lpVtbl->Release(This)
/*** TimerDestroyedHandler methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_Invoke(This,timer) (This)->lpVtbl->Invoke(This,timer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_AddRef(__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_Release(__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** TimerDestroyedHandler methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_Invoke(__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler* This,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *timer) {
    return This->lpVtbl->Invoke(This,timer);
}
#endif
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * WorkItemHandler interface
 *
 */
#ifndef ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler, 0x1d1a8b8b, 0xfa66, 0x414f, 0x9c,0xbd, 0xb6,0x5f,0xc9,0x9d,0x17,0xfa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                MIDL_INTERFACE("1d1a8b8b-fa66-414f-9cbd-b65fc99d17fa")
                WorkItemHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        IAsyncAction *operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ABI::Windows::System::Threading::WorkItemHandler, 0x1d1a8b8b, 0xfa66, 0x414f, 0x9c,0xbd, 0xb6,0x5f,0xc9,0x9d,0x17,0xfa)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** WorkItemHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction *operation);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandlerVtbl;

interface __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler {
    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_Release(This) (This)->lpVtbl->Release(This)
/*** WorkItemHandler methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_Invoke(This,operation) (This)->lpVtbl->Invoke(This,operation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_AddRef(__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_Release(__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** WorkItemHandler methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_Invoke(__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler* This,__x_ABI_CWindows_CFoundation_CIAsyncAction *operation) {
    return This->lpVtbl->Invoke(This,operation);
}
#endif
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IThreadPoolStatics interface
 *
 */
#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics, 0xb6bf67dd, 0x84bd, 0x44f8, 0xac,0x1c, 0x93,0xeb,0xcb,0x9d,0xba,0x91);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                MIDL_INTERFACE("b6bf67dd-84bd-44f8-ac1c-93ebcb9dba91")
                IThreadPoolStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE RunAsync(
                        WorkItemHandler *handler,
                        IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RunWithPriorityAsync(
                        WorkItemHandler *handler,
                        enum WorkItemPriority priority,
                        IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RunWithPriorityAndOptionsAsync(
                        WorkItemHandler *handler,
                        enum WorkItemPriority priority,
                        enum WorkItemOptions options,
                        IAsyncAction **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ABI::Windows::System::Threading::IThreadPoolStatics, 0xb6bf67dd, 0x84bd, 0x44f8, 0xac,0x1c, 0x93,0xeb,0xcb,0x9d,0xba,0x91)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
        TrustLevel *trustLevel);

    /*** IThreadPoolStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *RunAsync)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *RunWithPriorityAsync)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,
        enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority priority,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *RunWithPriorityAndOptionsAsync)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,
        enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority priority,
        enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemOptions options,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStaticsVtbl;

interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics {
    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IThreadPoolStatics methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunAsync(This,handler,operation) (This)->lpVtbl->RunAsync(This,handler,operation)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunWithPriorityAsync(This,handler,priority,operation) (This)->lpVtbl->RunWithPriorityAsync(This,handler,priority,operation)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunWithPriorityAndOptionsAsync(This,handler,priority,options,operation) (This)->lpVtbl->RunWithPriorityAndOptionsAsync(This,handler,priority,options,operation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_AddRef(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_Release(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetIids(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetTrustLevel(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IThreadPoolStatics methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunAsync(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->RunAsync(This,handler,operation);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunWithPriorityAsync(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority priority,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->RunWithPriorityAsync(This,handler,priority,operation);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunWithPriorityAndOptionsAsync(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority priority,enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemOptions options,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->RunWithPriorityAndOptionsAsync(This,handler,priority,options,operation);
}
#endif
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IThreadPoolTimer interface
 *
 */
#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer, 0x594ebe78, 0x55ea, 0x4a88, 0xa5,0x0d, 0x34,0x02,0xae,0x1f,0x9c,0xf2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                MIDL_INTERFACE("594ebe78-55ea-4a88-a50d-3402ae1f9cf2")
                IThreadPoolTimer : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Period(
                        struct TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Delay(
                        struct TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Cancel(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ABI::Windows::System::Threading::IThreadPoolTimer, 0x594ebe78, 0x55ea, 0x4a88, 0xa5,0x0d, 0x34,0x02,0xae,0x1f,0x9c,0xf2)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
        TrustLevel *trustLevel);

    /*** IThreadPoolTimer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Period)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *get_Delay)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan *value);

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

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerVtbl;

interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer {
    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IThreadPoolTimer methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_get_Period(This,value) (This)->lpVtbl->get_Period(This,value)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_get_Delay(This,value) (This)->lpVtbl->get_Delay(This,value)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_AddRef(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_Release(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetIids(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetTrustLevel(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IThreadPoolTimer methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_get_Period(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan *value) {
    return This->lpVtbl->get_Period(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_get_Delay(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan *value) {
    return This->lpVtbl->get_Delay(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_Cancel(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IThreadPoolTimerStatics interface
 *
 */
#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics, 0x1a8a9d02, 0xe482, 0x461b, 0xb8,0xc7, 0x8e,0xfa,0xd1,0xcc,0xe5,0x90);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Threading {
                MIDL_INTERFACE("1a8a9d02-e482-461b-b8c7-8efad1cce590")
                IThreadPoolTimerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreatePeriodicTimer(
                        TimerElapsedHandler *handler,
                        struct TimeSpan period,
                        IThreadPoolTimer **timer) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTimer(
                        TimerElapsedHandler *handler,
                        struct TimeSpan delay,
                        IThreadPoolTimer **timer) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreatePeriodicTimerWithCompletion(
                        TimerElapsedHandler *handler,
                        struct TimeSpan period,
                        TimerDestroyedHandler *destroyed,
                        IThreadPoolTimer **timer) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTimerWithCompletion(
                        TimerElapsedHandler *handler,
                        struct TimeSpan delay,
                        TimerDestroyedHandler *destroyed,
                        IThreadPoolTimer **timer) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ABI::Windows::System::Threading::IThreadPoolTimerStatics, 0x1a8a9d02, 0xe482, 0x461b, 0xb8,0xc7, 0x8e,0xfa,0xd1,0xcc,0xe5,0x90)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
        TrustLevel *trustLevel);

    /*** IThreadPoolTimerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePeriodicTimer)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,
        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan period,
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer);

    HRESULT (STDMETHODCALLTYPE *CreateTimer)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,
        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan delay,
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer);

    HRESULT (STDMETHODCALLTYPE *CreatePeriodicTimerWithCompletion)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,
        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan period,
        __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *destroyed,
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer);

    HRESULT (STDMETHODCALLTYPE *CreateTimerWithCompletion)(
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,
        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan delay,
        __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *destroyed,
        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStaticsVtbl;

interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics {
    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IThreadPoolTimerStatics methods ***/
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreatePeriodicTimer(This,handler,period,timer) (This)->lpVtbl->CreatePeriodicTimer(This,handler,period,timer)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreateTimer(This,handler,delay,timer) (This)->lpVtbl->CreateTimer(This,handler,delay,timer)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreatePeriodicTimerWithCompletion(This,handler,period,destroyed,timer) (This)->lpVtbl->CreatePeriodicTimerWithCompletion(This,handler,period,destroyed,timer)
#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreateTimerWithCompletion(This,handler,delay,destroyed,timer) (This)->lpVtbl->CreateTimerWithCompletion(This,handler,delay,destroyed,timer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_AddRef(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_Release(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetIids(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetTrustLevel(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IThreadPoolTimerStatics methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreatePeriodicTimer(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan period,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer) {
    return This->lpVtbl->CreatePeriodicTimer(This,handler,period,timer);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreateTimer(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan delay,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer) {
    return This->lpVtbl->CreateTimer(This,handler,delay,timer);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreatePeriodicTimerWithCompletion(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan period,__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *destroyed,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer) {
    return This->lpVtbl->CreatePeriodicTimerWithCompletion(This,handler,period,destroyed,timer);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreateTimerWithCompletion(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan delay,__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *destroyed,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer) {
    return This->lpVtbl->CreateTimerWithCompletion(This,handler,delay,destroyed,timer);
}
#endif
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_system_threading_h__ */
