/*** Autogenerated by WIDL 9.8 from include/windows.applicationmodel.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_applicationmodel_h__
#define __windows_applicationmodel_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo ABI::Windows::ApplicationModel::IAppDisplayInfo
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IAppDisplayInfo;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage __x_ABI_CWindows_CApplicationModel_CIPackage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage ABI::Windows::ApplicationModel::IPackage
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage2 __x_ABI_CWindows_CApplicationModel_CIPackage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage2 ABI::Windows::ApplicationModel::IPackage2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage3 __x_ABI_CWindows_CApplicationModel_CIPackage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage3 ABI::Windows::ApplicationModel::IPackage3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageStatus __x_ABI_CWindows_CApplicationModel_CIPackageStatus;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus ABI::Windows::ApplicationModel::IPackageStatus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageStatus;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageId_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageId_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageId __x_ABI_CWindows_CApplicationModel_CIPackageId;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageId ABI::Windows::ApplicationModel::IPackageId
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageId;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata ABI::Windows::ApplicationModel::IPackageIdWithMetadata
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageIdWithMetadata;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageStatics __x_ABI_CWindows_CApplicationModel_CIPackageStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics ABI::Windows::ApplicationModel::IPackageStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CAppDisplayInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CAppDisplayInfo_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class AppDisplayInfo;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CAppDisplayInfo __x_ABI_CWindows_CApplicationModel_CAppDisplayInfo;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CAppDisplayInfo_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CPackage_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CPackage_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class Package;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CPackage __x_ABI_CWindows_CApplicationModel_CPackage;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CPackage_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CPackageStatus_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CPackageStatus_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class PackageStatus;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CPackageStatus __x_ABI_CWindows_CApplicationModel_CPackageStatus;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CPackageStatus_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CPackageId_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CPackageId_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class PackageId;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CPackageId __x_ABI_CWindows_CApplicationModel_CPackageId;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CPackageId_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CApplicationModel__CPackage __FIIterable_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CApplicationModel__CPackage __FIIterator_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CPackage __FIVectorView_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <windows.foundation.h>
#include <windows.storage.h>
#include <windows.system.h>
#include <windows.applicationmodel.core.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CApplicationModel_CPackageVersion __x_ABI_CWindows_CApplicationModel_CPackageVersion;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            typedef struct PackageVersion PackageVersion;
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo ABI::Windows::ApplicationModel::IAppDisplayInfo
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IAppDisplayInfo;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage __x_ABI_CWindows_CApplicationModel_CIPackage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage ABI::Windows::ApplicationModel::IPackage
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage2 __x_ABI_CWindows_CApplicationModel_CIPackage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage2 ABI::Windows::ApplicationModel::IPackage2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage3 __x_ABI_CWindows_CApplicationModel_CIPackage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage3 ABI::Windows::ApplicationModel::IPackage3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageStatus __x_ABI_CWindows_CApplicationModel_CIPackageStatus;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus ABI::Windows::ApplicationModel::IPackageStatus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageStatus;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageId_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageId_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageId __x_ABI_CWindows_CApplicationModel_CIPackageId;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageId ABI::Windows::ApplicationModel::IPackageId
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageId;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata ABI::Windows::ApplicationModel::IPackageIdWithMetadata
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageIdWithMetadata;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageStatics __x_ABI_CWindows_CApplicationModel_CIPackageStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics ABI::Windows::ApplicationModel::IPackageStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CApplicationModel__CPackage __FIIterable_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CApplicationModel__CPackage __FIIterator_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CPackage __FIVectorView_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            struct PackageVersion {
                UINT16 Major;
                UINT16 Minor;
                UINT16 Build;
                UINT16 Revision;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CApplicationModel_CPackageVersion {
    UINT16 Major;
    UINT16 Minor;
    UINT16 Build;
    UINT16 Revision;
};
#ifdef WIDL_using_Windows_ApplicationModel
#define PackageVersion __x_ABI_CWindows_CApplicationModel_CPackageVersion
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IAppDisplayInfo interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo, 0x1aeb1103, 0xe4d4, 0x41aa, 0xa4,0xf6, 0xc4,0xa2,0x76,0xe7,0x9e,0xac);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("1aeb1103-e4d4-41aa-a4f6-c4a276e79eac")
            IAppDisplayInfo : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
                    HSTRING *value) = 0;

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

                virtual HRESULT STDMETHODCALLTYPE GetLogo(
                    struct Size size,
                    ABI::Windows::Storage::Streams::IRandomAccessStreamReference **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo, 0x1aeb1103, 0xe4d4, 0x41aa, 0xa4,0xf6, 0xc4,0xa2,0x76,0xe7,0x9e,0xac)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfoVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAppDisplayInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *GetLogo)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        struct __x_ABI_CWindows_CFoundation_CSize size,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfoVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAppDisplayInfo methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_Description(This,value) (This)->lpVtbl->get_Description(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetLogo(This,size,value) (This)->lpVtbl->GetLogo(This,size,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_AddRef(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_Release(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetIids(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAppDisplayInfo methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_DisplayName(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_Description(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,HSTRING *value) {
    return This->lpVtbl->get_Description(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetLogo(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,struct __x_ABI_CWindows_CFoundation_CSize size,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value) {
    return This->lpVtbl->GetLogo(This,size,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IAppDisplayInfo IID___x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo
#define IAppDisplayInfoVtbl __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfoVtbl
#define IAppDisplayInfo __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo
#define IAppDisplayInfo_QueryInterface __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_QueryInterface
#define IAppDisplayInfo_AddRef __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_AddRef
#define IAppDisplayInfo_Release __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_Release
#define IAppDisplayInfo_GetIids __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetIids
#define IAppDisplayInfo_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetRuntimeClassName
#define IAppDisplayInfo_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetTrustLevel
#define IAppDisplayInfo_get_DisplayName __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_DisplayName
#define IAppDisplayInfo_get_Description __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_Description
#define IAppDisplayInfo_GetLogo __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetLogo
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

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

/*****************************************************************************
 * IPackage interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackage, 0x163c792f, 0xbd75, 0x413c, 0xbf,0x23, 0xb1,0xfe,0x7b,0x95,0xd8,0x25);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("163c792f-bd75-413c-bf23-b1fe7b95d825")
            IPackage : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Id(
                    ABI::Windows::ApplicationModel::IPackageId **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_InstalledLocation(
                    ABI::Windows::Storage::IStorageFolder **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_IsFramework(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Dependencies(
                    ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Package* > **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackage, 0x163c792f, 0xbd75, 0x413c, 0xbf,0x23, 0xb1,0xfe,0x7b,0x95,0xd8,0x25)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        __x_ABI_CWindows_CApplicationModel_CIPackageId **value);

    HRESULT (STDMETHODCALLTYPE *get_InstalledLocation)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        __x_ABI_CWindows_CStorage_CIStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_IsFramework)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Dependencies)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        __FIVectorView_1_Windows__CApplicationModel__CPackage **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackage {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackage methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_get_InstalledLocation(This,value) (This)->lpVtbl->get_InstalledLocation(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_get_IsFramework(This,value) (This)->lpVtbl->get_IsFramework(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_get_Dependencies(This,value) (This)->lpVtbl->get_Dependencies(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage_Release(__x_ABI_CWindows_CApplicationModel_CIPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackage methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_get_Id(__x_ABI_CWindows_CApplicationModel_CIPackage* This,__x_ABI_CWindows_CApplicationModel_CIPackageId **value) {
    return This->lpVtbl->get_Id(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_get_InstalledLocation(__x_ABI_CWindows_CApplicationModel_CIPackage* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
    return This->lpVtbl->get_InstalledLocation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_get_IsFramework(__x_ABI_CWindows_CApplicationModel_CIPackage* This,boolean *value) {
    return This->lpVtbl->get_IsFramework(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_get_Dependencies(__x_ABI_CWindows_CApplicationModel_CIPackage* This,__FIVectorView_1_Windows__CApplicationModel__CPackage **value) {
    return This->lpVtbl->get_Dependencies(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackage IID___x_ABI_CWindows_CApplicationModel_CIPackage
#define IPackageVtbl __x_ABI_CWindows_CApplicationModel_CIPackageVtbl
#define IPackage __x_ABI_CWindows_CApplicationModel_CIPackage
#define IPackage_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackage_QueryInterface
#define IPackage_AddRef __x_ABI_CWindows_CApplicationModel_CIPackage_AddRef
#define IPackage_Release __x_ABI_CWindows_CApplicationModel_CIPackage_Release
#define IPackage_GetIids __x_ABI_CWindows_CApplicationModel_CIPackage_GetIids
#define IPackage_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackage_GetRuntimeClassName
#define IPackage_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackage_GetTrustLevel
#define IPackage_get_Id __x_ABI_CWindows_CApplicationModel_CIPackage_get_Id
#define IPackage_get_InstalledLocation __x_ABI_CWindows_CApplicationModel_CIPackage_get_InstalledLocation
#define IPackage_get_IsFramework __x_ABI_CWindows_CApplicationModel_CIPackage_get_IsFramework
#define IPackage_get_Dependencies __x_ABI_CWindows_CApplicationModel_CIPackage_get_Dependencies
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

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

/*****************************************************************************
 * IPackage2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackage2, 0xa6612fb6, 0x7688, 0x4ace, 0x95,0xfb, 0x35,0x95,0x38,0xe7,0xaa,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("a6612fb6-7688-4ace-95fb-359538e7aa01")
            IPackage2 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
                    HSTRING *value) = 0;

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

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

                virtual HRESULT STDMETHODCALLTYPE get_Logo(
                    ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_IsResourcePackage(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_IsBundle(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_IsDevelopmentMode(
                    boolean *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackage2, 0xa6612fb6, 0x7688, 0x4ace, 0x95,0xfb, 0x35,0x95,0x38,0xe7,0xaa,0x01)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackage2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackage2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_PublisherDisplayName)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Logo)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    HRESULT (STDMETHODCALLTYPE *get_IsResourcePackage)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsBundle)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsDevelopmentMode)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackage2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackage2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackage2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackage2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_PublisherDisplayName(This,value) (This)->lpVtbl->get_PublisherDisplayName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Description(This,value) (This)->lpVtbl->get_Description(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Logo(This,value) (This)->lpVtbl->get_Logo(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsResourcePackage(This,value) (This)->lpVtbl->get_IsResourcePackage(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsBundle(This,value) (This)->lpVtbl->get_IsBundle(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsDevelopmentMode(This,value) (This)->lpVtbl->get_IsDevelopmentMode(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage2_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackage2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage2_Release(__x_ABI_CWindows_CApplicationModel_CIPackage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackage2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_DisplayName(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_PublisherDisplayName(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,HSTRING *value) {
    return This->lpVtbl->get_PublisherDisplayName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Description(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,HSTRING *value) {
    return This->lpVtbl->get_Description(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Logo(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_Logo(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsResourcePackage(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,boolean *value) {
    return This->lpVtbl->get_IsResourcePackage(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsBundle(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,boolean *value) {
    return This->lpVtbl->get_IsBundle(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsDevelopmentMode(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,boolean *value) {
    return This->lpVtbl->get_IsDevelopmentMode(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackage2 IID___x_ABI_CWindows_CApplicationModel_CIPackage2
#define IPackage2Vtbl __x_ABI_CWindows_CApplicationModel_CIPackage2Vtbl
#define IPackage2 __x_ABI_CWindows_CApplicationModel_CIPackage2
#define IPackage2_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackage2_QueryInterface
#define IPackage2_AddRef __x_ABI_CWindows_CApplicationModel_CIPackage2_AddRef
#define IPackage2_Release __x_ABI_CWindows_CApplicationModel_CIPackage2_Release
#define IPackage2_GetIids __x_ABI_CWindows_CApplicationModel_CIPackage2_GetIids
#define IPackage2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackage2_GetRuntimeClassName
#define IPackage2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackage2_GetTrustLevel
#define IPackage2_get_DisplayName __x_ABI_CWindows_CApplicationModel_CIPackage2_get_DisplayName
#define IPackage2_get_PublisherDisplayName __x_ABI_CWindows_CApplicationModel_CIPackage2_get_PublisherDisplayName
#define IPackage2_get_Description __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Description
#define IPackage2_get_Logo __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Logo
#define IPackage2_get_IsResourcePackage __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsResourcePackage
#define IPackage2_get_IsBundle __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsBundle
#define IPackage2_get_IsDevelopmentMode __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsDevelopmentMode
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

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

/*****************************************************************************
 * IPackage3 interface
 */
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackage3, 0x5f738b61, 0xf86a, 0x4917, 0x93,0xd1, 0xf1,0xee,0x9d,0x3b,0x35,0xd9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("5f738b61-f86a-4917-93d1-f1ee9d3b35d9")
            IPackage3 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Status(
                    ABI::Windows::ApplicationModel::IPackageStatus **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_InstalledDate(
                    struct DateTime *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetAppListEntriesAsync(
                    ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > **operation) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackage3, 0x5f738b61, 0xf86a, 0x4917, 0x93,0xd1, 0xf1,0xee,0x9d,0x3b,0x35,0xd9)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackage3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackage3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Status)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus **value);

    HRESULT (STDMETHODCALLTYPE *get_InstalledDate)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        struct __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *GetAppListEntriesAsync)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **operation);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackage3Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackage3 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackage3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackage3 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_get_Status(This,value) (This)->lpVtbl->get_Status(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_get_InstalledDate(This,value) (This)->lpVtbl->get_InstalledDate(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_GetAppListEntriesAsync(This,operation) (This)->lpVtbl->GetAppListEntriesAsync(This,operation)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage3_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackage3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage3_Release(__x_ABI_CWindows_CApplicationModel_CIPackage3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackage3 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_get_Status(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,__x_ABI_CWindows_CApplicationModel_CIPackageStatus **value) {
    return This->lpVtbl->get_Status(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_get_InstalledDate(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,struct __x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_InstalledDate(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_GetAppListEntriesAsync(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **operation) {
    return This->lpVtbl->GetAppListEntriesAsync(This,operation);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackage3 IID___x_ABI_CWindows_CApplicationModel_CIPackage3
#define IPackage3Vtbl __x_ABI_CWindows_CApplicationModel_CIPackage3Vtbl
#define IPackage3 __x_ABI_CWindows_CApplicationModel_CIPackage3
#define IPackage3_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackage3_QueryInterface
#define IPackage3_AddRef __x_ABI_CWindows_CApplicationModel_CIPackage3_AddRef
#define IPackage3_Release __x_ABI_CWindows_CApplicationModel_CIPackage3_Release
#define IPackage3_GetIids __x_ABI_CWindows_CApplicationModel_CIPackage3_GetIids
#define IPackage3_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackage3_GetRuntimeClassName
#define IPackage3_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackage3_GetTrustLevel
#define IPackage3_get_Status __x_ABI_CWindows_CApplicationModel_CIPackage3_get_Status
#define IPackage3_get_InstalledDate __x_ABI_CWindows_CApplicationModel_CIPackage3_get_InstalledDate
#define IPackage3_GetAppListEntriesAsync __x_ABI_CWindows_CApplicationModel_CIPackage3_GetAppListEntriesAsync
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIPackage3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPackageStatus interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackageStatus, 0x5fe74f71, 0xa365, 0x4c09, 0xa0,0x2d, 0x04,0x6d,0x52,0x5e,0xa1,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("5fe74f71-a365-4c09-a02d-046d525ea1da")
            IPackageStatus : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE VerifyIsOK(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_NotAvailable(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_PackageOffline(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_DataOffline(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Disabled(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_NeedsRemediation(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_LicenseIssue(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Modified(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Tampered(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_DependencyIssue(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Servicing(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_DeploymentInProgress(
                    boolean *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackageStatus, 0x5fe74f71, 0xa365, 0x4c09, 0xa0,0x2d, 0x04,0x6d,0x52,0x5e,0xa1,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageStatusVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackageStatus methods ***/
    HRESULT (STDMETHODCALLTYPE *VerifyIsOK)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_NotAvailable)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_PackageOffline)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_DataOffline)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Disabled)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_NeedsRemediation)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_LicenseIssue)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Modified)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Tampered)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_DependencyIssue)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Servicing)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_DeploymentInProgress)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageStatusVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackageStatus {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageStatus methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_VerifyIsOK(This,value) (This)->lpVtbl->VerifyIsOK(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NotAvailable(This,value) (This)->lpVtbl->get_NotAvailable(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_PackageOffline(This,value) (This)->lpVtbl->get_PackageOffline(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DataOffline(This,value) (This)->lpVtbl->get_DataOffline(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Disabled(This,value) (This)->lpVtbl->get_Disabled(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NeedsRemediation(This,value) (This)->lpVtbl->get_NeedsRemediation(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_LicenseIssue(This,value) (This)->lpVtbl->get_LicenseIssue(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Modified(This,value) (This)->lpVtbl->get_Modified(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Tampered(This,value) (This)->lpVtbl->get_Tampered(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DependencyIssue(This,value) (This)->lpVtbl->get_DependencyIssue(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Servicing(This,value) (This)->lpVtbl->get_Servicing(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DeploymentInProgress(This,value) (This)->lpVtbl->get_DeploymentInProgress(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageStatus_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageStatus_Release(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageStatus methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_VerifyIsOK(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->VerifyIsOK(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NotAvailable(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_NotAvailable(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_PackageOffline(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_PackageOffline(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DataOffline(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_DataOffline(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Disabled(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_Disabled(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NeedsRemediation(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_NeedsRemediation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_LicenseIssue(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_LicenseIssue(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Modified(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_Modified(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Tampered(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_Tampered(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DependencyIssue(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_DependencyIssue(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Servicing(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_Servicing(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DeploymentInProgress(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_DeploymentInProgress(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackageStatus IID___x_ABI_CWindows_CApplicationModel_CIPackageStatus
#define IPackageStatusVtbl __x_ABI_CWindows_CApplicationModel_CIPackageStatusVtbl
#define IPackageStatus __x_ABI_CWindows_CApplicationModel_CIPackageStatus
#define IPackageStatus_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackageStatus_QueryInterface
#define IPackageStatus_AddRef __x_ABI_CWindows_CApplicationModel_CIPackageStatus_AddRef
#define IPackageStatus_Release __x_ABI_CWindows_CApplicationModel_CIPackageStatus_Release
#define IPackageStatus_GetIids __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetIids
#define IPackageStatus_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetRuntimeClassName
#define IPackageStatus_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetTrustLevel
#define IPackageStatus_VerifyIsOK __x_ABI_CWindows_CApplicationModel_CIPackageStatus_VerifyIsOK
#define IPackageStatus_get_NotAvailable __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NotAvailable
#define IPackageStatus_get_PackageOffline __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_PackageOffline
#define IPackageStatus_get_DataOffline __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DataOffline
#define IPackageStatus_get_Disabled __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Disabled
#define IPackageStatus_get_NeedsRemediation __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NeedsRemediation
#define IPackageStatus_get_LicenseIssue __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_LicenseIssue
#define IPackageStatus_get_Modified __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Modified
#define IPackageStatus_get_Tampered __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Tampered
#define IPackageStatus_get_DependencyIssue __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DependencyIssue
#define IPackageStatus_get_Servicing __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Servicing
#define IPackageStatus_get_DeploymentInProgress __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DeploymentInProgress
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

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

/*****************************************************************************
 * IPackageId interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackageId, 0x1adb665e, 0x37c7, 0x4790, 0x99,0x80, 0xdd,0x7a,0xe7,0x4e,0x8b,0xb2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("1adb665e-37c7-4790-9980-dd7ae74e8bb2")
            IPackageId : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Name(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Version(
                    struct PackageVersion *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Architecture(
                    enum ProcessorArchitecture *value) = 0;

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

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

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

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

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

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackageId, 0x1adb665e, 0x37c7, 0x4790, 0x99,0x80, 0xdd,0x7a,0xe7,0x4e,0x8b,0xb2)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageIdVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackageId methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Version)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        struct __x_ABI_CWindows_CApplicationModel_CPackageVersion *value);

    HRESULT (STDMETHODCALLTYPE *get_Architecture)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        enum __x_ABI_CWindows_CSystem_CProcessorArchitecture *value);

    HRESULT (STDMETHODCALLTYPE *get_ResourceId)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Publisher)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_PublisherId)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_FullName)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_FamilyName)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageIdVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackageId {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageIdVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageId methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Version(This,value) (This)->lpVtbl->get_Version(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Architecture(This,value) (This)->lpVtbl->get_Architecture(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_ResourceId(This,value) (This)->lpVtbl->get_ResourceId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Publisher(This,value) (This)->lpVtbl->get_Publisher(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_PublisherId(This,value) (This)->lpVtbl->get_PublisherId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FullName(This,value) (This)->lpVtbl->get_FullName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FamilyName(This,value) (This)->lpVtbl->get_FamilyName(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageId_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackageId* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageId_Release(__x_ABI_CWindows_CApplicationModel_CIPackageId* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageId methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Name(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Version(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,struct __x_ABI_CWindows_CApplicationModel_CPackageVersion *value) {
    return This->lpVtbl->get_Version(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Architecture(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,enum __x_ABI_CWindows_CSystem_CProcessorArchitecture *value) {
    return This->lpVtbl->get_Architecture(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_ResourceId(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_ResourceId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Publisher(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_Publisher(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_PublisherId(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_PublisherId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FullName(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_FullName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FamilyName(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_FamilyName(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackageId IID___x_ABI_CWindows_CApplicationModel_CIPackageId
#define IPackageIdVtbl __x_ABI_CWindows_CApplicationModel_CIPackageIdVtbl
#define IPackageId __x_ABI_CWindows_CApplicationModel_CIPackageId
#define IPackageId_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackageId_QueryInterface
#define IPackageId_AddRef __x_ABI_CWindows_CApplicationModel_CIPackageId_AddRef
#define IPackageId_Release __x_ABI_CWindows_CApplicationModel_CIPackageId_Release
#define IPackageId_GetIids __x_ABI_CWindows_CApplicationModel_CIPackageId_GetIids
#define IPackageId_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackageId_GetRuntimeClassName
#define IPackageId_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackageId_GetTrustLevel
#define IPackageId_get_Name __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Name
#define IPackageId_get_Version __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Version
#define IPackageId_get_Architecture __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Architecture
#define IPackageId_get_ResourceId __x_ABI_CWindows_CApplicationModel_CIPackageId_get_ResourceId
#define IPackageId_get_Publisher __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Publisher
#define IPackageId_get_PublisherId __x_ABI_CWindows_CApplicationModel_CIPackageId_get_PublisherId
#define IPackageId_get_FullName __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FullName
#define IPackageId_get_FamilyName __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FamilyName
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

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

/*****************************************************************************
 * IPackageIdWithMetadata interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata, 0x40577a7c, 0x0c9e, 0x443d, 0x90,0x74, 0x85,0x5f,0x5c,0xe0,0xa0,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("40577a7c-0c9e-443d-9074-855f5ce0a08d")
            IPackageIdWithMetadata : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_ProductId(
                    HSTRING *value) = 0;

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

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata, 0x40577a7c, 0x0c9e, 0x443d, 0x90,0x74, 0x85,0x5f,0x5c,0xe0,0xa0,0x8d)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadataVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackageIdWithMetadata methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProductId)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Author)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadataVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageIdWithMetadata methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_ProductId(This,value) (This)->lpVtbl->get_ProductId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_Author(This,value) (This)->lpVtbl->get_Author(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_Release(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageIdWithMetadata methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_ProductId(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,HSTRING *value) {
    return This->lpVtbl->get_ProductId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_Author(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,HSTRING *value) {
    return This->lpVtbl->get_Author(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackageIdWithMetadata IID___x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata
#define IPackageIdWithMetadataVtbl __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadataVtbl
#define IPackageIdWithMetadata __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata
#define IPackageIdWithMetadata_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_QueryInterface
#define IPackageIdWithMetadata_AddRef __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_AddRef
#define IPackageIdWithMetadata_Release __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_Release
#define IPackageIdWithMetadata_GetIids __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetIids
#define IPackageIdWithMetadata_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetRuntimeClassName
#define IPackageIdWithMetadata_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetTrustLevel
#define IPackageIdWithMetadata_get_ProductId __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_ProductId
#define IPackageIdWithMetadata_get_Author __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_Author
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

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

/*****************************************************************************
 * IPackageStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackageStatics, 0x4e534bdf, 0x2960, 0x4878, 0x97,0xa4, 0x96,0x24,0xde,0xb7,0x2f,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("4e534bdf-2960-4878-97a4-9624deb72f2d")
            IPackageStatics : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Current(
                    ABI::Windows::ApplicationModel::IPackage **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackageStatics, 0x4e534bdf, 0x2960, 0x4878, 0x97,0xa4, 0x96,0x24,0xde,0xb7,0x2f,0x2d)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackageStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatics *This,
        __x_ABI_CWindows_CApplicationModel_CIPackage **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageStaticsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackageStatics {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageStatics methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageStatics_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageStatics_Release(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_get_Current(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,__x_ABI_CWindows_CApplicationModel_CIPackage **value) {
    return This->lpVtbl->get_Current(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackageStatics IID___x_ABI_CWindows_CApplicationModel_CIPackageStatics
#define IPackageStaticsVtbl __x_ABI_CWindows_CApplicationModel_CIPackageStaticsVtbl
#define IPackageStatics __x_ABI_CWindows_CApplicationModel_CIPackageStatics
#define IPackageStatics_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackageStatics_QueryInterface
#define IPackageStatics_AddRef __x_ABI_CWindows_CApplicationModel_CIPackageStatics_AddRef
#define IPackageStatics_Release __x_ABI_CWindows_CApplicationModel_CIPackageStatics_Release
#define IPackageStatics_GetIids __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetIids
#define IPackageStatics_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetRuntimeClassName
#define IPackageStatics_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetTrustLevel
#define IPackageStatics_get_Current __x_ABI_CWindows_CApplicationModel_CIPackageStatics_get_Current
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

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

/*
 * Class Windows.ApplicationModel.AppDisplayInfo
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_AppDisplayInfo_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_AppDisplayInfo_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_AppDisplayInfo[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','A','p','p','D','i','s','p','l','a','y','I','n','f','o',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_AppDisplayInfo[] = L"Windows.ApplicationModel.AppDisplayInfo";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_AppDisplayInfo[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','A','p','p','D','i','s','p','l','a','y','I','n','f','o',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_AppDisplayInfo_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.Package
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_Package_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_Package_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_Package[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_Package[] = L"Windows.ApplicationModel.Package";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_Package[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_Package_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.PackageStatus
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_PackageStatus_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_PackageStatus_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_PackageStatus[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e','S','t','a','t','u','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_PackageStatus[] = L"Windows.ApplicationModel.PackageStatus";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_PackageStatus[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e','S','t','a','t','u','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_PackageStatus_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.PackageId
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_PackageId_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_PackageId_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_PackageId[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e','I','d',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_PackageId[] = L"Windows.ApplicationModel.PackageId";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_PackageId[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e','I','d',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_PackageId_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::ApplicationModel::Package* > interface
 */
#ifndef ____FIIterable_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CApplicationModel__CPackage, 0x69ad6aa7, 0x0c49, 0x5f27, 0xa5,0xeb, 0xef,0x4d,0x59,0x46,0x7b,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("69ad6aa7-0c49-5f27-a5eb-ef4d59467b6d")
                IIterable<ABI::Windows::ApplicationModel::Package* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Package*, ABI::Windows::ApplicationModel::IPackage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CApplicationModel__CPackage, 0x69ad6aa7, 0x0c49, 0x5f27, 0xa5,0xeb, 0xef,0x4d,0x59,0x46,0x7b,0x6d)
#endif
#else
typedef struct __FIIterable_1_Windows__CApplicationModel__CPackageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::ApplicationModel::Package* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CApplicationModel__CPackage *This,
        __FIIterator_1_Windows__CApplicationModel__CPackage **value);

    END_INTERFACE
} __FIIterable_1_Windows__CApplicationModel__CPackageVtbl;

interface __FIIterable_1_Windows__CApplicationModel__CPackage {
    CONST_VTBL __FIIterable_1_Windows__CApplicationModel__CPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CApplicationModel__CPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CApplicationModel__CPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CApplicationModel__CPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::ApplicationModel::Package* > methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CPackage_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_QueryInterface(__FIIterable_1_Windows__CApplicationModel__CPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CApplicationModel__CPackage_AddRef(__FIIterable_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CApplicationModel__CPackage_Release(__FIIterable_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_GetIids(__FIIterable_1_Windows__CApplicationModel__CPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(__FIIterable_1_Windows__CApplicationModel__CPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_GetTrustLevel(__FIIterable_1_Windows__CApplicationModel__CPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::ApplicationModel::Package* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_First(__FIIterable_1_Windows__CApplicationModel__CPackage* This,__FIIterator_1_Windows__CApplicationModel__CPackage **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_Package IID___FIIterable_1_Windows__CApplicationModel__CPackage
#define IIterable_PackageVtbl __FIIterable_1_Windows__CApplicationModel__CPackageVtbl
#define IIterable_Package __FIIterable_1_Windows__CApplicationModel__CPackage
#define IIterable_Package_QueryInterface __FIIterable_1_Windows__CApplicationModel__CPackage_QueryInterface
#define IIterable_Package_AddRef __FIIterable_1_Windows__CApplicationModel__CPackage_AddRef
#define IIterable_Package_Release __FIIterable_1_Windows__CApplicationModel__CPackage_Release
#define IIterable_Package_GetIids __FIIterable_1_Windows__CApplicationModel__CPackage_GetIids
#define IIterable_Package_GetRuntimeClassName __FIIterable_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName
#define IIterable_Package_GetTrustLevel __FIIterable_1_Windows__CApplicationModel__CPackage_GetTrustLevel
#define IIterable_Package_First __FIIterable_1_Windows__CApplicationModel__CPackage_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::ApplicationModel::Package* > interface
 */
#ifndef ____FIIterator_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CApplicationModel__CPackage, 0x0217f069, 0x025c, 0x5ee6, 0xa8,0x7f, 0xe7,0x82,0xe3,0xb6,0x23,0xae);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0217f069-025c-5ee6-a87f-e782e3b623ae")
                IIterator<ABI::Windows::ApplicationModel::Package* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Package*, ABI::Windows::ApplicationModel::IPackage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CApplicationModel__CPackage, 0x0217f069, 0x025c, 0x5ee6, 0xa8,0x7f, 0xe7,0x82,0xe3,0xb6,0x23,0xae)
#endif
#else
typedef struct __FIIterator_1_Windows__CApplicationModel__CPackageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::ApplicationModel::Package* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        __x_ABI_CWindows_CApplicationModel_CIPackage **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CIPackage **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CApplicationModel__CPackageVtbl;

interface __FIIterator_1_Windows__CApplicationModel__CPackage {
    CONST_VTBL __FIIterator_1_Windows__CApplicationModel__CPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::ApplicationModel::Package* > methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CPackage_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_QueryInterface(__FIIterator_1_Windows__CApplicationModel__CPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CApplicationModel__CPackage_AddRef(__FIIterator_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CApplicationModel__CPackage_Release(__FIIterator_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_GetIids(__FIIterator_1_Windows__CApplicationModel__CPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(__FIIterator_1_Windows__CApplicationModel__CPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_GetTrustLevel(__FIIterator_1_Windows__CApplicationModel__CPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::ApplicationModel::Package* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_get_Current(__FIIterator_1_Windows__CApplicationModel__CPackage* This,__x_ABI_CWindows_CApplicationModel_CIPackage **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_get_HasCurrent(__FIIterator_1_Windows__CApplicationModel__CPackage* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_MoveNext(__FIIterator_1_Windows__CApplicationModel__CPackage* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_GetMany(__FIIterator_1_Windows__CApplicationModel__CPackage* This,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CIPackage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_Package IID___FIIterator_1_Windows__CApplicationModel__CPackage
#define IIterator_PackageVtbl __FIIterator_1_Windows__CApplicationModel__CPackageVtbl
#define IIterator_Package __FIIterator_1_Windows__CApplicationModel__CPackage
#define IIterator_Package_QueryInterface __FIIterator_1_Windows__CApplicationModel__CPackage_QueryInterface
#define IIterator_Package_AddRef __FIIterator_1_Windows__CApplicationModel__CPackage_AddRef
#define IIterator_Package_Release __FIIterator_1_Windows__CApplicationModel__CPackage_Release
#define IIterator_Package_GetIids __FIIterator_1_Windows__CApplicationModel__CPackage_GetIids
#define IIterator_Package_GetRuntimeClassName __FIIterator_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName
#define IIterator_Package_GetTrustLevel __FIIterator_1_Windows__CApplicationModel__CPackage_GetTrustLevel
#define IIterator_Package_get_Current __FIIterator_1_Windows__CApplicationModel__CPackage_get_Current
#define IIterator_Package_get_HasCurrent __FIIterator_1_Windows__CApplicationModel__CPackage_get_HasCurrent
#define IIterator_Package_MoveNext __FIIterator_1_Windows__CApplicationModel__CPackage_MoveNext
#define IIterator_Package_GetMany __FIIterator_1_Windows__CApplicationModel__CPackage_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::ApplicationModel::Package* > interface
 */
#ifndef ____FIVectorView_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CApplicationModel__CPackage, 0x0263c4d4, 0x195c, 0x5dc5, 0xa7,0xca, 0x68,0x06,0xce,0xca,0x42,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0263c4d4-195c-5dc5-a7ca-6806ceca420b")
                IVectorView<ABI::Windows::ApplicationModel::Package* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Package*, ABI::Windows::ApplicationModel::IPackage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CApplicationModel__CPackage, 0x0263c4d4, 0x195c, 0x5dc5, 0xa7,0xca, 0x68,0x06,0xce,0xca,0x42,0x0b)
#endif
#else
typedef struct __FIVectorView_1_Windows__CApplicationModel__CPackageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::ApplicationModel::Package* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        UINT32 index,
        __x_ABI_CWindows_CApplicationModel_CIPackage **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        __x_ABI_CWindows_CApplicationModel_CIPackage *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CIPackage **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CApplicationModel__CPackageVtbl;

interface __FIVectorView_1_Windows__CApplicationModel__CPackage {
    CONST_VTBL __FIVectorView_1_Windows__CApplicationModel__CPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::ApplicationModel::Package* > methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_QueryInterface(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CApplicationModel__CPackage_AddRef(__FIVectorView_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CApplicationModel__CPackage_Release(__FIVectorView_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetIids(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetTrustLevel(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::ApplicationModel::Package* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetAt(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,UINT32 index,__x_ABI_CWindows_CApplicationModel_CIPackage **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_get_Size(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_IndexOf(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,__x_ABI_CWindows_CApplicationModel_CIPackage *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetMany(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CIPackage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_Package IID___FIVectorView_1_Windows__CApplicationModel__CPackage
#define IVectorView_PackageVtbl __FIVectorView_1_Windows__CApplicationModel__CPackageVtbl
#define IVectorView_Package __FIVectorView_1_Windows__CApplicationModel__CPackage
#define IVectorView_Package_QueryInterface __FIVectorView_1_Windows__CApplicationModel__CPackage_QueryInterface
#define IVectorView_Package_AddRef __FIVectorView_1_Windows__CApplicationModel__CPackage_AddRef
#define IVectorView_Package_Release __FIVectorView_1_Windows__CApplicationModel__CPackage_Release
#define IVectorView_Package_GetIids __FIVectorView_1_Windows__CApplicationModel__CPackage_GetIids
#define IVectorView_Package_GetRuntimeClassName __FIVectorView_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName
#define IVectorView_Package_GetTrustLevel __FIVectorView_1_Windows__CApplicationModel__CPackage_GetTrustLevel
#define IVectorView_Package_GetAt __FIVectorView_1_Windows__CApplicationModel__CPackage_GetAt
#define IVectorView_Package_get_Size __FIVectorView_1_Windows__CApplicationModel__CPackage_get_Size
#define IVectorView_Package_IndexOf __FIVectorView_1_Windows__CApplicationModel__CPackage_IndexOf
#define IVectorView_Package_GetMany __FIVectorView_1_Windows__CApplicationModel__CPackage_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > interface
 */
#ifndef ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0x920c8b92, 0xd5ef, 0x5899, 0x87,0x76, 0x2a,0xd9,0x7a,0xca,0x6e,0x1d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("920c8b92-d5ef-5899-8776-2ad97aca6e1d")
                IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Core::AppListEntry*, ABI::Windows::ApplicationModel::Core::IAppListEntry* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0x920c8b92, 0xd5ef, 0x5899, 0x87,0x76, 0x2a,0xd9,0x7a,0xca,0x6e,0x1d)
#endif
#else
typedef struct __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        UINT32 index,
        __x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl;

interface __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry {
    CONST_VTBL __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetAt(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,UINT32 index,__x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Size(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_IndexOf(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetMany(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_AppListEntry IID___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IVectorView_AppListEntryVtbl __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl
#define IVectorView_AppListEntry __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IVectorView_AppListEntry_QueryInterface __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface
#define IVectorView_AppListEntry_AddRef __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef
#define IVectorView_AppListEntry_Release __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release
#define IVectorView_AppListEntry_GetIids __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids
#define IVectorView_AppListEntry_GetRuntimeClassName __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName
#define IVectorView_AppListEntry_GetTrustLevel __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel
#define IVectorView_AppListEntry_GetAt __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetAt
#define IVectorView_AppListEntry_get_Size __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Size
#define IVectorView_AppListEntry_IndexOf __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_IndexOf
#define IVectorView_AppListEntry_GetMany __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > interface
 */
#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0xd3bcf8a0, 0x3538, 0x5dae, 0x98,0xd7, 0x1f,0x2a,0xb8,0x8c,0x3f,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("d3bcf8a0-3538-5dae-98d7-1f2ab88c3f01")
            IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > : IAsyncOperation_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0xd3bcf8a0, 0x3538, 0x5dae, 0x98,0xd7, 0x1f,0x2a,0xb8,0x8c,0x3f,0x01)
#endif
#else
typedef struct __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **results);

    END_INTERFACE
} __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl;

interface __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry {
    CONST_VTBL __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_put_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetResults(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IVectorView_AppListEntry IID___FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IAsyncOperation_IVectorView_AppListEntryVtbl __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl
#define IAsyncOperation_IVectorView_AppListEntry __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IAsyncOperation_IVectorView_AppListEntry_QueryInterface __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface
#define IAsyncOperation_IVectorView_AppListEntry_AddRef __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef
#define IAsyncOperation_IVectorView_AppListEntry_Release __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release
#define IAsyncOperation_IVectorView_AppListEntry_GetIids __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids
#define IAsyncOperation_IVectorView_AppListEntry_GetRuntimeClassName __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName
#define IAsyncOperation_IVectorView_AppListEntry_GetTrustLevel __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel
#define IAsyncOperation_IVectorView_AppListEntry_put_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_put_Completed
#define IAsyncOperation_IVectorView_AppListEntry_get_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Completed
#define IAsyncOperation_IVectorView_AppListEntry_GetResults __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0x51c74372, 0x9452, 0x57ce, 0x92,0x70, 0x76,0x20,0x09,0xfb,0xfe,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("51c74372-9452-57ce-9270-762009fbfe4d")
            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0x51c74372, 0x9452, 0x57ce, 0x92,0x70, 0x76,0x20,0x09,0xfb,0xfe,0x4d)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl;

interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Invoke(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IVectorView_AppListEntry IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntryVtbl __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry_QueryInterface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry_AddRef __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry_Release __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry_Invoke __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_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_applicationmodel_h__ */
