/*** Autogenerated by WIDL 6.4 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__ */
