/*** Autogenerated by WIDL 7.7 from include/windows.globalization.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_globalization_h__
#define __windows_globalization_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage __x_ABI_CWindows_CGlobalization_CILanguage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage ABI::Windows::Globalization::ILanguage
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage2 __x_ABI_CWindows_CGlobalization_CILanguage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage2 ABI::Windows::Globalization::ILanguage2
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage3 __x_ABI_CWindows_CGlobalization_CILanguage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage3 ABI::Windows::Globalization::ILanguage3
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags ABI::Windows::Globalization::ILanguageExtensionSubtags
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageExtensionSubtags;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageFactory __x_ABI_CWindows_CGlobalization_CILanguageFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory ABI::Windows::Globalization::ILanguageFactory
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics __x_ABI_CWindows_CGlobalization_CILanguageStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics ABI::Windows::Globalization::ILanguageStatics
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics2 __x_ABI_CWindows_CGlobalization_CILanguageStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2 ABI::Windows::Globalization::ILanguageStatics2
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics3 __x_ABI_CWindows_CGlobalization_CILanguageStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3 ABI::Windows::Globalization::ILanguageStatics3
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CLanguage_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CLanguage_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Globalization {
            class Language;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGlobalization_CLanguage __x_ABI_CWindows_CGlobalization_CLanguage;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGlobalization_CLanguage_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGlobalization__CLanguage __FIIterable_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGlobalization__CLanguage __FIIterator_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGlobalization__CLanguage __FIVectorView_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIVector_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGlobalization__CLanguage __FIVector_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGlobalization_CDayOfWeek __x_ABI_CWindows_CGlobalization_CDayOfWeek;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage __x_ABI_CWindows_CGlobalization_CILanguage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage ABI::Windows::Globalization::ILanguage
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage2 __x_ABI_CWindows_CGlobalization_CILanguage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage2 ABI::Windows::Globalization::ILanguage2
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage3 __x_ABI_CWindows_CGlobalization_CILanguage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage3 ABI::Windows::Globalization::ILanguage3
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags ABI::Windows::Globalization::ILanguageExtensionSubtags
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageExtensionSubtags;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageFactory __x_ABI_CWindows_CGlobalization_CILanguageFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory ABI::Windows::Globalization::ILanguageFactory
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics __x_ABI_CWindows_CGlobalization_CILanguageStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics ABI::Windows::Globalization::ILanguageStatics
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics2 __x_ABI_CWindows_CGlobalization_CILanguageStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2 ABI::Windows::Globalization::ILanguageStatics2
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics3 __x_ABI_CWindows_CGlobalization_CILanguageStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3 ABI::Windows::Globalization::ILanguageStatics3
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGlobalization__CLanguage __FIIterable_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGlobalization__CLanguage __FIIterator_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGlobalization__CLanguage __FIVectorView_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIVector_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGlobalization__CLanguage __FIVector_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            enum DayOfWeek {
                DayOfWeek_Sunday = 0,
                DayOfWeek_Monday = 1,
                DayOfWeek_Tuesday = 2,
                DayOfWeek_Wednesday = 3,
                DayOfWeek_Thursday = 4,
                DayOfWeek_Friday = 5,
                DayOfWeek_Saturday = 6
            };
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGlobalization_CDayOfWeek {
    DayOfWeek_Sunday = 0,
    DayOfWeek_Monday = 1,
    DayOfWeek_Tuesday = 2,
    DayOfWeek_Wednesday = 3,
    DayOfWeek_Thursday = 4,
    DayOfWeek_Friday = 5,
    DayOfWeek_Saturday = 6
};
#ifdef WIDL_using_Windows_Globalization
#define DayOfWeek __x_ABI_CWindows_CGlobalization_CDayOfWeek
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            enum LanguageLayoutDirection {
                LanguageLayoutDirection_Ltr = 0,
                LanguageLayoutDirection_Rtl = 1,
                LanguageLayoutDirection_TtbLtr = 2,
                LanguageLayoutDirection_TtbRtl = 3
            };
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection {
    LanguageLayoutDirection_Ltr = 0,
    LanguageLayoutDirection_Rtl = 1,
    LanguageLayoutDirection_TtbLtr = 2,
    LanguageLayoutDirection_TtbRtl = 3
};
#ifdef WIDL_using_Windows_Globalization
#define LanguageLayoutDirection __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */
/*****************************************************************************
 * ILanguage interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguage, 0xea79a752, 0xf7c2, 0x4265, 0xb1,0xbd, 0xc4,0xde,0xc4,0xe4,0xf0,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("ea79a752-f7c2-4265-b1bd-c4dec4e4f080")
            ILanguage : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_LanguageTag(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_NativeName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Script(
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguage, 0xea79a752, 0xf7c2, 0x4265, 0xb1,0xbd, 0xc4,0xde,0xc4,0xe4,0xf0,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LanguageTag)(
        __x_ABI_CWindows_CGlobalization_CILanguage *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CGlobalization_CILanguage *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_NativeName)(
        __x_ABI_CWindows_CGlobalization_CILanguage *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Script)(
        __x_ABI_CWindows_CGlobalization_CILanguage *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageVtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguage {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguage methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage_get_LanguageTag(This,value) (This)->lpVtbl->get_LanguageTag(This,value)
#define __x_ABI_CWindows_CGlobalization_CILanguage_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#define __x_ABI_CWindows_CGlobalization_CILanguage_get_NativeName(This,value) (This)->lpVtbl->get_NativeName(This,value)
#define __x_ABI_CWindows_CGlobalization_CILanguage_get_Script(This,value) (This)->lpVtbl->get_Script(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage_AddRef(__x_ABI_CWindows_CGlobalization_CILanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage_Release(__x_ABI_CWindows_CGlobalization_CILanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_GetIids(__x_ABI_CWindows_CGlobalization_CILanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguage methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_get_LanguageTag(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *value) {
    return This->lpVtbl->get_LanguageTag(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_get_DisplayName(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_get_NativeName(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *value) {
    return This->lpVtbl->get_NativeName(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_get_Script(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *value) {
    return This->lpVtbl->get_Script(This,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguage IID___x_ABI_CWindows_CGlobalization_CILanguage
#define ILanguageVtbl __x_ABI_CWindows_CGlobalization_CILanguageVtbl
#define ILanguage __x_ABI_CWindows_CGlobalization_CILanguage
#define ILanguage_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguage_QueryInterface
#define ILanguage_AddRef __x_ABI_CWindows_CGlobalization_CILanguage_AddRef
#define ILanguage_Release __x_ABI_CWindows_CGlobalization_CILanguage_Release
#define ILanguage_GetIids __x_ABI_CWindows_CGlobalization_CILanguage_GetIids
#define ILanguage_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguage_GetRuntimeClassName
#define ILanguage_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguage_GetTrustLevel
#define ILanguage_get_LanguageTag __x_ABI_CWindows_CGlobalization_CILanguage_get_LanguageTag
#define ILanguage_get_DisplayName __x_ABI_CWindows_CGlobalization_CILanguage_get_DisplayName
#define ILanguage_get_NativeName __x_ABI_CWindows_CGlobalization_CILanguage_get_NativeName
#define ILanguage_get_Script __x_ABI_CWindows_CGlobalization_CILanguage_get_Script
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguage_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguage2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguage2, 0x6a47e5b5, 0xd94d, 0x4886, 0xa4,0x04, 0xa5,0xa5,0xb9,0xd5,0xb4,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("6a47e5b5-d94d-4886-a404-a5a5b9d5b494")
            ILanguage2 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_LayoutDirection(
                    enum LanguageLayoutDirection *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguage2, 0x6a47e5b5, 0xd94d, 0x4886, 0xa4,0x04, 0xa5,0xa5,0xb9,0xd5,0xb4,0x94)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguage2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguage2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LayoutDirection)(
        __x_ABI_CWindows_CGlobalization_CILanguage2 *This,
        enum __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection *value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguage2Vtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguage2 {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguage2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguage2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguage2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguage2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguage2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguage2 methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage2_get_LayoutDirection(This,value) (This)->lpVtbl->get_LayoutDirection(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage2_AddRef(__x_ABI_CWindows_CGlobalization_CILanguage2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage2_Release(__x_ABI_CWindows_CGlobalization_CILanguage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_GetIids(__x_ABI_CWindows_CGlobalization_CILanguage2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguage2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguage2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguage2 methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_get_LayoutDirection(__x_ABI_CWindows_CGlobalization_CILanguage2* This,enum __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection *value) {
    return This->lpVtbl->get_LayoutDirection(This,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguage2 IID___x_ABI_CWindows_CGlobalization_CILanguage2
#define ILanguage2Vtbl __x_ABI_CWindows_CGlobalization_CILanguage2Vtbl
#define ILanguage2 __x_ABI_CWindows_CGlobalization_CILanguage2
#define ILanguage2_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguage2_QueryInterface
#define ILanguage2_AddRef __x_ABI_CWindows_CGlobalization_CILanguage2_AddRef
#define ILanguage2_Release __x_ABI_CWindows_CGlobalization_CILanguage2_Release
#define ILanguage2_GetIids __x_ABI_CWindows_CGlobalization_CILanguage2_GetIids
#define ILanguage2_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguage2_GetRuntimeClassName
#define ILanguage2_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguage2_GetTrustLevel
#define ILanguage2_get_LayoutDirection __x_ABI_CWindows_CGlobalization_CILanguage2_get_LayoutDirection
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguage2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * ILanguage3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguage3, 0xc6af3d10, 0x641a, 0x5ba4, 0xbb,0x43, 0x5e,0x12,0xae,0xd7,0x59,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("c6af3d10-641a-5ba4-bb43-5e12aed75954")
            ILanguage3 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_AbbreviatedName(
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguage3, 0xc6af3d10, 0x641a, 0x5ba4, 0xbb,0x43, 0x5e,0x12,0xae,0xd7,0x59,0x54)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguage3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguage3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AbbreviatedName)(
        __x_ABI_CWindows_CGlobalization_CILanguage3 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguage3Vtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguage3 {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguage3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguage3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguage3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguage3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguage3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguage3 methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage3_get_AbbreviatedName(This,value) (This)->lpVtbl->get_AbbreviatedName(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguage3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage3_AddRef(__x_ABI_CWindows_CGlobalization_CILanguage3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage3_Release(__x_ABI_CWindows_CGlobalization_CILanguage3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_GetIids(__x_ABI_CWindows_CGlobalization_CILanguage3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguage3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguage3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguage3 methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_get_AbbreviatedName(__x_ABI_CWindows_CGlobalization_CILanguage3* This,HSTRING *value) {
    return This->lpVtbl->get_AbbreviatedName(This,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguage3 IID___x_ABI_CWindows_CGlobalization_CILanguage3
#define ILanguage3Vtbl __x_ABI_CWindows_CGlobalization_CILanguage3Vtbl
#define ILanguage3 __x_ABI_CWindows_CGlobalization_CILanguage3
#define ILanguage3_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguage3_QueryInterface
#define ILanguage3_AddRef __x_ABI_CWindows_CGlobalization_CILanguage3_AddRef
#define ILanguage3_Release __x_ABI_CWindows_CGlobalization_CILanguage3_Release
#define ILanguage3_GetIids __x_ABI_CWindows_CGlobalization_CILanguage3_GetIids
#define ILanguage3_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguage3_GetRuntimeClassName
#define ILanguage3_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguage3_GetTrustLevel
#define ILanguage3_get_AbbreviatedName __x_ABI_CWindows_CGlobalization_CILanguage3_get_AbbreviatedName
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguage3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*****************************************************************************
 * ILanguageExtensionSubtags interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags, 0x7d7daf45, 0x368d, 0x4364, 0x85,0x2b, 0xde,0xc9,0x27,0x03,0x7b,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("7d7daf45-368d-4364-852b-dec927037b85")
            ILanguageExtensionSubtags : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetExtensionSubtags(
                    HSTRING tag,
                    ABI::Windows::Foundation::Collections::IVectorView<HSTRING > **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags, 0x7d7daf45, 0x368d, 0x4364, 0x85,0x2b, 0xde,0xc9,0x27,0x03,0x7b,0x85)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtagsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageExtensionSubtags methods ***/
    HRESULT (STDMETHODCALLTYPE *GetExtensionSubtags)(
        __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags *This,
        HSTRING tag,
        __FIVectorView_1_HSTRING **value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtagsVtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtagsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageExtensionSubtags methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetExtensionSubtags(This,tag,value) (This)->lpVtbl->GetExtensionSubtags(This,tag,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_Release(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageExtensionSubtags methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetExtensionSubtags(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,HSTRING tag,__FIVectorView_1_HSTRING **value) {
    return This->lpVtbl->GetExtensionSubtags(This,tag,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageExtensionSubtags IID___x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags
#define ILanguageExtensionSubtagsVtbl __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtagsVtbl
#define ILanguageExtensionSubtags __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags
#define ILanguageExtensionSubtags_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_QueryInterface
#define ILanguageExtensionSubtags_AddRef __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_AddRef
#define ILanguageExtensionSubtags_Release __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_Release
#define ILanguageExtensionSubtags_GetIids __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetIids
#define ILanguageExtensionSubtags_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetRuntimeClassName
#define ILanguageExtensionSubtags_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetTrustLevel
#define ILanguageExtensionSubtags_GetExtensionSubtags __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetExtensionSubtags
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguageFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageFactory, 0x9b0252ac, 0x0c27, 0x44f8, 0xb7,0x92, 0x97,0x93,0xfb,0x66,0xc6,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("9b0252ac-0c27-44f8-b792-9793fb66c63e")
            ILanguageFactory : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE CreateLanguage(
                    HSTRING tag,
                    ABI::Windows::Globalization::ILanguage **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageFactory, 0x9b0252ac, 0x0c27, 0x44f8, 0xb7,0x92, 0x97,0x93,0xfb,0x66,0xc6,0x3e)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLanguage)(
        __x_ABI_CWindows_CGlobalization_CILanguageFactory *This,
        HSTRING tag,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageFactoryVtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageFactory {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageFactory methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_CreateLanguage(This,tag,value) (This)->lpVtbl->CreateLanguage(This,tag,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageFactory_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageFactory_Release(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageFactory methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_CreateLanguage(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,HSTRING tag,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->CreateLanguage(This,tag,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageFactory IID___x_ABI_CWindows_CGlobalization_CILanguageFactory
#define ILanguageFactoryVtbl __x_ABI_CWindows_CGlobalization_CILanguageFactoryVtbl
#define ILanguageFactory __x_ABI_CWindows_CGlobalization_CILanguageFactory
#define ILanguageFactory_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageFactory_QueryInterface
#define ILanguageFactory_AddRef __x_ABI_CWindows_CGlobalization_CILanguageFactory_AddRef
#define ILanguageFactory_Release __x_ABI_CWindows_CGlobalization_CILanguageFactory_Release
#define ILanguageFactory_GetIids __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetIids
#define ILanguageFactory_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetRuntimeClassName
#define ILanguageFactory_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetTrustLevel
#define ILanguageFactory_CreateLanguage __x_ABI_CWindows_CGlobalization_CILanguageFactory_CreateLanguage
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguageStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageStatics, 0xb23cd557, 0x0865, 0x46d4, 0x89,0xb8, 0xd5,0x9b,0xe8,0x99,0x0f,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("b23cd557-0865-46d4-89b8-d59be8990f0d")
            ILanguageStatics : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE IsWellFormed(
                    HSTRING tag,
                    BOOLEAN *result) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_CurrentInputMethodLanguageTag(
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageStatics, 0xb23cd557, 0x0865, 0x46d4, 0x89,0xb8, 0xd5,0x9b,0xe8,0x99,0x0f,0x0d)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *IsWellFormed)(
        __x_ABI_CWindows_CGlobalization_CILanguageStatics *This,
        HSTRING tag,
        BOOLEAN *result);

    HRESULT (STDMETHODCALLTYPE *get_CurrentInputMethodLanguageTag)(
        __x_ABI_CWindows_CGlobalization_CILanguageStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageStaticsVtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageStatics {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageStatics methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_IsWellFormed(This,tag,result) (This)->lpVtbl->IsWellFormed(This,tag,result)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_get_CurrentInputMethodLanguageTag(This,value) (This)->lpVtbl->get_CurrentInputMethodLanguageTag(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics_Release(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageStatics methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_IsWellFormed(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,HSTRING tag,BOOLEAN *result) {
    return This->lpVtbl->IsWellFormed(This,tag,result);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_get_CurrentInputMethodLanguageTag(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,HSTRING *value) {
    return This->lpVtbl->get_CurrentInputMethodLanguageTag(This,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageStatics IID___x_ABI_CWindows_CGlobalization_CILanguageStatics
#define ILanguageStaticsVtbl __x_ABI_CWindows_CGlobalization_CILanguageStaticsVtbl
#define ILanguageStatics __x_ABI_CWindows_CGlobalization_CILanguageStatics
#define ILanguageStatics_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageStatics_QueryInterface
#define ILanguageStatics_AddRef __x_ABI_CWindows_CGlobalization_CILanguageStatics_AddRef
#define ILanguageStatics_Release __x_ABI_CWindows_CGlobalization_CILanguageStatics_Release
#define ILanguageStatics_GetIids __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetIids
#define ILanguageStatics_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetRuntimeClassName
#define ILanguageStatics_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetTrustLevel
#define ILanguageStatics_IsWellFormed __x_ABI_CWindows_CGlobalization_CILanguageStatics_IsWellFormed
#define ILanguageStatics_get_CurrentInputMethodLanguageTag __x_ABI_CWindows_CGlobalization_CILanguageStatics_get_CurrentInputMethodLanguageTag
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguageStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageStatics2, 0x30199f6e, 0x914b, 0x4b2a, 0x9d,0x6e, 0xe3,0xb0,0xe2,0x7d,0xbe,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("30199f6e-914b-4b2a-9d6e-e3b0e27dbe4f")
            ILanguageStatics2 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE TrySetInputMethodLanguageTag(
                    HSTRING tag,
                    BOOLEAN *result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageStatics2, 0x30199f6e, 0x914b, 0x4b2a, 0x9d,0x6e, 0xe3,0xb0,0xe2,0x7d,0xbe,0x4f)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *TrySetInputMethodLanguageTag)(
        __x_ABI_CWindows_CGlobalization_CILanguageStatics2 *This,
        HSTRING tag,
        BOOLEAN *result);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageStatics2Vtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageStatics2 {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageStatics2 methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_TrySetInputMethodLanguageTag(This,tag,result) (This)->lpVtbl->TrySetInputMethodLanguageTag(This,tag,result)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics2_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics2_Release(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageStatics2 methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_TrySetInputMethodLanguageTag(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,HSTRING tag,BOOLEAN *result) {
    return This->lpVtbl->TrySetInputMethodLanguageTag(This,tag,result);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageStatics2 IID___x_ABI_CWindows_CGlobalization_CILanguageStatics2
#define ILanguageStatics2Vtbl __x_ABI_CWindows_CGlobalization_CILanguageStatics2Vtbl
#define ILanguageStatics2 __x_ABI_CWindows_CGlobalization_CILanguageStatics2
#define ILanguageStatics2_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageStatics2_QueryInterface
#define ILanguageStatics2_AddRef __x_ABI_CWindows_CGlobalization_CILanguageStatics2_AddRef
#define ILanguageStatics2_Release __x_ABI_CWindows_CGlobalization_CILanguageStatics2_Release
#define ILanguageStatics2_GetIids __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetIids
#define ILanguageStatics2_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetRuntimeClassName
#define ILanguageStatics2_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetTrustLevel
#define ILanguageStatics2_TrySetInputMethodLanguageTag __x_ABI_CWindows_CGlobalization_CILanguageStatics2_TrySetInputMethodLanguageTag
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguageStatics3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageStatics3, 0xd15ecb5a, 0x71de, 0x5752, 0x95,0x42, 0xfa,0xc5,0xb4,0xf2,0x72,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("d15ecb5a-71de-5752-9542-fac5b4f27261")
            ILanguageStatics3 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetMuiCompatibleLanguageListFromLanguageTags(
                    ABI::Windows::Foundation::Collections::IIterable<HSTRING > *tags,
                    ABI::Windows::Foundation::Collections::IVector<HSTRING > **result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageStatics3, 0xd15ecb5a, 0x71de, 0x5752, 0x95,0x42, 0xfa,0xc5,0xb4,0xf2,0x72,0x61)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageStatics3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageStatics3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMuiCompatibleLanguageListFromLanguageTags)(
        __x_ABI_CWindows_CGlobalization_CILanguageStatics3 *This,
        __FIIterable_1_HSTRING *tags,
        __FIVector_1_HSTRING **result);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageStatics3Vtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageStatics3 {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageStatics3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageStatics3 methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetMuiCompatibleLanguageListFromLanguageTags(This,tags,result) (This)->lpVtbl->GetMuiCompatibleLanguageListFromLanguageTags(This,tags,result)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics3_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics3_Release(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageStatics3 methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetMuiCompatibleLanguageListFromLanguageTags(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,__FIIterable_1_HSTRING *tags,__FIVector_1_HSTRING **result) {
    return This->lpVtbl->GetMuiCompatibleLanguageListFromLanguageTags(This,tags,result);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageStatics3 IID___x_ABI_CWindows_CGlobalization_CILanguageStatics3
#define ILanguageStatics3Vtbl __x_ABI_CWindows_CGlobalization_CILanguageStatics3Vtbl
#define ILanguageStatics3 __x_ABI_CWindows_CGlobalization_CILanguageStatics3
#define ILanguageStatics3_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageStatics3_QueryInterface
#define ILanguageStatics3_AddRef __x_ABI_CWindows_CGlobalization_CILanguageStatics3_AddRef
#define ILanguageStatics3_Release __x_ABI_CWindows_CGlobalization_CILanguageStatics3_Release
#define ILanguageStatics3_GetIids __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetIids
#define ILanguageStatics3_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetRuntimeClassName
#define ILanguageStatics3_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetTrustLevel
#define ILanguageStatics3_GetMuiCompatibleLanguageListFromLanguageTags __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetMuiCompatibleLanguageListFromLanguageTags
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*
 * Class Windows.Globalization.Language
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Globalization_Language_DEFINED
#define RUNTIMECLASS_Windows_Globalization_Language_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Globalization_Language[] = {'W','i','n','d','o','w','s','.','G','l','o','b','a','l','i','z','a','t','i','o','n','.','L','a','n','g','u','a','g','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Globalization_Language[] = L"Windows.Globalization.Language";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Globalization_Language[] = {'W','i','n','d','o','w','s','.','G','l','o','b','a','l','i','z','a','t','i','o','n','.','L','a','n','g','u','a','g','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Globalization_Language_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Globalization::Language* > interface
 */
#ifndef ____FIIterable_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CGlobalization__CLanguage, 0x48409a10, 0x61b6, 0x5db1, 0xa6,0x9d, 0x8a,0xbc,0x46,0xac,0x60,0x8a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("48409a10-61b6-5db1-a69d-8abc46ac608a")
                IIterable<ABI::Windows::Globalization::Language* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Globalization::Language*, ABI::Windows::Globalization::ILanguage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CGlobalization__CLanguage, 0x48409a10, 0x61b6, 0x5db1, 0xa6,0x9d, 0x8a,0xbc,0x46,0xac,0x60,0x8a)
#endif
#else
typedef struct __FIIterable_1_Windows__CGlobalization__CLanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Globalization::Language* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CGlobalization__CLanguage *This,
        __FIIterator_1_Windows__CGlobalization__CLanguage **value);

    END_INTERFACE
} __FIIterable_1_Windows__CGlobalization__CLanguageVtbl;

interface __FIIterable_1_Windows__CGlobalization__CLanguage {
    CONST_VTBL __FIIterable_1_Windows__CGlobalization__CLanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CGlobalization__CLanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CGlobalization__CLanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CGlobalization__CLanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CGlobalization__CLanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CGlobalization__CLanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Globalization::Language* > methods ***/
#define __FIIterable_1_Windows__CGlobalization__CLanguage_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_QueryInterface(__FIIterable_1_Windows__CGlobalization__CLanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __FIIterable_1_Windows__CGlobalization__CLanguage_AddRef(__FIIterable_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __FIIterable_1_Windows__CGlobalization__CLanguage_Release(__FIIterable_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_GetIids(__FIIterable_1_Windows__CGlobalization__CLanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(__FIIterable_1_Windows__CGlobalization__CLanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_GetTrustLevel(__FIIterable_1_Windows__CGlobalization__CLanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Globalization::Language* > methods ***/
static FORCEINLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_First(__FIIterable_1_Windows__CGlobalization__CLanguage* This,__FIIterator_1_Windows__CGlobalization__CLanguage **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_Language IID___FIIterable_1_Windows__CGlobalization__CLanguage
#define IIterable_LanguageVtbl __FIIterable_1_Windows__CGlobalization__CLanguageVtbl
#define IIterable_Language __FIIterable_1_Windows__CGlobalization__CLanguage
#define IIterable_Language_QueryInterface __FIIterable_1_Windows__CGlobalization__CLanguage_QueryInterface
#define IIterable_Language_AddRef __FIIterable_1_Windows__CGlobalization__CLanguage_AddRef
#define IIterable_Language_Release __FIIterable_1_Windows__CGlobalization__CLanguage_Release
#define IIterable_Language_GetIids __FIIterable_1_Windows__CGlobalization__CLanguage_GetIids
#define IIterable_Language_GetRuntimeClassName __FIIterable_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName
#define IIterable_Language_GetTrustLevel __FIIterable_1_Windows__CGlobalization__CLanguage_GetTrustLevel
#define IIterable_Language_First __FIIterable_1_Windows__CGlobalization__CLanguage_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Globalization::Language* > interface
 */
#ifndef ____FIIterator_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CGlobalization__CLanguage, 0x30e99ae6, 0xf414, 0x5243, 0x8d,0xb2, 0xaa,0xb3,0x8e,0xa3,0xf1,0xf1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("30e99ae6-f414-5243-8db2-aab38ea3f1f1")
                IIterator<ABI::Windows::Globalization::Language* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Globalization::Language*, ABI::Windows::Globalization::ILanguage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CGlobalization__CLanguage, 0x30e99ae6, 0xf414, 0x5243, 0x8d,0xb2, 0xaa,0xb3,0x8e,0xa3,0xf1,0xf1)
#endif
#else
typedef struct __FIIterator_1_Windows__CGlobalization__CLanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Globalization::Language* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CGlobalization__CLanguage *This,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CGlobalization__CLanguage *This,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CGlobalization__CLanguage *This,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CGlobalization__CLanguage *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGlobalization_CILanguage **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CGlobalization__CLanguageVtbl;

interface __FIIterator_1_Windows__CGlobalization__CLanguage {
    CONST_VTBL __FIIterator_1_Windows__CGlobalization__CLanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CGlobalization__CLanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CGlobalization__CLanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Globalization::Language* > methods ***/
#define __FIIterator_1_Windows__CGlobalization__CLanguage_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_QueryInterface(__FIIterator_1_Windows__CGlobalization__CLanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __FIIterator_1_Windows__CGlobalization__CLanguage_AddRef(__FIIterator_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __FIIterator_1_Windows__CGlobalization__CLanguage_Release(__FIIterator_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_GetIids(__FIIterator_1_Windows__CGlobalization__CLanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(__FIIterator_1_Windows__CGlobalization__CLanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_GetTrustLevel(__FIIterator_1_Windows__CGlobalization__CLanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Globalization::Language* > methods ***/
static FORCEINLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_get_Current(__FIIterator_1_Windows__CGlobalization__CLanguage* This,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->get_Current(This,value);
}
static FORCEINLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_get_HasCurrent(__FIIterator_1_Windows__CGlobalization__CLanguage* This,WINBOOL *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static FORCEINLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_MoveNext(__FIIterator_1_Windows__CGlobalization__CLanguage* This,WINBOOL *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static FORCEINLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_GetMany(__FIIterator_1_Windows__CGlobalization__CLanguage* This,UINT32 items_size,__x_ABI_CWindows_CGlobalization_CILanguage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_Language IID___FIIterator_1_Windows__CGlobalization__CLanguage
#define IIterator_LanguageVtbl __FIIterator_1_Windows__CGlobalization__CLanguageVtbl
#define IIterator_Language __FIIterator_1_Windows__CGlobalization__CLanguage
#define IIterator_Language_QueryInterface __FIIterator_1_Windows__CGlobalization__CLanguage_QueryInterface
#define IIterator_Language_AddRef __FIIterator_1_Windows__CGlobalization__CLanguage_AddRef
#define IIterator_Language_Release __FIIterator_1_Windows__CGlobalization__CLanguage_Release
#define IIterator_Language_GetIids __FIIterator_1_Windows__CGlobalization__CLanguage_GetIids
#define IIterator_Language_GetRuntimeClassName __FIIterator_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName
#define IIterator_Language_GetTrustLevel __FIIterator_1_Windows__CGlobalization__CLanguage_GetTrustLevel
#define IIterator_Language_get_Current __FIIterator_1_Windows__CGlobalization__CLanguage_get_Current
#define IIterator_Language_get_HasCurrent __FIIterator_1_Windows__CGlobalization__CLanguage_get_HasCurrent
#define IIterator_Language_MoveNext __FIIterator_1_Windows__CGlobalization__CLanguage_MoveNext
#define IIterator_Language_GetMany __FIIterator_1_Windows__CGlobalization__CLanguage_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Globalization::Language* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGlobalization__CLanguage, 0x144b0f3d, 0x2d59, 0x5dd2, 0xb0,0x12, 0x90,0x8e,0xc3,0xe0,0x64,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("144b0f3d-2d59-5dd2-b012-908ec3e06435")
                IVectorView<ABI::Windows::Globalization::Language* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Globalization::Language*, ABI::Windows::Globalization::ILanguage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGlobalization__CLanguage, 0x144b0f3d, 0x2d59, 0x5dd2, 0xb0,0x12, 0x90,0x8e,0xc3,0xe0,0x64,0x35)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGlobalization__CLanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Globalization::Language* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CGlobalization__CLanguage *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGlobalization__CLanguage *This,
        __x_ABI_CWindows_CGlobalization_CILanguage *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGlobalization__CLanguage *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGlobalization_CILanguage **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGlobalization__CLanguageVtbl;

interface __FIVectorView_1_Windows__CGlobalization__CLanguage {
    CONST_VTBL __FIVectorView_1_Windows__CGlobalization__CLanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Globalization::Language* > methods ***/
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_QueryInterface(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __FIVectorView_1_Windows__CGlobalization__CLanguage_AddRef(__FIVectorView_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __FIVectorView_1_Windows__CGlobalization__CLanguage_Release(__FIVectorView_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetIids(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetTrustLevel(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Globalization::Language* > methods ***/
static FORCEINLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetAt(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,UINT32 index,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static FORCEINLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_get_Size(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static FORCEINLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_IndexOf(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,__x_ABI_CWindows_CGlobalization_CILanguage *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static FORCEINLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetMany(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGlobalization_CILanguage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_Language IID___FIVectorView_1_Windows__CGlobalization__CLanguage
#define IVectorView_LanguageVtbl __FIVectorView_1_Windows__CGlobalization__CLanguageVtbl
#define IVectorView_Language __FIVectorView_1_Windows__CGlobalization__CLanguage
#define IVectorView_Language_QueryInterface __FIVectorView_1_Windows__CGlobalization__CLanguage_QueryInterface
#define IVectorView_Language_AddRef __FIVectorView_1_Windows__CGlobalization__CLanguage_AddRef
#define IVectorView_Language_Release __FIVectorView_1_Windows__CGlobalization__CLanguage_Release
#define IVectorView_Language_GetIids __FIVectorView_1_Windows__CGlobalization__CLanguage_GetIids
#define IVectorView_Language_GetRuntimeClassName __FIVectorView_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName
#define IVectorView_Language_GetTrustLevel __FIVectorView_1_Windows__CGlobalization__CLanguage_GetTrustLevel
#define IVectorView_Language_GetAt __FIVectorView_1_Windows__CGlobalization__CLanguage_GetAt
#define IVectorView_Language_get_Size __FIVectorView_1_Windows__CGlobalization__CLanguage_get_Size
#define IVectorView_Language_IndexOf __FIVectorView_1_Windows__CGlobalization__CLanguage_IndexOf
#define IVectorView_Language_GetMany __FIVectorView_1_Windows__CGlobalization__CLanguage_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::Globalization::Language* > interface
 */
#ifndef ____FIVector_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CGlobalization__CLanguage, 0xdcf2525a, 0x42c0, 0x501d, 0x9f,0xcb, 0x47,0x1f,0xae,0x06,0x03,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("dcf2525a-42c0-501d-9fcb-471fae060396")
                IVector<ABI::Windows::Globalization::Language* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Globalization::Language*, ABI::Windows::Globalization::ILanguage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CGlobalization__CLanguage, 0xdcf2525a, 0x42c0, 0x501d, 0x9f,0xcb, 0x47,0x1f,0xae,0x06,0x03,0x96)
#endif
#else
typedef struct __FIVector_1_Windows__CGlobalization__CLanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::Globalization::Language* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        __FIVectorView_1_Windows__CGlobalization__CLanguage **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        __x_ABI_CWindows_CGlobalization_CILanguage *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index,
        __x_ABI_CWindows_CGlobalization_CILanguage *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index,
        __x_ABI_CWindows_CGlobalization_CILanguage *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        __x_ABI_CWindows_CGlobalization_CILanguage *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGlobalization_CILanguage **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 count,
        __x_ABI_CWindows_CGlobalization_CILanguage **items);

    END_INTERFACE
} __FIVector_1_Windows__CGlobalization__CLanguageVtbl;

interface __FIVector_1_Windows__CGlobalization__CLanguage {
    CONST_VTBL __FIVector_1_Windows__CGlobalization__CLanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CGlobalization__CLanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CGlobalization__CLanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CGlobalization__CLanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::Globalization::Language* > methods ***/
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CGlobalization__CLanguage_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CGlobalization__CLanguage_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_QueryInterface(__FIVector_1_Windows__CGlobalization__CLanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __FIVector_1_Windows__CGlobalization__CLanguage_AddRef(__FIVector_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __FIVector_1_Windows__CGlobalization__CLanguage_Release(__FIVector_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetIids(__FIVector_1_Windows__CGlobalization__CLanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(__FIVector_1_Windows__CGlobalization__CLanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetTrustLevel(__FIVector_1_Windows__CGlobalization__CLanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::Globalization::Language* > methods ***/
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetAt(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 index,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_get_Size(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetView(__FIVector_1_Windows__CGlobalization__CLanguage* This,__FIVectorView_1_Windows__CGlobalization__CLanguage **value) {
    return This->lpVtbl->GetView(This,value);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_IndexOf(__FIVector_1_Windows__CGlobalization__CLanguage* This,__x_ABI_CWindows_CGlobalization_CILanguage *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_SetAt(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 index,__x_ABI_CWindows_CGlobalization_CILanguage *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_InsertAt(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 index,__x_ABI_CWindows_CGlobalization_CILanguage *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAt(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_Append(__FIVector_1_Windows__CGlobalization__CLanguage* This,__x_ABI_CWindows_CGlobalization_CILanguage *value) {
    return This->lpVtbl->Append(This,value);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAtEnd(__FIVector_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_Clear(__FIVector_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Clear(This);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetMany(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGlobalization_CILanguage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static FORCEINLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_ReplaceAll(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 count,__x_ABI_CWindows_CGlobalization_CILanguage **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_Language IID___FIVector_1_Windows__CGlobalization__CLanguage
#define IVector_LanguageVtbl __FIVector_1_Windows__CGlobalization__CLanguageVtbl
#define IVector_Language __FIVector_1_Windows__CGlobalization__CLanguage
#define IVector_Language_QueryInterface __FIVector_1_Windows__CGlobalization__CLanguage_QueryInterface
#define IVector_Language_AddRef __FIVector_1_Windows__CGlobalization__CLanguage_AddRef
#define IVector_Language_Release __FIVector_1_Windows__CGlobalization__CLanguage_Release
#define IVector_Language_GetIids __FIVector_1_Windows__CGlobalization__CLanguage_GetIids
#define IVector_Language_GetRuntimeClassName __FIVector_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName
#define IVector_Language_GetTrustLevel __FIVector_1_Windows__CGlobalization__CLanguage_GetTrustLevel
#define IVector_Language_GetAt __FIVector_1_Windows__CGlobalization__CLanguage_GetAt
#define IVector_Language_get_Size __FIVector_1_Windows__CGlobalization__CLanguage_get_Size
#define IVector_Language_GetView __FIVector_1_Windows__CGlobalization__CLanguage_GetView
#define IVector_Language_IndexOf __FIVector_1_Windows__CGlobalization__CLanguage_IndexOf
#define IVector_Language_SetAt __FIVector_1_Windows__CGlobalization__CLanguage_SetAt
#define IVector_Language_InsertAt __FIVector_1_Windows__CGlobalization__CLanguage_InsertAt
#define IVector_Language_RemoveAt __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAt
#define IVector_Language_Append __FIVector_1_Windows__CGlobalization__CLanguage_Append
#define IVector_Language_RemoveAtEnd __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAtEnd
#define IVector_Language_Clear __FIVector_1_Windows__CGlobalization__CLanguage_Clear
#define IVector_Language_GetMany __FIVector_1_Windows__CGlobalization__CLanguage_GetMany
#define IVector_Language_ReplaceAll __FIVector_1_Windows__CGlobalization__CLanguage_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CGlobalization__CLanguage_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_globalization_h__ */
