/*** Autogenerated by WIDL 10.3 from include/windows.system.profile.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_system_profile_h__
#define __windows_system_profile_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics ABI::Windows::System::Profile::IAnalyticsInfoStatics
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                interface IAnalyticsInfoStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo ABI::Windows::System::Profile::IAnalyticsVersionInfo
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                interface IAnalyticsVersionInfo;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CProfile_CAnalyticsVersionInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CAnalyticsVersionInfo_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                class AnalyticsVersionInfo;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSystem_CProfile_CAnalyticsVersionInfo __x_ABI_CWindows_CSystem_CProfile_CAnalyticsVersionInfo;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSystem_CProfile_CAnalyticsVersionInfo_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSystem_CProfile_CAnalyticsInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CAnalyticsInfo_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                class AnalyticsInfo;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSystem_CProfile_CAnalyticsInfo __x_ABI_CWindows_CSystem_CProfile_CAnalyticsInfo;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSystem_CProfile_CAnalyticsInfo_FWD_DEFINED__ */

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics ABI::Windows::System::Profile::IAnalyticsInfoStatics
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                interface IAnalyticsInfoStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics2 __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics2 ABI::Windows::System::Profile::IAnalyticsInfoStatics2
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                interface IAnalyticsInfoStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo ABI::Windows::System::Profile::IAnalyticsVersionInfo
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                interface IAnalyticsVersionInfo;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo2_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo2 __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo2 ABI::Windows::System::Profile::IAnalyticsVersionInfo2
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                interface IAnalyticsVersionInfo2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IAnalyticsInfoStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics, 0x1d5ee066, 0x188d, 0x5ba9, 0x43,0x87, 0xac,0xae,0xb0,0xe7,0xe3,0x05);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                MIDL_INTERFACE("1d5ee066-188d-5ba9-4387-acaeb0e7e305")
                IAnalyticsInfoStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_VersionInfo(
                        ABI::Windows::System::Profile::IAnalyticsVersionInfo **value) = 0;

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics, 0x1d5ee066, 0x188d, 0x5ba9, 0x43,0x87, 0xac,0xae,0xb0,0xe7,0xe3,0x05)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAnalyticsInfoStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_VersionInfo)(
        __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics *This,
        __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo **value);

    HRESULT (STDMETHODCALLTYPE *get_DeviceForm)(
        __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStaticsVtbl;

interface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics {
    CONST_VTBL __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAnalyticsInfoStatics methods ***/
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_get_VersionInfo(This,value) (This)->lpVtbl->get_VersionInfo(This,value)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_get_DeviceForm(This,value) (This)->lpVtbl->get_DeviceForm(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_QueryInterface(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_AddRef(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_Release(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_GetIids(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_GetTrustLevel(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAnalyticsInfoStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_get_VersionInfo(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics* This,__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo **value) {
    return This->lpVtbl->get_VersionInfo(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_get_DeviceForm(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics* This,HSTRING *value) {
    return This->lpVtbl->get_DeviceForm(This,value);
}
#endif
#ifdef WIDL_using_Windows_System_Profile
#define IID_IAnalyticsInfoStatics IID___x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics
#define IAnalyticsInfoStaticsVtbl __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStaticsVtbl
#define IAnalyticsInfoStatics __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics
#define IAnalyticsInfoStatics_QueryInterface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_QueryInterface
#define IAnalyticsInfoStatics_AddRef __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_AddRef
#define IAnalyticsInfoStatics_Release __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_Release
#define IAnalyticsInfoStatics_GetIids __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_GetIids
#define IAnalyticsInfoStatics_GetRuntimeClassName __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_GetRuntimeClassName
#define IAnalyticsInfoStatics_GetTrustLevel __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_GetTrustLevel
#define IAnalyticsInfoStatics_get_VersionInfo __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_get_VersionInfo
#define IAnalyticsInfoStatics_get_DeviceForm __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsInfoStatics_get_DeviceForm
#endif /* WIDL_using_Windows_System_Profile */
#endif

#endif

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

/*****************************************************************************
 * IAnalyticsVersionInfo interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo, 0x926130b8, 0x9955, 0x4c74, 0xbd,0xc1, 0x7c,0xd0,0xde,0xcf,0x9b,0x03);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            namespace Profile {
                MIDL_INTERFACE("926130b8-9955-4c74-bdc1-7cd0decf9b03")
                IAnalyticsVersionInfo : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_DeviceFamily(
                        HSTRING *value) = 0;

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo, 0x926130b8, 0x9955, 0x4c74, 0xbd,0xc1, 0x7c,0xd0,0xde,0xcf,0x9b,0x03)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfoVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAnalyticsVersionInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DeviceFamily)(
        __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DeviceFamilyVersion)(
        __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfoVtbl;

interface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo {
    CONST_VTBL __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAnalyticsVersionInfo methods ***/
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_get_DeviceFamily(This,value) (This)->lpVtbl->get_DeviceFamily(This,value)
#define __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_get_DeviceFamilyVersion(This,value) (This)->lpVtbl->get_DeviceFamilyVersion(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_QueryInterface(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_AddRef(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_Release(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_GetIids(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_GetTrustLevel(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAnalyticsVersionInfo methods ***/
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_get_DeviceFamily(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo* This,HSTRING *value) {
    return This->lpVtbl->get_DeviceFamily(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_get_DeviceFamilyVersion(__x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo* This,HSTRING *value) {
    return This->lpVtbl->get_DeviceFamilyVersion(This,value);
}
#endif
#ifdef WIDL_using_Windows_System_Profile
#define IID_IAnalyticsVersionInfo IID___x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo
#define IAnalyticsVersionInfoVtbl __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfoVtbl
#define IAnalyticsVersionInfo __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo
#define IAnalyticsVersionInfo_QueryInterface __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_QueryInterface
#define IAnalyticsVersionInfo_AddRef __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_AddRef
#define IAnalyticsVersionInfo_Release __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_Release
#define IAnalyticsVersionInfo_GetIids __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_GetIids
#define IAnalyticsVersionInfo_GetRuntimeClassName __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_GetRuntimeClassName
#define IAnalyticsVersionInfo_GetTrustLevel __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_GetTrustLevel
#define IAnalyticsVersionInfo_get_DeviceFamily __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_get_DeviceFamily
#define IAnalyticsVersionInfo_get_DeviceFamilyVersion __x_ABI_CWindows_CSystem_CProfile_CIAnalyticsVersionInfo_get_DeviceFamilyVersion
#endif /* WIDL_using_Windows_System_Profile */
#endif

#endif

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

/*
 * Class Windows.System.Profile.AnalyticsVersionInfo
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_System_Profile_AnalyticsVersionInfo_DEFINED
#define RUNTIMECLASS_Windows_System_Profile_AnalyticsVersionInfo_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_System_Profile_AnalyticsVersionInfo[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','P','r','o','f','i','l','e','.','A','n','a','l','y','t','i','c','s','V','e','r','s','i','o','n','I','n','f','o',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_Profile_AnalyticsVersionInfo[] = L"Windows.System.Profile.AnalyticsVersionInfo";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_Profile_AnalyticsVersionInfo[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','P','r','o','f','i','l','e','.','A','n','a','l','y','t','i','c','s','V','e','r','s','i','o','n','I','n','f','o',0};
#endif
#endif /* RUNTIMECLASS_Windows_System_Profile_AnalyticsVersionInfo_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.System.Profile.AnalyticsInfo
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_System_Profile_AnalyticsInfo_DEFINED
#define RUNTIMECLASS_Windows_System_Profile_AnalyticsInfo_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_System_Profile_AnalyticsInfo[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','P','r','o','f','i','l','e','.','A','n','a','l','y','t','i','c','s','I','n','f','o',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_Profile_AnalyticsInfo[] = L"Windows.System.Profile.AnalyticsInfo";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_Profile_AnalyticsInfo[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','P','r','o','f','i','l','e','.','A','n','a','l','y','t','i','c','s','I','n','f','o',0};
#endif
#endif /* RUNTIMECLASS_Windows_System_Profile_AnalyticsInfo_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/* 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_system_profile_h__ */
