diff --git a/mingw-w64-headers/include/rtworkq.h b/mingw-w64-headers/include/rtworkq.h
new file mode 100644
index 0000000..1512eb6
--- /dev/null
+++ b/mingw-w64-headers/include/rtworkq.h
@@ -0,0 +1,428 @@
+/*** Autogenerated by WIDL 6.3 from include/rtworkq.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 __rtworkq_h__
+#define __rtworkq_h__
+
+/* Forward declarations */
+
+#ifndef __IRtwqAsyncResult_FWD_DEFINED__
+#define __IRtwqAsyncResult_FWD_DEFINED__
+typedef interface IRtwqAsyncResult IRtwqAsyncResult;
+#ifdef __cplusplus
+interface IRtwqAsyncResult;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IRtwqAsyncCallback_FWD_DEFINED__
+#define __IRtwqAsyncCallback_FWD_DEFINED__
+typedef interface IRtwqAsyncCallback IRtwqAsyncCallback;
+#ifdef __cplusplus
+interface IRtwqAsyncCallback;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IRtwqPlatformEvents_FWD_DEFINED__
+#define __IRtwqPlatformEvents_FWD_DEFINED__
+typedef interface IRtwqPlatformEvents IRtwqPlatformEvents;
+#ifdef __cplusplus
+interface IRtwqPlatformEvents;
+#endif /* __cplusplus */
+#endif
+
+/* Headers for imported files */
+
+#include <unknwn.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum __WIDL_rtworkq_generated_name_0000000C {
+    RTWQ_STANDARD_WORKQUEUE = 0,
+    RTWQ_WINDOW_WORKQUEUE = 1,
+    RTWQ_MULTITHREADED_WORKQUEUE = 2
+} RTWQ_WORKQUEUE_TYPE;
+typedef UINT64 RTWQWORKITEM_KEY;
+/*****************************************************************************
+ * IRtwqAsyncResult interface
+ */
+#ifndef __IRtwqAsyncResult_INTERFACE_DEFINED__
+#define __IRtwqAsyncResult_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IRtwqAsyncResult, 0xac6b7889, 0x0740, 0x4d51, 0x86,0x19, 0x90,0x59,0x94,0xa5,0x5c,0xc6);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ac6b7889-0740-4d51-8619-905994a55cc6")
+IRtwqAsyncResult : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetState(
+        IUnknown **state) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStatus(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetStatus(
+        HRESULT status) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetObject(
+        IUnknown **object) = 0;
+
+    virtual IUnknown * STDMETHODCALLTYPE GetStateNoAddRef(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IRtwqAsyncResult, 0xac6b7889, 0x0740, 0x4d51, 0x86,0x19, 0x90,0x59,0x94,0xa5,0x5c,0xc6)
+#endif
+#else
+typedef struct IRtwqAsyncResultVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IRtwqAsyncResult *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IRtwqAsyncResult *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IRtwqAsyncResult *This);
+
+    /*** IRtwqAsyncResult methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetState)(
+        IRtwqAsyncResult *This,
+        IUnknown **state);
+
+    HRESULT (STDMETHODCALLTYPE *GetStatus)(
+        IRtwqAsyncResult *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetStatus)(
+        IRtwqAsyncResult *This,
+        HRESULT status);
+
+    HRESULT (STDMETHODCALLTYPE *GetObject)(
+        IRtwqAsyncResult *This,
+        IUnknown **object);
+
+    IUnknown * (STDMETHODCALLTYPE *GetStateNoAddRef)(
+        IRtwqAsyncResult *This);
+
+    END_INTERFACE
+} IRtwqAsyncResultVtbl;
+
+interface IRtwqAsyncResult {
+    CONST_VTBL IRtwqAsyncResultVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IRtwqAsyncResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRtwqAsyncResult_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRtwqAsyncResult_Release(This) (This)->lpVtbl->Release(This)
+/*** IRtwqAsyncResult methods ***/
+#define IRtwqAsyncResult_GetState(This,state) (This)->lpVtbl->GetState(This,state)
+#define IRtwqAsyncResult_GetStatus(This) (This)->lpVtbl->GetStatus(This)
+#define IRtwqAsyncResult_SetStatus(This,status) (This)->lpVtbl->SetStatus(This,status)
+#define IRtwqAsyncResult_GetObject(This,object) (This)->lpVtbl->GetObject(This,object)
+#define IRtwqAsyncResult_GetStateNoAddRef(This) (This)->lpVtbl->GetStateNoAddRef(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IRtwqAsyncResult_QueryInterface(IRtwqAsyncResult* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IRtwqAsyncResult_AddRef(IRtwqAsyncResult* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IRtwqAsyncResult_Release(IRtwqAsyncResult* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRtwqAsyncResult methods ***/
+static FORCEINLINE HRESULT IRtwqAsyncResult_GetState(IRtwqAsyncResult* This,IUnknown **state) {
+    return This->lpVtbl->GetState(This,state);
+}
+static FORCEINLINE HRESULT IRtwqAsyncResult_GetStatus(IRtwqAsyncResult* This) {
+    return This->lpVtbl->GetStatus(This);
+}
+static FORCEINLINE HRESULT IRtwqAsyncResult_SetStatus(IRtwqAsyncResult* This,HRESULT status) {
+    return This->lpVtbl->SetStatus(This,status);
+}
+static FORCEINLINE HRESULT IRtwqAsyncResult_GetObject(IRtwqAsyncResult* This,IUnknown **object) {
+    return This->lpVtbl->GetObject(This,object);
+}
+static FORCEINLINE IUnknown * IRtwqAsyncResult_GetStateNoAddRef(IRtwqAsyncResult* This) {
+    return This->lpVtbl->GetStateNoAddRef(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IRtwqAsyncResult_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IRtwqAsyncCallback interface
+ */
+#ifndef __IRtwqAsyncCallback_INTERFACE_DEFINED__
+#define __IRtwqAsyncCallback_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IRtwqAsyncCallback, 0xa27003cf, 0x2354, 0x4f2a, 0x8d,0x6a, 0xab,0x7c,0xff,0x15,0x43,0x7e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a27003cf-2354-4f2a-8d6a-ab7cff15437e")
+IRtwqAsyncCallback : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetParameters(
+        DWORD *flags,
+        DWORD *queue) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Invoke(
+        IRtwqAsyncResult *result) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IRtwqAsyncCallback, 0xa27003cf, 0x2354, 0x4f2a, 0x8d,0x6a, 0xab,0x7c,0xff,0x15,0x43,0x7e)
+#endif
+#else
+typedef struct IRtwqAsyncCallbackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IRtwqAsyncCallback *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IRtwqAsyncCallback *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IRtwqAsyncCallback *This);
+
+    /*** IRtwqAsyncCallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetParameters)(
+        IRtwqAsyncCallback *This,
+        DWORD *flags,
+        DWORD *queue);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IRtwqAsyncCallback *This,
+        IRtwqAsyncResult *result);
+
+    END_INTERFACE
+} IRtwqAsyncCallbackVtbl;
+
+interface IRtwqAsyncCallback {
+    CONST_VTBL IRtwqAsyncCallbackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IRtwqAsyncCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRtwqAsyncCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRtwqAsyncCallback_Release(This) (This)->lpVtbl->Release(This)
+/*** IRtwqAsyncCallback methods ***/
+#define IRtwqAsyncCallback_GetParameters(This,flags,queue) (This)->lpVtbl->GetParameters(This,flags,queue)
+#define IRtwqAsyncCallback_Invoke(This,result) (This)->lpVtbl->Invoke(This,result)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IRtwqAsyncCallback_QueryInterface(IRtwqAsyncCallback* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IRtwqAsyncCallback_AddRef(IRtwqAsyncCallback* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IRtwqAsyncCallback_Release(IRtwqAsyncCallback* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRtwqAsyncCallback methods ***/
+static FORCEINLINE HRESULT IRtwqAsyncCallback_GetParameters(IRtwqAsyncCallback* This,DWORD *flags,DWORD *queue) {
+    return This->lpVtbl->GetParameters(This,flags,queue);
+}
+static FORCEINLINE HRESULT IRtwqAsyncCallback_Invoke(IRtwqAsyncCallback* This,IRtwqAsyncResult *result) {
+    return This->lpVtbl->Invoke(This,result);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IRtwqAsyncCallback_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IRtwqPlatformEvents interface
+ */
+#ifndef __IRtwqPlatformEvents_INTERFACE_DEFINED__
+#define __IRtwqPlatformEvents_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IRtwqPlatformEvents, 0x63d9255a, 0x7ff1, 0x4b61, 0x8f,0xaf, 0xed,0x64,0x60,0xda,0xcf,0x2b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("63d9255a-7ff1-4b61-8faf-ed6460dacf2b")
+IRtwqPlatformEvents : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE InitializationComplete(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ShutdownStart(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ShutdownComplete(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IRtwqPlatformEvents, 0x63d9255a, 0x7ff1, 0x4b61, 0x8f,0xaf, 0xed,0x64,0x60,0xda,0xcf,0x2b)
+#endif
+#else
+typedef struct IRtwqPlatformEventsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IRtwqPlatformEvents *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IRtwqPlatformEvents *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IRtwqPlatformEvents *This);
+
+    /*** IRtwqPlatformEvents methods ***/
+    HRESULT (STDMETHODCALLTYPE *InitializationComplete)(
+        IRtwqPlatformEvents *This);
+
+    HRESULT (STDMETHODCALLTYPE *ShutdownStart)(
+        IRtwqPlatformEvents *This);
+
+    HRESULT (STDMETHODCALLTYPE *ShutdownComplete)(
+        IRtwqPlatformEvents *This);
+
+    END_INTERFACE
+} IRtwqPlatformEventsVtbl;
+
+interface IRtwqPlatformEvents {
+    CONST_VTBL IRtwqPlatformEventsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IRtwqPlatformEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRtwqPlatformEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRtwqPlatformEvents_Release(This) (This)->lpVtbl->Release(This)
+/*** IRtwqPlatformEvents methods ***/
+#define IRtwqPlatformEvents_InitializationComplete(This) (This)->lpVtbl->InitializationComplete(This)
+#define IRtwqPlatformEvents_ShutdownStart(This) (This)->lpVtbl->ShutdownStart(This)
+#define IRtwqPlatformEvents_ShutdownComplete(This) (This)->lpVtbl->ShutdownComplete(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IRtwqPlatformEvents_QueryInterface(IRtwqPlatformEvents* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IRtwqPlatformEvents_AddRef(IRtwqPlatformEvents* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IRtwqPlatformEvents_Release(IRtwqPlatformEvents* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRtwqPlatformEvents methods ***/
+static FORCEINLINE HRESULT IRtwqPlatformEvents_InitializationComplete(IRtwqPlatformEvents* This) {
+    return This->lpVtbl->InitializationComplete(This);
+}
+static FORCEINLINE HRESULT IRtwqPlatformEvents_ShutdownStart(IRtwqPlatformEvents* This) {
+    return This->lpVtbl->ShutdownStart(This);
+}
+static FORCEINLINE HRESULT IRtwqPlatformEvents_ShutdownComplete(IRtwqPlatformEvents* This) {
+    return This->lpVtbl->ShutdownComplete(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IRtwqPlatformEvents_INTERFACE_DEFINED__ */
+
+#define RTWQ_E_ERROR(x)            ((HRESULT)(0xc00d0000L+x))
+#define RTWQ_E_BUFFERTOOSMALL      RTWQ_E_ERROR(14001)
+#define RTWQ_E_NOT_INITIALIZED     RTWQ_E_ERROR(14006)
+#define RTWQ_E_UNEXPECTED          RTWQ_E_ERROR(14011)
+#define RTWQ_E_NOT_FOUND           RTWQ_E_ERROR(14037)
+#define RTWQ_E_OPERATION_CANCELLED RTWQ_E_ERROR(14061)
+#define RTWQ_E_INVALID_WORKQUEUE   RTWQ_E_ERROR(14079)
+#define RTWQ_E_SHUTDOWN            RTWQ_E_ERROR(16005)
+#ifdef __WINESRC__
+typedef struct tagRTWQASYNCRESULT
+{
+    IRtwqAsyncResult AsyncResult;
+#else
+typedef struct tagRTWQASYNCRESULT : public IRtwqAsyncResult {
+#endif
+    OVERLAPPED overlapped;
+    IRtwqAsyncCallback *pCallback;
+    HRESULT hrStatusResult;
+    DWORD dwBytesTransferred;
+    HANDLE hEvent;
+} RTWQASYNCRESULT;
+typedef void (WINAPI *RTWQPERIODICCALLBACK)(IUnknown *context);
+HRESULT WINAPI RtwqAddPeriodicCallback(RTWQPERIODICCALLBACK callback, IUnknown *context, DWORD *key);
+HRESULT WINAPI RtwqAllocateSerialWorkQueue(DWORD target_queue, DWORD *queue);
+HRESULT WINAPI RtwqAllocateWorkQueue(RTWQ_WORKQUEUE_TYPE queue_type, DWORD *queue);
+HRESULT WINAPI RtwqBeginRegisterWorkQueueWithMMCSS(DWORD queue, const WCHAR *mmcss_class, DWORD taskid, LONG priority, IRtwqAsyncCallback *callback, IUnknown *state);
+HRESULT WINAPI RtwqBeginUnregisterWorkQueueWithMMCSS(DWORD queue, IRtwqAsyncCallback *callback, IUnknown *state);
+HRESULT WINAPI RtwqCancelDeadline(HANDLE request);
+HRESULT WINAPI RtwqCancelWorkItem(RTWQWORKITEM_KEY key);
+HRESULT WINAPI RtwqCreateAsyncResult(IUnknown *object, IRtwqAsyncCallback *callback, IUnknown *state, IRtwqAsyncResult **result);
+HRESULT WINAPI RtwqEndRegisterWorkQueueWithMMCSS(IRtwqAsyncResult *result, DWORD *taskid);
+HRESULT WINAPI RtwqGetWorkQueueMMCSSClass(DWORD queue, WCHAR *mmcss_class, DWORD *length);
+HRESULT WINAPI RtwqGetWorkQueueMMCSSPriority(DWORD queue, LONG *priority);
+HRESULT WINAPI RtwqGetWorkQueueMMCSSTaskId(DWORD queue, DWORD *taskid);
+HRESULT WINAPI RtwqInvokeCallback(IRtwqAsyncResult *result);
+HRESULT WINAPI RtwqJoinWorkQueue(DWORD queue, HANDLE hFile, HANDLE *cookie);
+HRESULT WINAPI RtwqLockPlatform(void);
+HRESULT WINAPI RtwqLockSharedWorkQueue(const WCHAR *usageclass, LONG priority, DWORD *taskid, DWORD *queue);
+HRESULT WINAPI RtwqLockWorkQueue(DWORD queue);
+HRESULT WINAPI RtwqPutWaitingWorkItem(HANDLE event, LONG priority, IRtwqAsyncResult *result, RTWQWORKITEM_KEY *key);
+HRESULT WINAPI RtwqPutWorkItem(DWORD queue, LONG priority, IRtwqAsyncResult *result);
+HRESULT WINAPI RtwqRegisterPlatformEvents(IRtwqPlatformEvents *events);
+HRESULT WINAPI RtwqRegisterPlatformWithMMCSS(const WCHAR *mmcss_class, DWORD *taskid, LONG priority);
+HRESULT WINAPI RtwqRemovePeriodicCallback(DWORD key);
+HRESULT WINAPI RtwqScheduleWorkItem(IRtwqAsyncResult *result, INT64 timeout, RTWQWORKITEM_KEY *key);
+HRESULT WINAPI RtwqSetDeadline(DWORD queue_id, LONGLONG deadline, HANDLE *request);
+HRESULT WINAPI RtwqSetDeadline2(DWORD queue_id, LONGLONG deadline, LONGLONG predeadline, HANDLE *request);
+HRESULT WINAPI RtwqSetLongRunning(DWORD queue_id, WINBOOL enable);
+HRESULT WINAPI RtwqShutdown(void);
+HRESULT WINAPI RtwqStartup(void);
+HRESULT WINAPI RtwqUnjoinWorkQueue(DWORD queue, HANDLE cookie);
+HRESULT WINAPI RtwqUnlockPlatform(void);
+HRESULT WINAPI RtwqUnlockWorkQueue(DWORD queue);
+HRESULT WINAPI RtwqUnregisterPlatformEvents(IRtwqPlatformEvents *events);
+HRESULT WINAPI RtwqUnregisterPlatformFromMMCSS(void);
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __rtworkq_h__ */
diff --git a/mingw-w64-headers/include/windows.media.speechsynthesis.h b/mingw-w64-headers/include/windows.media.speechsynthesis.h
new file mode 100644
index 0000000..c2df179
--- /dev/null
+++ b/mingw-w64-headers/include/windows.media.speechsynthesis.h
@@ -0,0 +1,1067 @@
+/*** Autogenerated by WIDL 6.3 from include/windows.media.speechsynthesis.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_media_speechsynthesis_h__
+#define __windows_media_speechsynthesis_h__
+
+/* Forward declarations */
+
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation ABI::Windows::Media::SpeechSynthesis::IVoiceInformation
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                interface IVoiceInformation;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic ABI::Windows::Media::SpeechSynthesis::IInstalledVoicesStatic
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                interface IInstalledVoicesStatic;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceInformation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceInformation_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                class VoiceInformation;
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceInformation __x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceInformation;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceInformation_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CSpeechSynthesizer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CSpeechSynthesizer_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                class SpeechSynthesizer;
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CMedia_CSpeechSynthesis_CSpeechSynthesizer __x_ABI_CWindows_CMedia_CSpeechSynthesis_CSpeechSynthesizer;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CSpeechSynthesizer_FWD_DEFINED__ */
+
+#ifndef ____FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+#define ____FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+typedef interface __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation;
+#ifdef __cplusplus
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+#define ____FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+typedef interface __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation;
+#ifdef __cplusplus
+#define __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+#define ____FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+typedef interface __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation;
+#ifdef __cplusplus
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* >
+#endif /* __cplusplus */
+#endif
+
+/* Headers for imported files */
+
+#include <inspectable.h>
+#include <windows.foundation.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef ____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CIClosable __x_ABI_CWindows_CFoundation_CIClosable;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CFoundation_CIClosable ABI::Windows::Foundation::IClosable
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface IClosable;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic ABI::Windows::Media::SpeechSynthesis::IInstalledVoicesStatic
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                interface IInstalledVoicesStatic;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic2 __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic2 ABI::Windows::Media::SpeechSynthesis::IInstalledVoicesStatic2
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                interface IInstalledVoicesStatic2;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer __x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer ABI::Windows::Media::SpeechSynthesis::ISpeechSynthesizer
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                interface ISpeechSynthesizer;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer2 __x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CISpeechSynthesizer2 ABI::Windows::Media::SpeechSynthesis::ISpeechSynthesizer2
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                interface ISpeechSynthesizer2;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation ABI::Windows::Media::SpeechSynthesis::IVoiceInformation
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                interface IVoiceInformation;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+#define ____FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+typedef interface __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation;
+#ifdef __cplusplus
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+#define ____FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+typedef interface __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation;
+#ifdef __cplusplus
+#define __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+#define ____FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_FWD_DEFINED__
+typedef interface __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation;
+#ifdef __cplusplus
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* >
+#endif /* __cplusplus */
+#endif
+
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                enum VoiceGender {
+                    VoiceGender_Male = 0,
+                    VoiceGender_Female = 1
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceGender {
+    VoiceGender_Male = 0,
+    VoiceGender_Female = 1
+};
+#ifdef WIDL_using_Windows_Media_SpeechSynthesis
+#define VoiceGender __x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceGender
+#endif /* WIDL_using_Windows_Media_SpeechSynthesis */
+#endif
+
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+/*****************************************************************************
+ * IVoiceInformation interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation, 0xb127d6a4, 0x1291, 0x4604, 0xaa,0x9c, 0x83,0x13,0x40,0x83,0x35,0x2c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                MIDL_INTERFACE("b127d6a4-1291-4604-aa9c-83134083352c")
+                IVoiceInformation : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
+                        HSTRING *value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_Id(
+                        HSTRING *value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_Language(
+                        HSTRING *value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_Description(
+                        HSTRING *value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_Gender(
+                        enum VoiceGender *value) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation, 0xb127d6a4, 0x1291, 0x4604, 0xaa,0x9c, 0x83,0x13,0x40,0x83,0x35,0x2c)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This,
+        TrustLevel *trustLevel);
+
+    /*** IVoiceInformation methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Language)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Gender)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *This,
+        enum __x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceGender *value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformationVtbl;
+
+interface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation {
+    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IVoiceInformation methods ***/
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Language(This,value) (This)->lpVtbl->get_Language(This,value)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Description(This,value) (This)->lpVtbl->get_Description(This,value)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Gender(This,value) (This)->lpVtbl->get_Gender(This,value)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_AddRef(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_Release(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_GetIids(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IVoiceInformation methods ***/
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_DisplayName(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This,HSTRING *value) {
+    return This->lpVtbl->get_DisplayName(This,value);
+}
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Id(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This,HSTRING *value) {
+    return This->lpVtbl->get_Id(This,value);
+}
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Language(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This,HSTRING *value) {
+    return This->lpVtbl->get_Language(This,value);
+}
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Description(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This,HSTRING *value) {
+    return This->lpVtbl->get_Description(This,value);
+}
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Gender(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation* This,enum __x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceGender *value) {
+    return This->lpVtbl->get_Gender(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Media_SpeechSynthesis
+#define IID_IVoiceInformation IID___x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation
+#define IVoiceInformationVtbl __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformationVtbl
+#define IVoiceInformation __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation
+#define IVoiceInformation_QueryInterface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_QueryInterface
+#define IVoiceInformation_AddRef __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_AddRef
+#define IVoiceInformation_Release __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_Release
+#define IVoiceInformation_GetIids __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_GetIids
+#define IVoiceInformation_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_GetRuntimeClassName
+#define IVoiceInformation_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_GetTrustLevel
+#define IVoiceInformation_get_DisplayName __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_DisplayName
+#define IVoiceInformation_get_Id __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Id
+#define IVoiceInformation_get_Language __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Language
+#define IVoiceInformation_get_Description __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Description
+#define IVoiceInformation_get_Gender __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_get_Gender
+#endif /* WIDL_using_Windows_Media_SpeechSynthesis */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IInstalledVoicesStatic interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic, 0x7d526ecc, 0x7533, 0x4c3f, 0x85,0xbe, 0x88,0x8c,0x2b,0xae,0xeb,0xdc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            namespace SpeechSynthesis {
+                MIDL_INTERFACE("7d526ecc-7533-4c3f-85be-888c2baeebdc")
+                IInstalledVoicesStatic : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE get_AllVoices(
+                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > **value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_DefaultVoice(
+                        IVoiceInformation **value) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic, 0x7d526ecc, 0x7533, 0x4c3f, 0x85,0xbe, 0x88,0x8c,0x2b,0xae,0xeb,0xdc)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStaticVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic *This,
+        TrustLevel *trustLevel);
+
+    /*** IInstalledVoicesStatic methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_AllVoices)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic *This,
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_DefaultVoice)(
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic *This,
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStaticVtbl;
+
+interface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic {
+    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStaticVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IInstalledVoicesStatic methods ***/
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_get_AllVoices(This,value) (This)->lpVtbl->get_AllVoices(This,value)
+#define __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_get_DefaultVoice(This,value) (This)->lpVtbl->get_DefaultVoice(This,value)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_AddRef(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_Release(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_GetIids(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IInstalledVoicesStatic methods ***/
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_get_AllVoices(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic* This,__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation **value) {
+    return This->lpVtbl->get_AllVoices(This,value);
+}
+static FORCEINLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_get_DefaultVoice(__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic* This,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **value) {
+    return This->lpVtbl->get_DefaultVoice(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Media_SpeechSynthesis
+#define IID_IInstalledVoicesStatic IID___x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic
+#define IInstalledVoicesStaticVtbl __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStaticVtbl
+#define IInstalledVoicesStatic __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic
+#define IInstalledVoicesStatic_QueryInterface __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_QueryInterface
+#define IInstalledVoicesStatic_AddRef __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_AddRef
+#define IInstalledVoicesStatic_Release __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_Release
+#define IInstalledVoicesStatic_GetIids __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_GetIids
+#define IInstalledVoicesStatic_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_GetRuntimeClassName
+#define IInstalledVoicesStatic_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_GetTrustLevel
+#define IInstalledVoicesStatic_get_AllVoices __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_get_AllVoices
+#define IInstalledVoicesStatic_get_DefaultVoice __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_get_DefaultVoice
+#endif /* WIDL_using_Windows_Media_SpeechSynthesis */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CMedia_CSpeechSynthesis_CIInstalledVoicesStatic_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Media.SpeechSynthesis.VoiceInformation
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Media_SpeechSynthesis_VoiceInformation_DEFINED
+#define RUNTIMECLASS_Windows_Media_SpeechSynthesis_VoiceInformation_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Media_SpeechSynthesis_VoiceInformation[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','S','y','n','t','h','e','s','i','s','.','V','o','i','c','e','I','n','f','o','r','m','a','t','i','o','n',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechSynthesis_VoiceInformation[] = L"Windows.Media.SpeechSynthesis.VoiceInformation";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechSynthesis_VoiceInformation[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','S','y','n','t','h','e','s','i','s','.','V','o','i','c','e','I','n','f','o','r','m','a','t','i','o','n',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Media_SpeechSynthesis_VoiceInformation_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Media.SpeechSynthesis.SpeechSynthesizer
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Media_SpeechSynthesis_SpeechSynthesizer_DEFINED
+#define RUNTIMECLASS_Windows_Media_SpeechSynthesis_SpeechSynthesizer_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Media_SpeechSynthesis_SpeechSynthesizer[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','S','y','n','t','h','e','s','i','s','.','S','p','e','e','c','h','S','y','n','t','h','e','s','i','z','e','r',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechSynthesis_SpeechSynthesizer[] = L"Windows.Media.SpeechSynthesis.SpeechSynthesizer";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechSynthesis_SpeechSynthesizer[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','S','y','n','t','h','e','s','i','s','.','S','p','e','e','c','h','S','y','n','t','h','e','s','i','z','e','r',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Media_SpeechSynthesis_SpeechSynthesizer_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IIterator<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > interface
+ */
+#ifndef ____FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_INTERFACE_DEFINED__
+#define ____FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation, 0x12d40a27, 0xae8d, 0x5fb0, 0x8f,0xed, 0x00,0x16,0x5d,0x59,0xc6,0xab);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("12d40a27-ae8d-5fb0-8fed-00165d59c6ab")
+                IIterator<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechSynthesis::VoiceInformation*, ABI::Windows::Media::SpeechSynthesis::IVoiceInformation* > >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation, 0x12d40a27, 0xae8d, 0x5fb0, 0x8f,0xed, 0x00,0x16,0x5d,0x59,0xc6,0xab)
+#endif
+#else
+typedef struct __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        TrustLevel *trustLevel);
+
+    /*** IIterator<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Current)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        WINBOOL *value);
+
+    HRESULT (STDMETHODCALLTYPE *MoveNext)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        WINBOOL *value);
+
+    HRESULT (STDMETHODCALLTYPE *GetMany)(
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        UINT32 count,
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,
+        UINT32 *value);
+
+    END_INTERFACE
+} __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl;
+
+interface __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation {
+    CONST_VTBL __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IIterator<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(This,count,items,value) (This)->lpVtbl->GetMany(This,count,items,value)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_AddRef(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_Release(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetIids(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetRuntimeClassName(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetTrustLevel(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IIterator<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
+static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Current(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **value) {
+    return This->lpVtbl->get_Current(This,value);
+}
+static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_HasCurrent(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,WINBOOL *value) {
+    return This->lpVtbl->get_HasCurrent(This,value);
+}
+static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_MoveNext(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,WINBOOL *value) {
+    return This->lpVtbl->MoveNext(This,value);
+}
+static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,UINT32 count,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,UINT32 *value) {
+    return This->lpVtbl->GetMany(This,count,items,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IIterator_VoiceInformation IID___FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation
+#define IIterator_VoiceInformationVtbl __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl
+#define IIterator_VoiceInformation __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation
+#define IIterator_VoiceInformation_QueryInterface __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface
+#define IIterator_VoiceInformation_AddRef __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_AddRef
+#define IIterator_VoiceInformation_Release __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_Release
+#define IIterator_VoiceInformation_GetIids __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetIids
+#define IIterator_VoiceInformation_GetRuntimeClassName __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetRuntimeClassName
+#define IIterator_VoiceInformation_GetTrustLevel __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetTrustLevel
+#define IIterator_VoiceInformation_get_Current __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Current
+#define IIterator_VoiceInformation_get_HasCurrent __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_HasCurrent
+#define IIterator_VoiceInformation_MoveNext __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_MoveNext
+#define IIterator_VoiceInformation_GetMany __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IIterable<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > interface
+ */
+#ifndef ____FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_INTERFACE_DEFINED__
+#define ____FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation, 0x3c33bb52, 0xbd98, 0x5c8c, 0xad,0xee, 0xee,0x8d,0xa0,0x62,0x8e,0xfc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("3c33bb52-bd98-5c8c-adee-ee8da0628efc")
+                IIterable<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechSynthesis::VoiceInformation*, ABI::Windows::Media::SpeechSynthesis::IVoiceInformation* > >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation, 0x3c33bb52, 0xbd98, 0x5c8c, 0xad,0xee, 0xee,0x8d,0xa0,0x62,0x8e,0xfc)
+#endif
+#else
+typedef struct __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        TrustLevel *trustLevel);
+
+    /*** IIterable<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *First)(
+        __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation **value);
+
+    END_INTERFACE
+} __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl;
+
+interface __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation {
+    CONST_VTBL __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IIterable<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
+#define __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_First(This,value) (This)->lpVtbl->First(This,value)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface(__FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_AddRef(__FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_Release(__FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static FORCEINLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetIids(__FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static FORCEINLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetRuntimeClassName(__FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static FORCEINLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetTrustLevel(__FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IIterable<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
+static FORCEINLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_First(__FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation **value) {
+    return This->lpVtbl->First(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IIterable_VoiceInformation IID___FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation
+#define IIterable_VoiceInformationVtbl __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl
+#define IIterable_VoiceInformation __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation
+#define IIterable_VoiceInformation_QueryInterface __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface
+#define IIterable_VoiceInformation_AddRef __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_AddRef
+#define IIterable_VoiceInformation_Release __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_Release
+#define IIterable_VoiceInformation_GetIids __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetIids
+#define IIterable_VoiceInformation_GetRuntimeClassName __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetRuntimeClassName
+#define IIterable_VoiceInformation_GetTrustLevel __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetTrustLevel
+#define IIterable_VoiceInformation_First __FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_First
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIIterable_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > interface
+ */
+#ifndef ____FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_INTERFACE_DEFINED__
+#define ____FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation, 0xee8d63ce, 0x51ac, 0x5984, 0x89,0x1b, 0xd2,0x32,0xfa,0x7f,0x64,0x53);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("ee8d63ce-51ac-5984-891b-d232fa7f6453")
+                IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechSynthesis::VoiceInformation*, ABI::Windows::Media::SpeechSynthesis::IVoiceInformation* > >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation, 0xee8d63ce, 0x51ac, 0x5984, 0x89,0x1b, 0xd2,0x32,0xfa,0x7f,0x64,0x53)
+#endif
+#else
+typedef struct __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        TrustLevel *trustLevel);
+
+    /*** IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetAt)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        ULONG index,
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Size)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        ULONG *value);
+
+    HRESULT (STDMETHODCALLTYPE *IndexOf)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *element,
+        ULONG *index,
+        BOOLEAN *value);
+
+    HRESULT (STDMETHODCALLTYPE *GetMany)(
+        __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
+        ULONG start_index,
+        __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,
+        ULONG *value);
+
+    END_INTERFACE
+} __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl;
+
+interface __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation {
+    CONST_VTBL __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(This,start_index,items,value) (This)->lpVtbl->GetMany(This,start_index,items,value)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_AddRef(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_Release(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetIids(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetRuntimeClassName(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetTrustLevel(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetAt(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,ULONG index,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **value) {
+    return This->lpVtbl->GetAt(This,index,value);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Size(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,ULONG *value) {
+    return This->lpVtbl->get_Size(This,value);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_IndexOf(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *element,ULONG *index,BOOLEAN *value) {
+    return This->lpVtbl->IndexOf(This,element,index,value);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,ULONG start_index,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,ULONG *value) {
+    return This->lpVtbl->GetMany(This,start_index,items,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IVectorView_VoiceInformation IID___FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation
+#define IVectorView_VoiceInformationVtbl __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl
+#define IVectorView_VoiceInformation __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation
+#define IVectorView_VoiceInformation_QueryInterface __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface
+#define IVectorView_VoiceInformation_AddRef __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_AddRef
+#define IVectorView_VoiceInformation_Release __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_Release
+#define IVectorView_VoiceInformation_GetIids __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetIids
+#define IVectorView_VoiceInformation_GetRuntimeClassName __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetRuntimeClassName
+#define IVectorView_VoiceInformation_GetTrustLevel __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetTrustLevel
+#define IVectorView_VoiceInformation_GetAt __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetAt
+#define IVectorView_VoiceInformation_get_Size __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Size
+#define IVectorView_VoiceInformation_IndexOf __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_IndexOf
+#define IVectorView_VoiceInformation_GetMany __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_INTERFACE_DEFINED__ */
+
+/* Begin additional prototypes for all interfaces */
+
+ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
+unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
+unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
+void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __windows_media_speechsynthesis_h__ */
