/*** Autogenerated by WIDL 8.17 from include/windows.management.deployment.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_management_deployment_h__
#define __windows_management_deployment_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_CManagement_CDeployment_CIDeploymentResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult ABI::Windows::Management::Deployment::IDeploymentResult
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                interface IDeploymentResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager ABI::Windows::Management::Deployment::IPackageManager
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                interface IPackageManager;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 ABI::Windows::Management::Deployment::IPackageManager2
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                interface IPackageManager2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation ABI::Windows::Management::Deployment::IPackageUserInformation
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                interface IPackageUserInformation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CDeploymentResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CDeploymentResult_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                class DeploymentResult;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CManagement_CDeployment_CDeploymentResult __x_ABI_CWindows_CManagement_CDeployment_CDeploymentResult;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CManagement_CDeployment_CDeploymentResult_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CPackageManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CPackageManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                class PackageManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CManagement_CDeployment_CPackageManager __x_ABI_CWindows_CManagement_CDeployment_CPackageManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CManagement_CDeployment_CPackageManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CPackageUserInformation_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CPackageUserInformation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                class PackageUserInformation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CManagement_CDeployment_CPackageUserInformation __x_ABI_CWindows_CManagement_CDeployment_CPackageUserInformation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CManagement_CDeployment_CPackageUserInformation_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIIterable_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CFoundation__CUri __FIIterable_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIIterator_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CFoundation__CUri __FIIterator_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Uri* >
#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 ____FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_FWD_DEFINED__
#define ____FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Management::Deployment::PackageUserInformation* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_FWD_DEFINED__
#define ____FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Management::Deployment::PackageUserInformation* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_FWD_DEFINED__
#define ____FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_FWD_DEFINED__
typedef interface __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress;
#ifdef __cplusplus
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_FWD_DEFINED__
#define ____FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_FWD_DEFINED__
typedef interface __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress;
#ifdef __cplusplus
#define __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress ABI::Windows::Foundation::IAsyncOperationProgressHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_FWD_DEFINED__
#define ____FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_FWD_DEFINED__
typedef interface __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress;
#ifdef __cplusplus
#define __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <windows.foundation.h>
#include <windows.applicationmodel.h>

#ifdef __cplusplus
extern "C" {
#endif

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

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

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

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

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

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

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CManagement_CDeployment_CDeploymentProgress __x_ABI_CWindows_CManagement_CDeployment_CDeploymentProgress;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                typedef struct DeploymentProgress DeploymentProgress;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult ABI::Windows::Management::Deployment::IDeploymentResult
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                interface IDeploymentResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager ABI::Windows::Management::Deployment::IPackageManager
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                interface IPackageManager;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 ABI::Windows::Management::Deployment::IPackageManager2
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                interface IPackageManager2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_FWD_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation ABI::Windows::Management::Deployment::IPackageUserInformation
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                interface IPackageUserInformation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIIterable_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CFoundation__CUri __FIIterable_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIIterator_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CFoundation__CUri __FIIterator_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Uri* >
#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 ____FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_FWD_DEFINED__
#define ____FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Management::Deployment::PackageUserInformation* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_FWD_DEFINED__
#define ____FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Management::Deployment::PackageUserInformation* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_FWD_DEFINED__
#define ____FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_FWD_DEFINED__
typedef interface __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress;
#ifdef __cplusplus
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                enum DeploymentOptions {
                    DeploymentOptions_None = 0x0,
                    DeploymentOptions_ForceApplicationShutdown = 0x1,
                    DeploymentOptions_DevelopmentMode = 0x2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    DeploymentOptions_InstallAllResources = 0x20,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    DeploymentOptions_ForceTargetApplicationShutdown = 0x40,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
                    DeploymentOptions_RequiredContentGroupOnly = 0x100,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
                    DeploymentOptions_ForceUpdateFromAnyVersion = 0x40000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
                    DeploymentOptions_RetainFilesOnFailure = 0x200000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
                    DeploymentOptions_StageInPlace = 0x400000
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions {
    DeploymentOptions_None = 0x0,
    DeploymentOptions_ForceApplicationShutdown = 0x1,
    DeploymentOptions_DevelopmentMode = 0x2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    DeploymentOptions_InstallAllResources = 0x20,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    DeploymentOptions_ForceTargetApplicationShutdown = 0x40,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
    DeploymentOptions_RequiredContentGroupOnly = 0x100,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
    DeploymentOptions_ForceUpdateFromAnyVersion = 0x40000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
    DeploymentOptions_RetainFilesOnFailure = 0x200000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
    DeploymentOptions_StageInPlace = 0x400000
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */
};
#ifdef WIDL_using_Windows_Management_Deployment
#define DeploymentOptions __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                enum DeploymentProgressState {
                    DeploymentProgressState_Queued = 0,
                    DeploymentProgressState_Processing = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentProgressState {
    DeploymentProgressState_Queued = 0,
    DeploymentProgressState_Processing = 1
};
#ifdef WIDL_using_Windows_Management_Deployment
#define DeploymentProgressState __x_ABI_CWindows_CManagement_CDeployment_CDeploymentProgressState
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                enum PackageInstallState {
                    PackageInstallState_NotInstalled = 0,
                    PackageInstallState_Staged = 1,
                    PackageInstallState_Installed = 2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
                    PackageInstallState_Paused = 6
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CManagement_CDeployment_CPackageInstallState {
    PackageInstallState_NotInstalled = 0,
    PackageInstallState_Staged = 1,
    PackageInstallState_Installed = 2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
    PackageInstallState_Paused = 6
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
};
#ifdef WIDL_using_Windows_Management_Deployment
#define PackageInstallState __x_ABI_CWindows_CManagement_CDeployment_CPackageInstallState
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                enum PackageState {
                    PackageState_Normal = 0,
                    PackageState_LicenseInvalid = 1,
                    PackageState_Modified = 2,
                    PackageState_Tampered = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CManagement_CDeployment_CPackageState {
    PackageState_Normal = 0,
    PackageState_LicenseInvalid = 1,
    PackageState_Modified = 2,
    PackageState_Tampered = 3
};
#ifdef WIDL_using_Windows_Management_Deployment
#define PackageState __x_ABI_CWindows_CManagement_CDeployment_CPackageState
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                enum PackageTypes {
                    PackageTypes_None = 0x0,
                    PackageTypes_Main = 0x1,
                    PackageTypes_Framework = 0x2,
                    PackageTypes_Resource = 0x4,
                    PackageTypes_Bundle = 0x8,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    PackageTypes_Xap = 0x10,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
                    PackageTypes_Optional = 0x20,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
                    PackageTypes_All = 0xffffffff
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes {
    PackageTypes_None = 0x0,
    PackageTypes_Main = 0x1,
    PackageTypes_Framework = 0x2,
    PackageTypes_Resource = 0x4,
    PackageTypes_Bundle = 0x8,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    PackageTypes_Xap = 0x10,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
    PackageTypes_Optional = 0x20,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
    PackageTypes_All = 0xffffffff
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */
};
#ifdef WIDL_using_Windows_Management_Deployment
#define PackageTypes __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                enum RemovalOptions {
                    RemovalOptions_None = 0x0,
                    RemovalOptions_PreserveApplicationData = 0x1000,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
                    RemovalOptions_PreserveRoamableApplicationData = 0x80,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
                    RemovalOptions_RemoveForAllUsers = 0x80000
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CManagement_CDeployment_CRemovalOptions {
    RemovalOptions_None = 0x0,
    RemovalOptions_PreserveApplicationData = 0x1000,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
    RemovalOptions_PreserveRoamableApplicationData = 0x80,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
    RemovalOptions_RemoveForAllUsers = 0x80000
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
};
#ifdef WIDL_using_Windows_Management_Deployment
#define RemovalOptions __x_ABI_CWindows_CManagement_CDeployment_CRemovalOptions
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                struct DeploymentProgress {
                    enum DeploymentProgressState state;
                    UINT32 percentage;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CManagement_CDeployment_CDeploymentProgress {
    enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentProgressState state;
    UINT32 percentage;
};
#ifdef WIDL_using_Windows_Management_Deployment
#define DeploymentProgress __x_ABI_CWindows_CManagement_CDeployment_CDeploymentProgress
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IDeploymentResult interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult, 0x2563b9ae, 0xb77d, 0x4c1f, 0x8a,0x7b, 0x20,0xe6,0xad,0x51,0x5e,0xf3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                MIDL_INTERFACE("2563b9ae-b77d-4c1f-8a7b-20e6ad515ef3")
                IDeploymentResult : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ErrorText(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ActivityId(
                        GUID *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExtendedErrorCode(
                        HRESULT *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult, 0x2563b9ae, 0xb77d, 0x4c1f, 0x8a,0x7b, 0x20,0xe6,0xad,0x51,0x5e,0xf3)
#endif
#else
typedef struct __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDeploymentResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ErrorText)(
        __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_ActivityId)(
        __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult *This,
        GUID *value);

    HRESULT (STDMETHODCALLTYPE *get_ExtendedErrorCode)(
        __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult *This,
        HRESULT *value);

    END_INTERFACE
} __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResultVtbl;

interface __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult {
    CONST_VTBL __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDeploymentResult methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_get_ErrorText(This,value) (This)->lpVtbl->get_ErrorText(This,value)
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_get_ActivityId(This,value) (This)->lpVtbl->get_ActivityId(This,value)
#define __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_get_ExtendedErrorCode(This,value) (This)->lpVtbl->get_ExtendedErrorCode(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_QueryInterface(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_AddRef(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_Release(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_GetIids(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_GetRuntimeClassName(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_GetTrustLevel(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDeploymentResult methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_get_ErrorText(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult* This,HSTRING *value) {
    return This->lpVtbl->get_ErrorText(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_get_ActivityId(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult* This,GUID *value) {
    return This->lpVtbl->get_ActivityId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_get_ExtendedErrorCode(__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult* This,HRESULT *value) {
    return This->lpVtbl->get_ExtendedErrorCode(This,value);
}
#endif
#ifdef WIDL_using_Windows_Management_Deployment
#define IID_IDeploymentResult IID___x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult
#define IDeploymentResultVtbl __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResultVtbl
#define IDeploymentResult __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult
#define IDeploymentResult_QueryInterface __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_QueryInterface
#define IDeploymentResult_AddRef __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_AddRef
#define IDeploymentResult_Release __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_Release
#define IDeploymentResult_GetIids __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_GetIids
#define IDeploymentResult_GetRuntimeClassName __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_GetRuntimeClassName
#define IDeploymentResult_GetTrustLevel __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_GetTrustLevel
#define IDeploymentResult_get_ErrorText __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_get_ErrorText
#define IDeploymentResult_get_ActivityId __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_get_ActivityId
#define IDeploymentResult_get_ExtendedErrorCode __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult_get_ExtendedErrorCode
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif

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

/*****************************************************************************
 * IPackageManager interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CManagement_CDeployment_CIPackageManager, 0x9a7d4b65, 0x5e8f, 0x4fc7, 0xa2,0xe5, 0x7f,0x69,0x25,0xcb,0x8b,0x53);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                MIDL_INTERFACE("9a7d4b65-5e8f-4fc7-a2e5-7f6925cb8b53")
                IPackageManager : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE AddPackageAsync(
                        ABI::Windows::Foundation::IUriRuntimeClass *uri,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* > *dependencies,
                        enum DeploymentOptions options,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE UpdatePackageAsync(
                        ABI::Windows::Foundation::IUriRuntimeClass *uri,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* > *dependencies,
                        enum DeploymentOptions options,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemovePackageAsync(
                        HSTRING name,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StagePackageAsync(
                        ABI::Windows::Foundation::IUriRuntimeClass *uri,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* > *dependencies,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RegisterPackageAsync(
                        ABI::Windows::Foundation::IUriRuntimeClass *uri,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* > *dependencies,
                        enum DeploymentOptions options,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackages(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByUserSecurityId(
                        HSTRING sid,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByNamePublisher(
                        HSTRING name,
                        HSTRING publisher,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByUserSecurityIdNamePublisher(
                        HSTRING sid,
                        HSTRING name,
                        HSTRING publisher,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindUsers(
                        HSTRING name,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Management::Deployment::PackageUserInformation* > **users) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetPackageState(
                        HSTRING name,
                        enum PackageState state) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackageByPackageFullName(
                        HSTRING name,
                        ABI::Windows::ApplicationModel::IPackage **package) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CleanupPackageForUserAsync(
                        HSTRING name,
                        HSTRING sid,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByPackageFamilyName(
                        HSTRING family_name,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByUserSecurityIdPackageFamilyName(
                        HSTRING sid,
                        HSTRING family_name,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackageByUserSecurityIdPackageFullName(
                        HSTRING sid,
                        HSTRING name,
                        ABI::Windows::ApplicationModel::IPackage **package) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager, 0x9a7d4b65, 0x5e8f, 0x4fc7, 0xa2,0xe5, 0x7f,0x69,0x25,0xcb,0x8b,0x53)
#endif
#else
typedef struct __x_ABI_CWindows_CManagement_CDeployment_CIPackageManagerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackageManager methods ***/
    HRESULT (STDMETHODCALLTYPE *AddPackageAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __FIIterable_1_Windows__CFoundation__CUri *dependencies,
        enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    HRESULT (STDMETHODCALLTYPE *UpdatePackageAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __FIIterable_1_Windows__CFoundation__CUri *dependencies,
        enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    HRESULT (STDMETHODCALLTYPE *RemovePackageAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING name,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    HRESULT (STDMETHODCALLTYPE *StagePackageAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __FIIterable_1_Windows__CFoundation__CUri *dependencies,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    HRESULT (STDMETHODCALLTYPE *RegisterPackageAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __FIIterable_1_Windows__CFoundation__CUri *dependencies,
        enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    HRESULT (STDMETHODCALLTYPE *FindPackages)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByUserSecurityId)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING sid,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByNamePublisher)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING name,
        HSTRING publisher,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByUserSecurityIdNamePublisher)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING sid,
        HSTRING name,
        HSTRING publisher,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindUsers)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING name,
        __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation **users);

    HRESULT (STDMETHODCALLTYPE *SetPackageState)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING name,
        enum __x_ABI_CWindows_CManagement_CDeployment_CPackageState state);

    HRESULT (STDMETHODCALLTYPE *FindPackageByPackageFullName)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING name,
        __x_ABI_CWindows_CApplicationModel_CIPackage **package);

    HRESULT (STDMETHODCALLTYPE *CleanupPackageForUserAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING name,
        HSTRING sid,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByPackageFamilyName)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING family_name,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByUserSecurityIdPackageFamilyName)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING sid,
        HSTRING family_name,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackageByUserSecurityIdPackageFullName)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager *This,
        HSTRING sid,
        HSTRING name,
        __x_ABI_CWindows_CApplicationModel_CIPackage **package);

    END_INTERFACE
} __x_ABI_CWindows_CManagement_CDeployment_CIPackageManagerVtbl;

interface __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager {
    CONST_VTBL __x_ABI_CWindows_CManagement_CDeployment_CIPackageManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageManager methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_AddPackageAsync(This,uri,dependencies,options,operation) (This)->lpVtbl->AddPackageAsync(This,uri,dependencies,options,operation)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_UpdatePackageAsync(This,uri,dependencies,options,operation) (This)->lpVtbl->UpdatePackageAsync(This,uri,dependencies,options,operation)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_RemovePackageAsync(This,name,operation) (This)->lpVtbl->RemovePackageAsync(This,name,operation)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_StagePackageAsync(This,uri,dependencies,operation) (This)->lpVtbl->StagePackageAsync(This,uri,dependencies,operation)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_RegisterPackageAsync(This,uri,dependencies,options,operation) (This)->lpVtbl->RegisterPackageAsync(This,uri,dependencies,options,operation)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackages(This,packages) (This)->lpVtbl->FindPackages(This,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByUserSecurityId(This,sid,packages) (This)->lpVtbl->FindPackagesByUserSecurityId(This,sid,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByNamePublisher(This,name,publisher,packages) (This)->lpVtbl->FindPackagesByNamePublisher(This,name,publisher,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByUserSecurityIdNamePublisher(This,sid,name,publisher,packages) (This)->lpVtbl->FindPackagesByUserSecurityIdNamePublisher(This,sid,name,publisher,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindUsers(This,name,users) (This)->lpVtbl->FindUsers(This,name,users)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_SetPackageState(This,name,state) (This)->lpVtbl->SetPackageState(This,name,state)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackageByPackageFullName(This,name,package) (This)->lpVtbl->FindPackageByPackageFullName(This,name,package)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_CleanupPackageForUserAsync(This,name,sid,operation) (This)->lpVtbl->CleanupPackageForUserAsync(This,name,sid,operation)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByPackageFamilyName(This,family_name,packages) (This)->lpVtbl->FindPackagesByPackageFamilyName(This,family_name,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByUserSecurityIdPackageFamilyName(This,sid,family_name,packages) (This)->lpVtbl->FindPackagesByUserSecurityIdPackageFamilyName(This,sid,family_name,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackageByUserSecurityIdPackageFullName(This,sid,name,package) (This)->lpVtbl->FindPackageByUserSecurityIdPackageFullName(This,sid,name,package)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_QueryInterface(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_AddRef(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_Release(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_GetIids(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_GetRuntimeClassName(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_GetTrustLevel(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageManager methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_AddPackageAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__FIIterable_1_Windows__CFoundation__CUri *dependencies,enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->AddPackageAsync(This,uri,dependencies,options,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_UpdatePackageAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__FIIterable_1_Windows__CFoundation__CUri *dependencies,enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->UpdatePackageAsync(This,uri,dependencies,options,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_RemovePackageAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING name,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->RemovePackageAsync(This,name,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_StagePackageAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__FIIterable_1_Windows__CFoundation__CUri *dependencies,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->StagePackageAsync(This,uri,dependencies,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_RegisterPackageAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__FIIterable_1_Windows__CFoundation__CUri *dependencies,enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->RegisterPackageAsync(This,uri,dependencies,options,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackages(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackages(This,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByUserSecurityId(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING sid,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByUserSecurityId(This,sid,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByNamePublisher(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING name,HSTRING publisher,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByNamePublisher(This,name,publisher,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByUserSecurityIdNamePublisher(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING sid,HSTRING name,HSTRING publisher,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByUserSecurityIdNamePublisher(This,sid,name,publisher,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindUsers(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING name,__FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation **users) {
    return This->lpVtbl->FindUsers(This,name,users);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_SetPackageState(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING name,enum __x_ABI_CWindows_CManagement_CDeployment_CPackageState state) {
    return This->lpVtbl->SetPackageState(This,name,state);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackageByPackageFullName(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING name,__x_ABI_CWindows_CApplicationModel_CIPackage **package) {
    return This->lpVtbl->FindPackageByPackageFullName(This,name,package);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_CleanupPackageForUserAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING name,HSTRING sid,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->CleanupPackageForUserAsync(This,name,sid,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByPackageFamilyName(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING family_name,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByPackageFamilyName(This,family_name,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByUserSecurityIdPackageFamilyName(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING sid,HSTRING family_name,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByUserSecurityIdPackageFamilyName(This,sid,family_name,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackageByUserSecurityIdPackageFullName(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager* This,HSTRING sid,HSTRING name,__x_ABI_CWindows_CApplicationModel_CIPackage **package) {
    return This->lpVtbl->FindPackageByUserSecurityIdPackageFullName(This,sid,name,package);
}
#endif
#ifdef WIDL_using_Windows_Management_Deployment
#define IID_IPackageManager IID___x_ABI_CWindows_CManagement_CDeployment_CIPackageManager
#define IPackageManagerVtbl __x_ABI_CWindows_CManagement_CDeployment_CIPackageManagerVtbl
#define IPackageManager __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager
#define IPackageManager_QueryInterface __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_QueryInterface
#define IPackageManager_AddRef __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_AddRef
#define IPackageManager_Release __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_Release
#define IPackageManager_GetIids __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_GetIids
#define IPackageManager_GetRuntimeClassName __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_GetRuntimeClassName
#define IPackageManager_GetTrustLevel __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_GetTrustLevel
#define IPackageManager_AddPackageAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_AddPackageAsync
#define IPackageManager_UpdatePackageAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_UpdatePackageAsync
#define IPackageManager_RemovePackageAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_RemovePackageAsync
#define IPackageManager_StagePackageAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_StagePackageAsync
#define IPackageManager_RegisterPackageAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_RegisterPackageAsync
#define IPackageManager_FindPackages __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackages
#define IPackageManager_FindPackagesByUserSecurityId __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByUserSecurityId
#define IPackageManager_FindPackagesByNamePublisher __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByNamePublisher
#define IPackageManager_FindPackagesByUserSecurityIdNamePublisher __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByUserSecurityIdNamePublisher
#define IPackageManager_FindUsers __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindUsers
#define IPackageManager_SetPackageState __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_SetPackageState
#define IPackageManager_FindPackageByPackageFullName __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackageByPackageFullName
#define IPackageManager_CleanupPackageForUserAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_CleanupPackageForUserAsync
#define IPackageManager_FindPackagesByPackageFamilyName __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByPackageFamilyName
#define IPackageManager_FindPackagesByUserSecurityIdPackageFamilyName __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackagesByUserSecurityIdPackageFamilyName
#define IPackageManager_FindPackageByUserSecurityIdPackageFullName __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager_FindPackageByUserSecurityIdPackageFullName
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif

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

/*****************************************************************************
 * IPackageManager2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2, 0xf7aad08d, 0x0840, 0x46f2, 0xb5,0xd8, 0xca,0xd4,0x76,0x93,0xa0,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                MIDL_INTERFACE("f7aad08d-0840-46f2-b5d8-cad47693a095")
                IPackageManager2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE RemovePackageWithOptionsAsync(
                        HSTRING name,
                        enum RemovalOptions options,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StagePackageWithOptionsAsync(
                        ABI::Windows::Foundation::IUriRuntimeClass *uri,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* > *dependencies,
                        enum DeploymentOptions options,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RegisterPackageByFullNameAsync(
                        HSTRING name,
                        ABI::Windows::Foundation::Collections::IIterable<HSTRING > *dependencies,
                        enum DeploymentOptions options,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesWithPackageTypes(
                        enum PackageTypes types,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByUserSecurityIdWithPackageTypes(
                        HSTRING sid,
                        enum PackageTypes types,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByNamePublisherWithPackageTypes(
                        HSTRING name,
                        HSTRING publisher,
                        enum PackageTypes types,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByUserSecurityIdNamePublisherWithPackageTypes(
                        HSTRING sid,
                        HSTRING name,
                        HSTRING publisher,
                        enum PackageTypes types,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByPackageFamilyNameWithPackageTypes(
                        HSTRING family_name,
                        enum PackageTypes types,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindPackagesByUserSecurityIdPackageFamilyNameWithPackageTypes(
                        HSTRING sid,
                        HSTRING family_name,
                        enum PackageTypes types,
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* > **packages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StageUserDataAsync(
                        HSTRING name,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2, 0xf7aad08d, 0x0840, 0x46f2, 0xb5,0xd8, 0xca,0xd4,0x76,0x93,0xa0,0x95)
#endif
#else
typedef struct __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackageManager2 methods ***/
    HRESULT (STDMETHODCALLTYPE *RemovePackageWithOptionsAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        HSTRING name,
        enum __x_ABI_CWindows_CManagement_CDeployment_CRemovalOptions options,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    HRESULT (STDMETHODCALLTYPE *StagePackageWithOptionsAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __FIIterable_1_Windows__CFoundation__CUri *dependencies,
        enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    HRESULT (STDMETHODCALLTYPE *RegisterPackageByFullNameAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        HSTRING name,
        __FIIterable_1_HSTRING *dependencies,
        enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    HRESULT (STDMETHODCALLTYPE *FindPackagesWithPackageTypes)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByUserSecurityIdWithPackageTypes)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        HSTRING sid,
        enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByNamePublisherWithPackageTypes)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        HSTRING name,
        HSTRING publisher,
        enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByUserSecurityIdNamePublisherWithPackageTypes)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        HSTRING sid,
        HSTRING name,
        HSTRING publisher,
        enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByPackageFamilyNameWithPackageTypes)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        HSTRING family_name,
        enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *FindPackagesByUserSecurityIdPackageFamilyNameWithPackageTypes)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        HSTRING sid,
        HSTRING family_name,
        enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,
        __FIIterable_1_Windows__CApplicationModel__CPackage **packages);

    HRESULT (STDMETHODCALLTYPE *StageUserDataAsync)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 *This,
        HSTRING name,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation);

    END_INTERFACE
} __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2Vtbl;

interface __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2 {
    CONST_VTBL __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageManager2 methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_RemovePackageWithOptionsAsync(This,name,options,operation) (This)->lpVtbl->RemovePackageWithOptionsAsync(This,name,options,operation)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_StagePackageWithOptionsAsync(This,uri,dependencies,options,operation) (This)->lpVtbl->StagePackageWithOptionsAsync(This,uri,dependencies,options,operation)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_RegisterPackageByFullNameAsync(This,name,dependencies,options,operation) (This)->lpVtbl->RegisterPackageByFullNameAsync(This,name,dependencies,options,operation)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesWithPackageTypes(This,types,packages) (This)->lpVtbl->FindPackagesWithPackageTypes(This,types,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByUserSecurityIdWithPackageTypes(This,sid,types,packages) (This)->lpVtbl->FindPackagesByUserSecurityIdWithPackageTypes(This,sid,types,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByNamePublisherWithPackageTypes(This,name,publisher,types,packages) (This)->lpVtbl->FindPackagesByNamePublisherWithPackageTypes(This,name,publisher,types,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByUserSecurityIdNamePublisherWithPackageTypes(This,sid,name,publisher,types,packages) (This)->lpVtbl->FindPackagesByUserSecurityIdNamePublisherWithPackageTypes(This,sid,name,publisher,types,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByPackageFamilyNameWithPackageTypes(This,family_name,types,packages) (This)->lpVtbl->FindPackagesByPackageFamilyNameWithPackageTypes(This,family_name,types,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByUserSecurityIdPackageFamilyNameWithPackageTypes(This,sid,family_name,types,packages) (This)->lpVtbl->FindPackagesByUserSecurityIdPackageFamilyNameWithPackageTypes(This,sid,family_name,types,packages)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_StageUserDataAsync(This,name,operation) (This)->lpVtbl->StageUserDataAsync(This,name,operation)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_QueryInterface(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_AddRef(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_Release(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_GetIids(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_GetRuntimeClassName(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_GetTrustLevel(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageManager2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_RemovePackageWithOptionsAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,HSTRING name,enum __x_ABI_CWindows_CManagement_CDeployment_CRemovalOptions options,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->RemovePackageWithOptionsAsync(This,name,options,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_StagePackageWithOptionsAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__FIIterable_1_Windows__CFoundation__CUri *dependencies,enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->StagePackageWithOptionsAsync(This,uri,dependencies,options,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_RegisterPackageByFullNameAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,HSTRING name,__FIIterable_1_HSTRING *dependencies,enum __x_ABI_CWindows_CManagement_CDeployment_CDeploymentOptions options,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->RegisterPackageByFullNameAsync(This,name,dependencies,options,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesWithPackageTypes(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesWithPackageTypes(This,types,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByUserSecurityIdWithPackageTypes(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,HSTRING sid,enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByUserSecurityIdWithPackageTypes(This,sid,types,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByNamePublisherWithPackageTypes(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,HSTRING name,HSTRING publisher,enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByNamePublisherWithPackageTypes(This,name,publisher,types,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByUserSecurityIdNamePublisherWithPackageTypes(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,HSTRING sid,HSTRING name,HSTRING publisher,enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByUserSecurityIdNamePublisherWithPackageTypes(This,sid,name,publisher,types,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByPackageFamilyNameWithPackageTypes(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,HSTRING family_name,enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByPackageFamilyNameWithPackageTypes(This,family_name,types,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByUserSecurityIdPackageFamilyNameWithPackageTypes(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,HSTRING sid,HSTRING family_name,enum __x_ABI_CWindows_CManagement_CDeployment_CPackageTypes types,__FIIterable_1_Windows__CApplicationModel__CPackage **packages) {
    return This->lpVtbl->FindPackagesByUserSecurityIdPackageFamilyNameWithPackageTypes(This,sid,family_name,types,packages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_StageUserDataAsync(__x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2* This,HSTRING name,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **operation) {
    return This->lpVtbl->StageUserDataAsync(This,name,operation);
}
#endif
#ifdef WIDL_using_Windows_Management_Deployment
#define IID_IPackageManager2 IID___x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2
#define IPackageManager2Vtbl __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2Vtbl
#define IPackageManager2 __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2
#define IPackageManager2_QueryInterface __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_QueryInterface
#define IPackageManager2_AddRef __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_AddRef
#define IPackageManager2_Release __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_Release
#define IPackageManager2_GetIids __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_GetIids
#define IPackageManager2_GetRuntimeClassName __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_GetRuntimeClassName
#define IPackageManager2_GetTrustLevel __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_GetTrustLevel
#define IPackageManager2_RemovePackageWithOptionsAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_RemovePackageWithOptionsAsync
#define IPackageManager2_StagePackageWithOptionsAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_StagePackageWithOptionsAsync
#define IPackageManager2_RegisterPackageByFullNameAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_RegisterPackageByFullNameAsync
#define IPackageManager2_FindPackagesWithPackageTypes __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesWithPackageTypes
#define IPackageManager2_FindPackagesByUserSecurityIdWithPackageTypes __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByUserSecurityIdWithPackageTypes
#define IPackageManager2_FindPackagesByNamePublisherWithPackageTypes __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByNamePublisherWithPackageTypes
#define IPackageManager2_FindPackagesByUserSecurityIdNamePublisherWithPackageTypes __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByUserSecurityIdNamePublisherWithPackageTypes
#define IPackageManager2_FindPackagesByPackageFamilyNameWithPackageTypes __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByPackageFamilyNameWithPackageTypes
#define IPackageManager2_FindPackagesByUserSecurityIdPackageFamilyNameWithPackageTypes __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_FindPackagesByUserSecurityIdPackageFamilyNameWithPackageTypes
#define IPackageManager2_StageUserDataAsync __x_ABI_CWindows_CManagement_CDeployment_CIPackageManager2_StageUserDataAsync
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif

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

/*****************************************************************************
 * IPackageUserInformation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation, 0xf6383423, 0xfa09, 0x4cbc, 0x90,0x55, 0x15,0xca,0x27,0x5e,0x2e,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Management {
            namespace Deployment {
                MIDL_INTERFACE("f6383423-fa09-4cbc-9055-15ca275e2e7e")
                IPackageUserInformation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_UserSecurityId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_InstallState(
                        enum PackageInstallState *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation, 0xf6383423, 0xfa09, 0x4cbc, 0x90,0x55, 0x15,0xca,0x27,0x5e,0x2e,0x7e)
#endif
#else
typedef struct __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPackageUserInformation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UserSecurityId)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_InstallState)(
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation *This,
        enum __x_ABI_CWindows_CManagement_CDeployment_CPackageInstallState *value);

    END_INTERFACE
} __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformationVtbl;

interface __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation {
    CONST_VTBL __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageUserInformation methods ***/
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_get_UserSecurityId(This,value) (This)->lpVtbl->get_UserSecurityId(This,value)
#define __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_get_InstallState(This,value) (This)->lpVtbl->get_InstallState(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_QueryInterface(__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_AddRef(__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_Release(__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_GetIids(__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_GetRuntimeClassName(__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_GetTrustLevel(__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageUserInformation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_get_UserSecurityId(__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation* This,HSTRING *value) {
    return This->lpVtbl->get_UserSecurityId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_get_InstallState(__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation* This,enum __x_ABI_CWindows_CManagement_CDeployment_CPackageInstallState *value) {
    return This->lpVtbl->get_InstallState(This,value);
}
#endif
#ifdef WIDL_using_Windows_Management_Deployment
#define IID_IPackageUserInformation IID___x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation
#define IPackageUserInformationVtbl __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformationVtbl
#define IPackageUserInformation __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation
#define IPackageUserInformation_QueryInterface __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_QueryInterface
#define IPackageUserInformation_AddRef __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_AddRef
#define IPackageUserInformation_Release __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_Release
#define IPackageUserInformation_GetIids __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_GetIids
#define IPackageUserInformation_GetRuntimeClassName __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_GetRuntimeClassName
#define IPackageUserInformation_GetTrustLevel __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_GetTrustLevel
#define IPackageUserInformation_get_UserSecurityId __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_get_UserSecurityId
#define IPackageUserInformation_get_InstallState __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation_get_InstallState
#endif /* WIDL_using_Windows_Management_Deployment */
#endif

#endif

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

/*
 * Class Windows.Management.Deployment.DeploymentResult
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Management_Deployment_DeploymentResult_DEFINED
#define RUNTIMECLASS_Windows_Management_Deployment_DeploymentResult_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Management_Deployment_DeploymentResult[] = {'W','i','n','d','o','w','s','.','M','a','n','a','g','e','m','e','n','t','.','D','e','p','l','o','y','m','e','n','t','.','D','e','p','l','o','y','m','e','n','t','R','e','s','u','l','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Management_Deployment_DeploymentResult[] = L"Windows.Management.Deployment.DeploymentResult";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Management_Deployment_DeploymentResult[] = {'W','i','n','d','o','w','s','.','M','a','n','a','g','e','m','e','n','t','.','D','e','p','l','o','y','m','e','n','t','.','D','e','p','l','o','y','m','e','n','t','R','e','s','u','l','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Management_Deployment_DeploymentResult_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

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

/*
 * Class Windows.Management.Deployment.PackageUserInformation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Management_Deployment_PackageUserInformation_DEFINED
#define RUNTIMECLASS_Windows_Management_Deployment_PackageUserInformation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Management_Deployment_PackageUserInformation[] = {'W','i','n','d','o','w','s','.','M','a','n','a','g','e','m','e','n','t','.','D','e','p','l','o','y','m','e','n','t','.','P','a','c','k','a','g','e','U','s','e','r','I','n','f','o','r','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Management_Deployment_PackageUserInformation[] = L"Windows.Management.Deployment.PackageUserInformation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Management_Deployment_PackageUserInformation[] = {'W','i','n','d','o','w','s','.','M','a','n','a','g','e','m','e','n','t','.','D','e','p','l','o','y','m','e','n','t','.','P','a','c','k','a','g','e','U','s','e','r','I','n','f','o','r','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Management_Deployment_PackageUserInformation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Foundation::Uri* > interface
 */
#ifndef ____FIIterable_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CFoundation__CUri, 0xb0d63b78, 0x78ad, 0x5e31, 0xb6,0xd8, 0xe3,0x2a,0x0e,0x16,0xc4,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("b0d63b78-78ad-5e31-b6d8-e32a0e16c447")
                IIterable<ABI::Windows::Foundation::Uri* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Foundation::Uri*, ABI::Windows::Foundation::IUriRuntimeClass* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CFoundation__CUri, 0xb0d63b78, 0x78ad, 0x5e31, 0xb6,0xd8, 0xe3,0x2a,0x0e,0x16,0xc4,0x47)
#endif
#else
typedef struct __FIIterable_1_Windows__CFoundation__CUriVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Foundation::Uri* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CFoundation__CUri *This,
        __FIIterator_1_Windows__CFoundation__CUri **value);

    END_INTERFACE
} __FIIterable_1_Windows__CFoundation__CUriVtbl;

interface __FIIterable_1_Windows__CFoundation__CUri {
    CONST_VTBL __FIIterable_1_Windows__CFoundation__CUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CFoundation__CUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CFoundation__CUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CFoundation__CUri_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CFoundation__CUri_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CFoundation__CUri_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CFoundation__CUri_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Foundation::Uri* > methods ***/
#define __FIIterable_1_Windows__CFoundation__CUri_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CFoundation__CUri_QueryInterface(__FIIterable_1_Windows__CFoundation__CUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CFoundation__CUri_AddRef(__FIIterable_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CFoundation__CUri_Release(__FIIterable_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CFoundation__CUri_GetIids(__FIIterable_1_Windows__CFoundation__CUri* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CFoundation__CUri_GetRuntimeClassName(__FIIterable_1_Windows__CFoundation__CUri* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CFoundation__CUri_GetTrustLevel(__FIIterable_1_Windows__CFoundation__CUri* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Foundation::Uri* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CFoundation__CUri_First(__FIIterable_1_Windows__CFoundation__CUri* This,__FIIterator_1_Windows__CFoundation__CUri **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_Uri IID___FIIterable_1_Windows__CFoundation__CUri
#define IIterable_UriVtbl __FIIterable_1_Windows__CFoundation__CUriVtbl
#define IIterable_Uri __FIIterable_1_Windows__CFoundation__CUri
#define IIterable_Uri_QueryInterface __FIIterable_1_Windows__CFoundation__CUri_QueryInterface
#define IIterable_Uri_AddRef __FIIterable_1_Windows__CFoundation__CUri_AddRef
#define IIterable_Uri_Release __FIIterable_1_Windows__CFoundation__CUri_Release
#define IIterable_Uri_GetIids __FIIterable_1_Windows__CFoundation__CUri_GetIids
#define IIterable_Uri_GetRuntimeClassName __FIIterable_1_Windows__CFoundation__CUri_GetRuntimeClassName
#define IIterable_Uri_GetTrustLevel __FIIterable_1_Windows__CFoundation__CUri_GetTrustLevel
#define IIterable_Uri_First __FIIterable_1_Windows__CFoundation__CUri_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Foundation::Uri* > interface
 */
#ifndef ____FIIterator_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CFoundation__CUri, 0x1c157d0f, 0x5efe, 0x5cec, 0xbb,0xd6, 0x0c,0x6c,0xe9,0xaf,0x07,0xa5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("1c157d0f-5efe-5cec-bbd6-0c6ce9af07a5")
                IIterator<ABI::Windows::Foundation::Uri* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Foundation::Uri*, ABI::Windows::Foundation::IUriRuntimeClass* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CFoundation__CUri, 0x1c157d0f, 0x5efe, 0x5cec, 0xbb,0xd6, 0x0c,0x6c,0xe9,0xaf,0x07,0xa5)
#endif
#else
typedef struct __FIIterator_1_Windows__CFoundation__CUriVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Foundation::Uri* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CFoundation__CUri *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CFoundation__CUri *This,
        UINT32 items_size,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CFoundation__CUriVtbl;

interface __FIIterator_1_Windows__CFoundation__CUri {
    CONST_VTBL __FIIterator_1_Windows__CFoundation__CUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CFoundation__CUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CFoundation__CUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CFoundation__CUri_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CFoundation__CUri_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CFoundation__CUri_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CFoundation__CUri_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Foundation::Uri* > methods ***/
#define __FIIterator_1_Windows__CFoundation__CUri_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CFoundation__CUri_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CFoundation__CUri_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CFoundation__CUri_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CFoundation__CUri_QueryInterface(__FIIterator_1_Windows__CFoundation__CUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CFoundation__CUri_AddRef(__FIIterator_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CFoundation__CUri_Release(__FIIterator_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CFoundation__CUri_GetIids(__FIIterator_1_Windows__CFoundation__CUri* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CFoundation__CUri_GetRuntimeClassName(__FIIterator_1_Windows__CFoundation__CUri* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CFoundation__CUri_GetTrustLevel(__FIIterator_1_Windows__CFoundation__CUri* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Foundation::Uri* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CFoundation__CUri_get_Current(__FIIterator_1_Windows__CFoundation__CUri* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CFoundation__CUri_get_HasCurrent(__FIIterator_1_Windows__CFoundation__CUri* This,WINBOOL *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CFoundation__CUri_MoveNext(__FIIterator_1_Windows__CFoundation__CUri* This,WINBOOL *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CFoundation__CUri_GetMany(__FIIterator_1_Windows__CFoundation__CUri* This,UINT32 items_size,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_Uri IID___FIIterator_1_Windows__CFoundation__CUri
#define IIterator_UriVtbl __FIIterator_1_Windows__CFoundation__CUriVtbl
#define IIterator_Uri __FIIterator_1_Windows__CFoundation__CUri
#define IIterator_Uri_QueryInterface __FIIterator_1_Windows__CFoundation__CUri_QueryInterface
#define IIterator_Uri_AddRef __FIIterator_1_Windows__CFoundation__CUri_AddRef
#define IIterator_Uri_Release __FIIterator_1_Windows__CFoundation__CUri_Release
#define IIterator_Uri_GetIids __FIIterator_1_Windows__CFoundation__CUri_GetIids
#define IIterator_Uri_GetRuntimeClassName __FIIterator_1_Windows__CFoundation__CUri_GetRuntimeClassName
#define IIterator_Uri_GetTrustLevel __FIIterator_1_Windows__CFoundation__CUri_GetTrustLevel
#define IIterator_Uri_get_Current __FIIterator_1_Windows__CFoundation__CUri_get_Current
#define IIterator_Uri_get_HasCurrent __FIIterator_1_Windows__CFoundation__CUri_get_HasCurrent
#define IIterator_Uri_MoveNext __FIIterator_1_Windows__CFoundation__CUri_MoveNext
#define IIterator_Uri_GetMany __FIIterator_1_Windows__CFoundation__CUri_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__ */

/*****************************************************************************
 * 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,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        WINBOOL *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,WINBOOL *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_MoveNext(__FIIterator_1_Windows__CApplicationModel__CPackage* This,WINBOOL *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__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Management::Deployment::PackageUserInformation* > interface
 */
#ifndef ____FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation, 0x341348b9, 0x52c8, 0x5b57, 0x9e,0x91, 0xf1,0x9f,0x2a,0x05,0xb1,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("341348b9-52c8-5b57-9e91-f19f2a05b188")
                IIterable<ABI::Windows::Management::Deployment::PackageUserInformation* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Management::Deployment::PackageUserInformation*, ABI::Windows::Management::Deployment::IPackageUserInformation* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation, 0x341348b9, 0x52c8, 0x5b57, 0x9e,0x91, 0xf1,0x9f,0x2a,0x05,0xb1,0x88)
#endif
#else
typedef struct __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Management::Deployment::PackageUserInformation* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation *This,
        __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation **value);

    END_INTERFACE
} __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformationVtbl;

interface __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation {
    CONST_VTBL __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Management::Deployment::PackageUserInformation* > methods ***/
#define __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_QueryInterface(__FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_AddRef(__FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_Release(__FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetIids(__FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetRuntimeClassName(__FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetTrustLevel(__FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Management::Deployment::PackageUserInformation* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_First(__FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_PackageUserInformation IID___FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation
#define IIterable_PackageUserInformationVtbl __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformationVtbl
#define IIterable_PackageUserInformation __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation
#define IIterable_PackageUserInformation_QueryInterface __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_QueryInterface
#define IIterable_PackageUserInformation_AddRef __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_AddRef
#define IIterable_PackageUserInformation_Release __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_Release
#define IIterable_PackageUserInformation_GetIids __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetIids
#define IIterable_PackageUserInformation_GetRuntimeClassName __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetRuntimeClassName
#define IIterable_PackageUserInformation_GetTrustLevel __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetTrustLevel
#define IIterable_PackageUserInformation_First __FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CManagement__CDeployment__CPackageUserInformation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Management::Deployment::PackageUserInformation* > interface
 */
#ifndef ____FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation, 0x75660566, 0xae43, 0x5858, 0xad,0xa6, 0xd5,0x7d,0xda,0xe9,0x02,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("75660566-ae43-5858-ada6-d57ddae90277")
                IIterator<ABI::Windows::Management::Deployment::PackageUserInformation* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Management::Deployment::PackageUserInformation*, ABI::Windows::Management::Deployment::IPackageUserInformation* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation, 0x75660566, 0xae43, 0x5858, 0xad,0xa6, 0xd5,0x7d,0xda,0xe9,0x02,0x77)
#endif
#else
typedef struct __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Management::Deployment::PackageUserInformation* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation *This,
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation *This,
        UINT32 items_size,
        __x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformationVtbl;

interface __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation {
    CONST_VTBL __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Management::Deployment::PackageUserInformation* > methods ***/
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_QueryInterface(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_AddRef(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_Release(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetIids(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetRuntimeClassName(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetTrustLevel(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Management::Deployment::PackageUserInformation* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_get_Current(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_get_HasCurrent(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,WINBOOL *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_MoveNext(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,WINBOOL *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetMany(__FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation* This,UINT32 items_size,__x_ABI_CWindows_CManagement_CDeployment_CIPackageUserInformation **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_PackageUserInformation IID___FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation
#define IIterator_PackageUserInformationVtbl __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformationVtbl
#define IIterator_PackageUserInformation __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation
#define IIterator_PackageUserInformation_QueryInterface __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_QueryInterface
#define IIterator_PackageUserInformation_AddRef __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_AddRef
#define IIterator_PackageUserInformation_Release __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_Release
#define IIterator_PackageUserInformation_GetIids __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetIids
#define IIterator_PackageUserInformation_GetRuntimeClassName __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetRuntimeClassName
#define IIterator_PackageUserInformation_GetTrustLevel __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetTrustLevel
#define IIterator_PackageUserInformation_get_Current __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_get_Current
#define IIterator_PackageUserInformation_get_HasCurrent __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_get_HasCurrent
#define IIterator_PackageUserInformation_MoveNext __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_MoveNext
#define IIterator_PackageUserInformation_GetMany __FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CManagement__CDeployment__CPackageUserInformation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > interface
 */
#ifndef ____FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_INTERFACE_DEFINED__
#define ____FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress, 0x5a97aab7, 0xb6ea, 0x55ac, 0xa5,0xdc, 0xd5,0xb1,0x64,0xd9,0x4e,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("5a97aab7-b6ea-55ac-a5dc-d5b164d94e94")
            IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > : IAsyncOperationWithProgress_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Management::Deployment::DeploymentResult*, ABI::Windows::Management::Deployment::IDeploymentResult* >, ABI::Windows::Management::Deployment::DeploymentProgress >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress, 0x5a97aab7, 0xb6ea, 0x55ac, 0xa5,0xdc, 0xd5,0xb1,0x64,0xd9,0x4e,0x94)
#endif
#else
typedef struct __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Progress)(
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *This,
        __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *handler);

    HRESULT (STDMETHODCALLTYPE *get_Progress)(
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *This,
        __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **handler);

    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *This,
        __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *This,
        __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *This,
        __x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult **results);

    END_INTERFACE
} __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl;

interface __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress {
    CONST_VTBL __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > methods ***/
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_put_Progress(This,handler) (This)->lpVtbl->put_Progress(This,handler)
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_get_Progress(This,handler) (This)->lpVtbl->get_Progress(This,handler)
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_QueryInterface(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_AddRef(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Release(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetIids(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetRuntimeClassName(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetTrustLevel(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperationWithProgress<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_put_Progress(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,__FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *handler) {
    return This->lpVtbl->put_Progress(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_get_Progress(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,__FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **handler) {
    return This->lpVtbl->get_Progress(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_put_Completed(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,__FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_get_Completed(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,__FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetResults(__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,__x_ABI_CWindows_CManagement_CDeployment_CIDeploymentResult **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress IID___FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgressVtbl __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_QueryInterface __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_QueryInterface
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_AddRef __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_AddRef
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_Release __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Release
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_GetIids __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetIids
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_GetRuntimeClassName __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetRuntimeClassName
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_GetTrustLevel __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetTrustLevel
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_put_Progress __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_put_Progress
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_get_Progress __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_get_Progress
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_put_Completed __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_put_Completed
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_get_Completed __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_get_Completed
#define IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress_GetResults __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationProgressHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > interface
 */
#ifndef ____FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_INTERFACE_DEFINED__
#define ____FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress, 0xf1b926d1, 0x1796, 0x597a, 0x9b,0xea, 0x6c,0x64,0x49,0xd0,0x3e,0xef);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f1b926d1-1796-597a-9bea-6c6449d03eef")
            IAsyncOperationProgressHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > : IAsyncOperationProgressHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Management::Deployment::DeploymentResult*, ABI::Windows::Management::Deployment::IDeploymentResult* >, ABI::Windows::Management::Deployment::DeploymentProgress >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress, 0xf1b926d1, 0x1796, 0x597a, 0x9b,0xea, 0x6c,0x64,0x49,0xd0,0x3e,0xef)
#endif
#else
typedef struct __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationProgressHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *This,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *info,
        struct __x_ABI_CWindows_CManagement_CDeployment_CDeploymentProgress progress);

    END_INTERFACE
} __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl;

interface __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress {
    CONST_VTBL __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationProgressHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > methods ***/
#define __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Invoke(This,info,progress) (This)->lpVtbl->Invoke(This,info,progress)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_QueryInterface(__FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_AddRef(__FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Release(__FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationProgressHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Invoke(__FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *info,struct __x_ABI_CWindows_CManagement_CDeployment_CDeploymentProgress progress) {
    return This->lpVtbl->Invoke(This,info,progress);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationProgressHandler_DeploymentResult_DeploymentProgress IID___FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress
#define IAsyncOperationProgressHandler_DeploymentResult_DeploymentProgressVtbl __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl
#define IAsyncOperationProgressHandler_DeploymentResult_DeploymentProgress __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress
#define IAsyncOperationProgressHandler_DeploymentResult_DeploymentProgress_QueryInterface __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_QueryInterface
#define IAsyncOperationProgressHandler_DeploymentResult_DeploymentProgress_AddRef __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_AddRef
#define IAsyncOperationProgressHandler_DeploymentResult_DeploymentProgress_Release __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Release
#define IAsyncOperationProgressHandler_DeploymentResult_DeploymentProgress_Invoke __FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationProgressHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > interface
 */
#ifndef ____FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_INTERFACE_DEFINED__
#define ____FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress, 0x6e1c7129, 0x61e0, 0x5d88, 0x9f,0xd4, 0xf3,0xce,0x65,0xa0,0x57,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6e1c7129-61e0-5d88-9fd4-f3ce65a05719")
            IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > : IAsyncOperationWithProgressCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Management::Deployment::DeploymentResult*, ABI::Windows::Management::Deployment::IDeploymentResult* >, ABI::Windows::Management::Deployment::DeploymentProgress >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress, 0x6e1c7129, 0x61e0, 0x5d88, 0x9f,0xd4, 0xf3,0xce,0x65,0xa0,0x57,0x19)
#endif
#else
typedef struct __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *This,
        __FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl;

interface __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress {
    CONST_VTBL __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > methods ***/
#define __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_QueryInterface(__FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_AddRef(__FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Release(__FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Management::Deployment::DeploymentResult*,ABI::Windows::Management::Deployment::DeploymentProgress > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Invoke(__FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress* This,__FIAsyncOperationWithProgress_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationWithProgressCompletedHandler_DeploymentResult_DeploymentProgress IID___FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress
#define IAsyncOperationWithProgressCompletedHandler_DeploymentResult_DeploymentProgressVtbl __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgressVtbl
#define IAsyncOperationWithProgressCompletedHandler_DeploymentResult_DeploymentProgress __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress
#define IAsyncOperationWithProgressCompletedHandler_DeploymentResult_DeploymentProgress_QueryInterface __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_QueryInterface
#define IAsyncOperationWithProgressCompletedHandler_DeploymentResult_DeploymentProgress_AddRef __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_AddRef
#define IAsyncOperationWithProgressCompletedHandler_DeploymentResult_DeploymentProgress_Release __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Release
#define IAsyncOperationWithProgressCompletedHandler_DeploymentResult_DeploymentProgress_Invoke __FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationWithProgressCompletedHandler_2_Windows__CManagement__CDeployment__CDeploymentResult_DeploymentProgress_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_management_deployment_h__ */
