/*** Autogenerated by WIDL 10.12 from include/windows.applicationmodel.background.idl - Do not edit ***/

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

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

#ifndef __windows_applicationmodel_background_h__
#define __windows_applicationmodel_background_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler ABI::Windows::ApplicationModel::Background::IBackgroundTaskCanceledEventHandler
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskCanceledEventHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler ABI::Windows::ApplicationModel::Background::IBackgroundTaskCompletedEventHandler
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskCompletedEventHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler ABI::Windows::ApplicationModel::Background::IBackgroundTaskProgressEventHandler
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskProgressEventHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs ABI::Windows::ApplicationModel::Background::IBackgroundTaskCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral ABI::Windows::ApplicationModel::Background::IBackgroundTaskDeferral
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskDeferral;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs ABI::Windows::ApplicationModel::Background::IBackgroundTaskProgressEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskProgressEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance ABI::Windows::ApplicationModel::Background::IBackgroundTaskInstance
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskInstance;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistration;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2 __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2 ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistration2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3 __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3 ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistration3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroup
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistrationGroup;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroupFactory
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistrationGroupFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistrationStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2 __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2 ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationStatics2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistrationStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger ABI::Windows::ApplicationModel::Background::IBackgroundTrigger
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTrigger;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCompletedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                class BackgroundTaskCompletedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCompletedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCompletedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskDeferral_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                class BackgroundTaskDeferral;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskDeferral __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskDeferral;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskDeferral_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskProgressEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskProgressEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                class BackgroundTaskProgressEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskProgressEventArgs __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskProgressEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskProgressEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistration_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistration_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                class BackgroundTaskRegistration;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistration __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistration;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistration_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistrationGroup_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistrationGroup_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                class BackgroundTaskRegistrationGroup;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistrationGroup __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistrationGroup;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskRegistrationGroup_FWD_DEFINED__ */

#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs ABI::Windows::Foundation::IEventHandler<ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup*,ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_FWD_DEFINED__
#define ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_FWD_DEFINED__
typedef interface __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration;
#ifdef __cplusplus
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration ABI::Windows::Foundation::Collections::IMapView<GUID,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistration* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_FWD_DEFINED__
#define ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_FWD_DEFINED__
typedef interface __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration;
#ifdef __cplusplus
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration ABI::Windows::Foundation::Collections::IMapView<GUID,ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCancellationReason_ENUM_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCancellationReason_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                enum BackgroundTaskCancellationReason {
                    BackgroundTaskCancellationReason_Abort = 0,
                    BackgroundTaskCancellationReason_Terminating = 1,
                    BackgroundTaskCancellationReason_LoggingOff = 2,
                    BackgroundTaskCancellationReason_ServicingUpdate = 3,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BackgroundTaskCancellationReason_IdleTask = 4,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BackgroundTaskCancellationReason_Uninstall = 5,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BackgroundTaskCancellationReason_ConditionLoss = 6,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BackgroundTaskCancellationReason_SystemPolicy = 7,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BackgroundTaskCancellationReason_QuietHoursEntered = 8,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BackgroundTaskCancellationReason_ExecutionTimeExceeded = 9,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BackgroundTaskCancellationReason_ResourceRevocation = 10,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BackgroundTaskCancellationReason_EnergySaver = 11
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCancellationReason {
    BackgroundTaskCancellationReason_Abort = 0,
    BackgroundTaskCancellationReason_Terminating = 1,
    BackgroundTaskCancellationReason_LoggingOff = 2,
    BackgroundTaskCancellationReason_ServicingUpdate = 3,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BackgroundTaskCancellationReason_IdleTask = 4,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BackgroundTaskCancellationReason_Uninstall = 5,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BackgroundTaskCancellationReason_ConditionLoss = 6,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BackgroundTaskCancellationReason_SystemPolicy = 7,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BackgroundTaskCancellationReason_QuietHoursEntered = 8,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BackgroundTaskCancellationReason_ExecutionTimeExceeded = 9,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BackgroundTaskCancellationReason_ResourceRevocation = 10,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BackgroundTaskCancellationReason_EnergySaver = 11
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
};
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define BackgroundTaskCancellationReason __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCancellationReason
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif /* ____x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCancellationReason_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCancellationReason __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCancellationReason;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs ABI::Windows::ApplicationModel::Background::IBackgroundTaskCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral ABI::Windows::ApplicationModel::Background::IBackgroundTaskDeferral
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskDeferral;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs ABI::Windows::ApplicationModel::Background::IBackgroundTaskProgressEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskProgressEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance ABI::Windows::ApplicationModel::Background::IBackgroundTaskInstance
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskInstance;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistration;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2 __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2 ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistration2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3 __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3 ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistration3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroup
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistrationGroup;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroupFactory
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistrationGroupFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistrationStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2 __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2 ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationStatics2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTaskRegistrationStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger ABI::Windows::ApplicationModel::Background::IBackgroundTrigger
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                interface IBackgroundTrigger;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_FWD_DEFINED__
#define ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_FWD_DEFINED__
typedef interface __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration;
#ifdef __cplusplus
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration ABI::Windows::Foundation::Collections::IMapView<GUID,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistration* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_FWD_DEFINED__
#define ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_FWD_DEFINED__
typedef interface __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration;
#ifdef __cplusplus
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration ABI::Windows::Foundation::Collections::IMapView<GUID,ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup* >
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IBackgroundTaskCanceledEventHandler interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler, 0xa6c4bac0, 0x51f8, 0x4c57, 0xac,0x3f, 0x15,0x6d,0xd1,0x68,0x0c,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("a6c4bac0-51f8-4c57-ac3f-156dd1680c4f")
                IBackgroundTaskCanceledEventHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskInstance *sender,
                        ABI::Windows::ApplicationModel::Background::BackgroundTaskCancellationReason reason) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler, 0xa6c4bac0, 0x51f8, 0x4c57, 0xac,0x3f, 0x15,0x6d,0xd1,0x68,0x0c,0x4f)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBackgroundTaskCanceledEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *sender,
        __x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCancellationReason reason);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandlerVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IBackgroundTaskCanceledEventHandler methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_Invoke(This,sender,reason) (This)->lpVtbl->Invoke(This,sender,reason)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IBackgroundTaskCanceledEventHandler methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_Invoke(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *sender,__x_ABI_CWindows_CApplicationModel_CBackground_CBackgroundTaskCancellationReason reason) {
    return This->lpVtbl->Invoke(This,sender,reason);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskCanceledEventHandler IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler
#define IBackgroundTaskCanceledEventHandlerVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandlerVtbl
#define IBackgroundTaskCanceledEventHandler __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler
#define IBackgroundTaskCanceledEventHandler_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_QueryInterface
#define IBackgroundTaskCanceledEventHandler_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_AddRef
#define IBackgroundTaskCanceledEventHandler_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_Release
#define IBackgroundTaskCanceledEventHandler_Invoke __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler_Invoke
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskCompletedEventHandler interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler, 0x5b38e929, 0xa086, 0x46a7, 0xa6,0x78, 0x43,0x91,0x35,0x82,0x2b,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("5b38e929-a086-46a7-a678-439135822bcf")
                IBackgroundTaskCompletedEventHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration *sender,
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskCompletedEventArgs *args) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler, 0x5b38e929, 0xa086, 0x46a7, 0xa6,0x78, 0x43,0x91,0x35,0x82,0x2b,0xcf)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBackgroundTaskCompletedEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *sender,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs *args);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandlerVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IBackgroundTaskCompletedEventHandler methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IBackgroundTaskCompletedEventHandler methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_Invoke(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *sender,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskCompletedEventHandler IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler
#define IBackgroundTaskCompletedEventHandlerVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandlerVtbl
#define IBackgroundTaskCompletedEventHandler __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler
#define IBackgroundTaskCompletedEventHandler_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_QueryInterface
#define IBackgroundTaskCompletedEventHandler_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_AddRef
#define IBackgroundTaskCompletedEventHandler_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_Release
#define IBackgroundTaskCompletedEventHandler_Invoke __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler_Invoke
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskProgressEventHandler interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler, 0x46e0683c, 0x8a88, 0x4c99, 0x80,0x4c, 0x76,0x89,0x7f,0x62,0x77,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("46e0683c-8a88-4c99-804c-76897f6277a6")
                IBackgroundTaskProgressEventHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration *sender,
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskProgressEventArgs *args) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler, 0x46e0683c, 0x8a88, 0x4c99, 0x80,0x4c, 0x76,0x89,0x7f,0x62,0x77,0xa6)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBackgroundTaskProgressEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *sender,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs *args);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandlerVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IBackgroundTaskProgressEventHandler methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IBackgroundTaskProgressEventHandler methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_Invoke(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *sender,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskProgressEventHandler IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler
#define IBackgroundTaskProgressEventHandlerVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandlerVtbl
#define IBackgroundTaskProgressEventHandler __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler
#define IBackgroundTaskProgressEventHandler_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_QueryInterface
#define IBackgroundTaskProgressEventHandler_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_AddRef
#define IBackgroundTaskProgressEventHandler_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_Release
#define IBackgroundTaskProgressEventHandler_Invoke __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler_Invoke
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskCompletedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs, 0x565d25cf, 0xf209, 0x48f4, 0x99,0x67, 0x2b,0x18,0x4f,0x7b,0xfb,0xf0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("565d25cf-f209-48f4-9967-2b184f7bfbf0")
                IBackgroundTaskCompletedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_InstanceId(
                        GUID *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CheckResult(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs, 0x565d25cf, 0xf209, 0x48f4, 0x99,0x67, 0x2b,0x18,0x4f,0x7b,0xfb,0xf0)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskCompletedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_InstanceId)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs *This,
        GUID *value);

    HRESULT (STDMETHODCALLTYPE *CheckResult)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs *This);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskCompletedEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_get_InstanceId(This,value) (This)->lpVtbl->get_InstanceId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_CheckResult(This) (This)->lpVtbl->CheckResult(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskCompletedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_get_InstanceId(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs* This,GUID *value) {
    return This->lpVtbl->get_InstanceId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_CheckResult(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs* This) {
    return This->lpVtbl->CheckResult(This);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskCompletedEventArgs IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs
#define IBackgroundTaskCompletedEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgsVtbl
#define IBackgroundTaskCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs
#define IBackgroundTaskCompletedEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_QueryInterface
#define IBackgroundTaskCompletedEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_AddRef
#define IBackgroundTaskCompletedEventArgs_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_Release
#define IBackgroundTaskCompletedEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_GetIids
#define IBackgroundTaskCompletedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_GetRuntimeClassName
#define IBackgroundTaskCompletedEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_GetTrustLevel
#define IBackgroundTaskCompletedEventArgs_get_InstanceId __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_get_InstanceId
#define IBackgroundTaskCompletedEventArgs_CheckResult __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventArgs_CheckResult
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskDeferral interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral, 0x93cc156d, 0xaf27, 0x4dd3, 0x84,0x6e, 0x24,0xee,0x40,0xca,0xdd,0x25);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("93cc156d-af27-4dd3-846e-24ee40cadd25")
                IBackgroundTaskDeferral : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Complete(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral, 0x93cc156d, 0xaf27, 0x4dd3, 0x84,0x6e, 0x24,0xee,0x40,0xca,0xdd,0x25)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferralVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskDeferral methods ***/
    HRESULT (STDMETHODCALLTYPE *Complete)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral *This);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferralVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferralVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskDeferral methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_Complete(This) (This)->lpVtbl->Complete(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskDeferral methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_Complete(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral* This) {
    return This->lpVtbl->Complete(This);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskDeferral IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral
#define IBackgroundTaskDeferralVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferralVtbl
#define IBackgroundTaskDeferral __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral
#define IBackgroundTaskDeferral_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_QueryInterface
#define IBackgroundTaskDeferral_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_AddRef
#define IBackgroundTaskDeferral_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_Release
#define IBackgroundTaskDeferral_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_GetIids
#define IBackgroundTaskDeferral_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_GetRuntimeClassName
#define IBackgroundTaskDeferral_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_GetTrustLevel
#define IBackgroundTaskDeferral_Complete __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral_Complete
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskProgressEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs, 0xfb1468ac, 0x8332, 0x4d0a, 0x95,0x32, 0x03,0xea,0xe6,0x84,0xda,0x31);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("fb1468ac-8332-4d0a-9532-03eae684da31")
                IBackgroundTaskProgressEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_InstanceId(
                        GUID *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Progress(
                        UINT32 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs, 0xfb1468ac, 0x8332, 0x4d0a, 0x95,0x32, 0x03,0xea,0xe6,0x84,0xda,0x31)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskProgressEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_InstanceId)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs *This,
        GUID *value);

    HRESULT (STDMETHODCALLTYPE *get_Progress)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs *This,
        UINT32 *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskProgressEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_get_InstanceId(This,value) (This)->lpVtbl->get_InstanceId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_get_Progress(This,value) (This)->lpVtbl->get_Progress(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskProgressEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_get_InstanceId(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs* This,GUID *value) {
    return This->lpVtbl->get_InstanceId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_get_Progress(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs* This,UINT32 *value) {
    return This->lpVtbl->get_Progress(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskProgressEventArgs IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs
#define IBackgroundTaskProgressEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgsVtbl
#define IBackgroundTaskProgressEventArgs __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs
#define IBackgroundTaskProgressEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_QueryInterface
#define IBackgroundTaskProgressEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_AddRef
#define IBackgroundTaskProgressEventArgs_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_Release
#define IBackgroundTaskProgressEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_GetIids
#define IBackgroundTaskProgressEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_GetRuntimeClassName
#define IBackgroundTaskProgressEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_GetTrustLevel
#define IBackgroundTaskProgressEventArgs_get_InstanceId __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_get_InstanceId
#define IBackgroundTaskProgressEventArgs_get_Progress __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventArgs_get_Progress
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskInstance interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance, 0x865bda7a, 0x21d8, 0x4573, 0x8f,0x32, 0x92,0x8a,0x1b,0x06,0x41,0xf6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("865bda7a-21d8-4573-8f32-928a1b0641f6")
                IBackgroundTaskInstance : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_InstanceId(
                        GUID *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Task(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration **task) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Progress(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Progress(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TriggerDetails(
                        IInspectable **details) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Canceled(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskCanceledEventHandler *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Canceled(
                        EventRegistrationToken cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SuspendedCount(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskDeferral **deferral) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance, 0x865bda7a, 0x21d8, 0x4573, 0x8f,0x32, 0x92,0x8a,0x1b,0x06,0x41,0xf6)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstanceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskInstance methods ***/
    HRESULT (STDMETHODCALLTYPE *get_InstanceId)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *This,
        GUID *value);

    HRESULT (STDMETHODCALLTYPE *get_Task)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration **task);

    HRESULT (STDMETHODCALLTYPE *get_Progress)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_Progress)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_TriggerDetails)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *This,
        IInspectable **details);

    HRESULT (STDMETHODCALLTYPE *add_Canceled)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_Canceled)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *get_SuspendedCount)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral **deferral);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstanceVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstanceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskInstance methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_InstanceId(This,value) (This)->lpVtbl->get_InstanceId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_Task(This,task) (This)->lpVtbl->get_Task(This,task)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_Progress(This,value) (This)->lpVtbl->get_Progress(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_put_Progress(This,value) (This)->lpVtbl->put_Progress(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_TriggerDetails(This,details) (This)->lpVtbl->get_TriggerDetails(This,details)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_add_Canceled(This,handler,cookie) (This)->lpVtbl->add_Canceled(This,handler,cookie)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_remove_Canceled(This,cookie) (This)->lpVtbl->remove_Canceled(This,cookie)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_SuspendedCount(This,value) (This)->lpVtbl->get_SuspendedCount(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetDeferral(This,deferral) (This)->lpVtbl->GetDeferral(This,deferral)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskInstance methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_InstanceId(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,GUID *value) {
    return This->lpVtbl->get_InstanceId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_Task(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration **task) {
    return This->lpVtbl->get_Task(This,task);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_Progress(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,UINT32 *value) {
    return This->lpVtbl->get_Progress(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_put_Progress(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,UINT32 value) {
    return This->lpVtbl->put_Progress(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_TriggerDetails(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,IInspectable **details) {
    return This->lpVtbl->get_TriggerDetails(This,details);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_add_Canceled(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCanceledEventHandler *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_Canceled(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_remove_Canceled(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_Canceled(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_SuspendedCount(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,UINT32 *value) {
    return This->lpVtbl->get_SuspendedCount(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetDeferral(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskDeferral **deferral) {
    return This->lpVtbl->GetDeferral(This,deferral);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskInstance IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance
#define IBackgroundTaskInstanceVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstanceVtbl
#define IBackgroundTaskInstance __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance
#define IBackgroundTaskInstance_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_QueryInterface
#define IBackgroundTaskInstance_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_AddRef
#define IBackgroundTaskInstance_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_Release
#define IBackgroundTaskInstance_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetIids
#define IBackgroundTaskInstance_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetRuntimeClassName
#define IBackgroundTaskInstance_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetTrustLevel
#define IBackgroundTaskInstance_get_InstanceId __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_InstanceId
#define IBackgroundTaskInstance_get_Task __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_Task
#define IBackgroundTaskInstance_get_Progress __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_Progress
#define IBackgroundTaskInstance_put_Progress __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_put_Progress
#define IBackgroundTaskInstance_get_TriggerDetails __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_TriggerDetails
#define IBackgroundTaskInstance_add_Canceled __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_add_Canceled
#define IBackgroundTaskInstance_remove_Canceled __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_remove_Canceled
#define IBackgroundTaskInstance_get_SuspendedCount __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_get_SuspendedCount
#define IBackgroundTaskInstance_GetDeferral __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskInstance_GetDeferral
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskRegistration interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration, 0x10654cc2, 0xa26e, 0x43bf, 0x8c,0x12, 0x1f,0xb4,0x0d,0xbf,0xbf,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("10654cc2-a26e-43bf-8c12-1fb40dbfbfa0")
                IBackgroundTaskRegistration : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_TaskId(
                        GUID *value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE add_Progress(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskProgressEventHandler *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Progress(
                        EventRegistrationToken cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Completed(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskCompletedEventHandler *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Completed(
                        EventRegistrationToken cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Unregister(
                        boolean cancel_task) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration, 0x10654cc2, 0xa26e, 0x43bf, 0x8c,0x12, 0x1f,0xb4,0x0d,0xbf,0xbf,0xa0)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskRegistration methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TaskId)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *This,
        GUID *value);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *add_Progress)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_Progress)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_Completed)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_Completed)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *Unregister)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration *This,
        boolean cancel_task);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskRegistration methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_get_TaskId(This,value) (This)->lpVtbl->get_TaskId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_add_Progress(This,handler,cookie) (This)->lpVtbl->add_Progress(This,handler,cookie)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_remove_Progress(This,cookie) (This)->lpVtbl->remove_Progress(This,cookie)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_add_Completed(This,handler,cookie) (This)->lpVtbl->add_Completed(This,handler,cookie)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_remove_Completed(This,cookie) (This)->lpVtbl->remove_Completed(This,cookie)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_Unregister(This,cancel_task) (This)->lpVtbl->Unregister(This,cancel_task)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskRegistration methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_get_TaskId(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,GUID *value) {
    return This->lpVtbl->get_TaskId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_get_Name(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_add_Progress(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskProgressEventHandler *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_Progress(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_remove_Progress(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_Progress(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_add_Completed(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskCompletedEventHandler *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_Completed(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_remove_Completed(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_Completed(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_Unregister(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration* This,boolean cancel_task) {
    return This->lpVtbl->Unregister(This,cancel_task);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskRegistration IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration
#define IBackgroundTaskRegistrationVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationVtbl
#define IBackgroundTaskRegistration __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration
#define IBackgroundTaskRegistration_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_QueryInterface
#define IBackgroundTaskRegistration_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_AddRef
#define IBackgroundTaskRegistration_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_Release
#define IBackgroundTaskRegistration_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_GetIids
#define IBackgroundTaskRegistration_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_GetRuntimeClassName
#define IBackgroundTaskRegistration_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_GetTrustLevel
#define IBackgroundTaskRegistration_get_TaskId __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_get_TaskId
#define IBackgroundTaskRegistration_get_Name __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_get_Name
#define IBackgroundTaskRegistration_add_Progress __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_add_Progress
#define IBackgroundTaskRegistration_remove_Progress __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_remove_Progress
#define IBackgroundTaskRegistration_add_Completed __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_add_Completed
#define IBackgroundTaskRegistration_remove_Completed __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_remove_Completed
#define IBackgroundTaskRegistration_Unregister __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration_Unregister
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskRegistration2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2, 0x6138c703, 0xbb86, 0x4112, 0xaf,0xc3, 0x7f,0x93,0x9b,0x16,0x6e,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("6138c703-bb86-4112-afc3-7f939b166e3b")
                IBackgroundTaskRegistration2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Trigger(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTrigger **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2, 0x6138c703, 0xbb86, 0x4112, 0xaf,0xc3, 0x7f,0x93,0x9b,0x16,0x6e,0x3b)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskRegistration2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Trigger)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2 *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskRegistration2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_get_Trigger(This,value) (This)->lpVtbl->get_Trigger(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskRegistration2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_get_Trigger(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger **value) {
    return This->lpVtbl->get_Trigger(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskRegistration2 IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2
#define IBackgroundTaskRegistration2Vtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2Vtbl
#define IBackgroundTaskRegistration2 __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2
#define IBackgroundTaskRegistration2_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_QueryInterface
#define IBackgroundTaskRegistration2_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_AddRef
#define IBackgroundTaskRegistration2_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_Release
#define IBackgroundTaskRegistration2_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_GetIids
#define IBackgroundTaskRegistration2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_GetRuntimeClassName
#define IBackgroundTaskRegistration2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_GetTrustLevel
#define IBackgroundTaskRegistration2_get_Trigger __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration2_get_Trigger
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskRegistration3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3, 0xfe338195, 0x9423, 0x4d8b, 0x83,0x0d, 0xb1,0xdd,0x2c,0x7b,0xad,0xd5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("fe338195-9423-4d8b-830d-b1dd2c7badd5")
                IBackgroundTaskRegistration3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_TaskGroup(
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroup **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3, 0xfe338195, 0x9423, 0x4d8b, 0x83,0x0d, 0xb1,0xdd,0x2c,0x7b,0xad,0xd5)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskRegistration3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TaskGroup)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3 *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskRegistration3 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_get_TaskGroup(This,value) (This)->lpVtbl->get_TaskGroup(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskRegistration3 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_get_TaskGroup(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **value) {
    return This->lpVtbl->get_TaskGroup(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskRegistration3 IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3
#define IBackgroundTaskRegistration3Vtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3Vtbl
#define IBackgroundTaskRegistration3 __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3
#define IBackgroundTaskRegistration3_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_QueryInterface
#define IBackgroundTaskRegistration3_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_AddRef
#define IBackgroundTaskRegistration3_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_Release
#define IBackgroundTaskRegistration3_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_GetIids
#define IBackgroundTaskRegistration3_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_GetRuntimeClassName
#define IBackgroundTaskRegistration3_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_GetTrustLevel
#define IBackgroundTaskRegistration3_get_TaskGroup __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_get_TaskGroup
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IBackgroundTaskRegistrationGroup interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup, 0x2ab1919a, 0x871b, 0x4167, 0x8a,0x76, 0x05,0x5c,0xd6,0x7b,0x5b,0x23);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("2ab1919a-871b-4167-8a76-055cd67b5b23")
                IBackgroundTaskRegistrationGroup : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        HSTRING *value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE add_BackgroundActivated(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup*,ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_BackgroundActivated(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AllTasks(
                        ABI::Windows::Foundation::Collections::IMapView<GUID,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistration* > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup, 0x2ab1919a, 0x871b, 0x4167, 0x8a,0x76, 0x05,0x5c,0xd6,0x7b,0x5b,0x23)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskRegistrationGroup methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *add_BackgroundActivated)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup *This,
        __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_BackgroundActivated)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_AllTasks)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup *This,
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskRegistrationGroup methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_add_BackgroundActivated(This,handler,token) (This)->lpVtbl->add_BackgroundActivated(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_remove_BackgroundActivated(This,token) (This)->lpVtbl->remove_BackgroundActivated(This,token)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_get_AllTasks(This,value) (This)->lpVtbl->get_AllTasks(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskRegistrationGroup methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_get_Id(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This,HSTRING *value) {
    return This->lpVtbl->get_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_get_Name(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_add_BackgroundActivated(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This,__FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_BackgroundActivated(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_remove_BackgroundActivated(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_BackgroundActivated(This,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_get_AllTasks(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup* This,__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration **value) {
    return This->lpVtbl->get_AllTasks(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskRegistrationGroup IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup
#define IBackgroundTaskRegistrationGroupVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupVtbl
#define IBackgroundTaskRegistrationGroup __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup
#define IBackgroundTaskRegistrationGroup_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_QueryInterface
#define IBackgroundTaskRegistrationGroup_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_AddRef
#define IBackgroundTaskRegistrationGroup_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_Release
#define IBackgroundTaskRegistrationGroup_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_GetIids
#define IBackgroundTaskRegistrationGroup_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_GetRuntimeClassName
#define IBackgroundTaskRegistrationGroup_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_GetTrustLevel
#define IBackgroundTaskRegistrationGroup_get_Id __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_get_Id
#define IBackgroundTaskRegistrationGroup_get_Name __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_get_Name
#define IBackgroundTaskRegistrationGroup_add_BackgroundActivated __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_add_BackgroundActivated
#define IBackgroundTaskRegistrationGroup_remove_BackgroundActivated __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_remove_BackgroundActivated
#define IBackgroundTaskRegistrationGroup_get_AllTasks __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_get_AllTasks
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IBackgroundTaskRegistrationGroupFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory, 0x83d92b69, 0x44cf, 0x4631, 0x97,0x40, 0x03,0xc7,0xd8,0x74,0x1b,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("83d92b69-44cf-4631-9740-03c7d8741bc5")
                IBackgroundTaskRegistrationGroupFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Create(
                        HSTRING id,
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroup **group) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateWithName(
                        HSTRING id,
                        HSTRING name,
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroup **group) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory, 0x83d92b69, 0x44cf, 0x4631, 0x97,0x40, 0x03,0xc7,0xd8,0x74,0x1b,0xc5)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskRegistrationGroupFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory *This,
        HSTRING id,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **group);

    HRESULT (STDMETHODCALLTYPE *CreateWithName)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory *This,
        HSTRING id,
        HSTRING name,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **group);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactoryVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskRegistrationGroupFactory methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_Create(This,id,group) (This)->lpVtbl->Create(This,id,group)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_CreateWithName(This,id,name,group) (This)->lpVtbl->CreateWithName(This,id,name,group)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskRegistrationGroupFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_Create(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory* This,HSTRING id,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **group) {
    return This->lpVtbl->Create(This,id,group);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_CreateWithName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory* This,HSTRING id,HSTRING name,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **group) {
    return This->lpVtbl->CreateWithName(This,id,name,group);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskRegistrationGroupFactory IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory
#define IBackgroundTaskRegistrationGroupFactoryVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactoryVtbl
#define IBackgroundTaskRegistrationGroupFactory __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory
#define IBackgroundTaskRegistrationGroupFactory_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_QueryInterface
#define IBackgroundTaskRegistrationGroupFactory_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_AddRef
#define IBackgroundTaskRegistrationGroupFactory_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_Release
#define IBackgroundTaskRegistrationGroupFactory_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_GetIids
#define IBackgroundTaskRegistrationGroupFactory_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_GetRuntimeClassName
#define IBackgroundTaskRegistrationGroupFactory_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_GetTrustLevel
#define IBackgroundTaskRegistrationGroupFactory_Create __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_Create
#define IBackgroundTaskRegistrationGroupFactory_CreateWithName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_CreateWithName
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroupFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IBackgroundTaskRegistrationStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics, 0x4c542f69, 0xb000, 0x42ba, 0xa0,0x93, 0x6a,0x56,0x3c,0x65,0xe3,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("4c542f69-b000-42ba-a093-6a563c65e3f8")
                IBackgroundTaskRegistrationStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AllTasks(
                        ABI::Windows::Foundation::Collections::IMapView<GUID,ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* > **tasks) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics, 0x4c542f69, 0xb000, 0x42ba, 0xa0,0x93, 0x6a,0x56,0x3c,0x65,0xe3,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskRegistrationStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AllTasks)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics *This,
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration **tasks);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStaticsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskRegistrationStatics methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_get_AllTasks(This,tasks) (This)->lpVtbl->get_AllTasks(This,tasks)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskRegistrationStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_get_AllTasks(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics* This,__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration **tasks) {
    return This->lpVtbl->get_AllTasks(This,tasks);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskRegistrationStatics IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics
#define IBackgroundTaskRegistrationStaticsVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStaticsVtbl
#define IBackgroundTaskRegistrationStatics __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics
#define IBackgroundTaskRegistrationStatics_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_QueryInterface
#define IBackgroundTaskRegistrationStatics_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_AddRef
#define IBackgroundTaskRegistrationStatics_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_Release
#define IBackgroundTaskRegistrationStatics_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_GetIids
#define IBackgroundTaskRegistrationStatics_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_GetRuntimeClassName
#define IBackgroundTaskRegistrationStatics_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_GetTrustLevel
#define IBackgroundTaskRegistrationStatics_get_AllTasks __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics_get_AllTasks
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*****************************************************************************
 * IBackgroundTaskRegistrationStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2, 0x174b671e, 0xb20d, 0x4fa9, 0xad,0x9a, 0xe9,0x3a,0xd6,0xc7,0x1e,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("174b671e-b20d-4fa9-ad9a-e93ad6c71e01")
                IBackgroundTaskRegistrationStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AllTaskGroups(
                        ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTaskGroup(
                        HSTRING groupId,
                        ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroup **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2, 0x174b671e, 0xb20d, 0x4fa9, 0xad,0x9a, 0xe9,0x3a,0xd6,0xc7,0x1e,0x01)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBackgroundTaskRegistrationStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AllTaskGroups)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2 *This,
        __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup **value);

    HRESULT (STDMETHODCALLTYPE *GetTaskGroup)(
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2 *This,
        HSTRING groupId,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBackgroundTaskRegistrationStatics2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_get_AllTaskGroups(This,value) (This)->lpVtbl->get_AllTaskGroups(This,value)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetTaskGroup(This,groupId,value) (This)->lpVtbl->GetTaskGroup(This,groupId,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBackgroundTaskRegistrationStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_get_AllTaskGroups(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2* This,__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup **value) {
    return This->lpVtbl->get_AllTaskGroups(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetTaskGroup(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2* This,HSTRING groupId,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **value) {
    return This->lpVtbl->GetTaskGroup(This,groupId,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTaskRegistrationStatics2 IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2
#define IBackgroundTaskRegistrationStatics2Vtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2Vtbl
#define IBackgroundTaskRegistrationStatics2 __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2
#define IBackgroundTaskRegistrationStatics2_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_QueryInterface
#define IBackgroundTaskRegistrationStatics2_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_AddRef
#define IBackgroundTaskRegistrationStatics2_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_Release
#define IBackgroundTaskRegistrationStatics2_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetIids
#define IBackgroundTaskRegistrationStatics2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetRuntimeClassName
#define IBackgroundTaskRegistrationStatics2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetTrustLevel
#define IBackgroundTaskRegistrationStatics2_get_AllTaskGroups __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_get_AllTaskGroups
#define IBackgroundTaskRegistrationStatics2_GetTaskGroup __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_GetTaskGroup
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IBackgroundTrigger interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger, 0x84b3a058, 0x6027, 0x4b87, 0x97,0x90, 0xbd,0xf3,0xf7,0x57,0xdb,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace Background {
                MIDL_INTERFACE("84b3a058-6027-4b87-9790-bdf3f757dbd7")
                IBackgroundTrigger : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger, 0x84b3a058, 0x6027, 0x4b87, 0x97,0x90, 0xbd,0xf3,0xf7,0x57,0xdb,0xd7)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTriggerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTriggerVtbl;

interface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTriggerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_QueryInterface(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_AddRef(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_Release(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_GetIids(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_Background
#define IID_IBackgroundTrigger IID___x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger
#define IBackgroundTriggerVtbl __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTriggerVtbl
#define IBackgroundTrigger __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger
#define IBackgroundTrigger_QueryInterface __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_QueryInterface
#define IBackgroundTrigger_AddRef __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_AddRef
#define IBackgroundTrigger_Release __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_Release
#define IBackgroundTrigger_GetIids __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_GetIids
#define IBackgroundTrigger_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_GetRuntimeClassName
#define IBackgroundTrigger_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTrigger_GetTrustLevel
#endif /* WIDL_using_Windows_ApplicationModel_Background */
#endif

#endif

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

/*
 * Class Windows.ApplicationModel.Background.BackgroundTaskCompletedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_Background_BackgroundTaskCompletedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_Background_BackgroundTaskCompletedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_Background_BackgroundTaskCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','B','a','c','k','g','r','o','u','n','d','.','B','a','c','k','g','r','o','u','n','d','T','a','s','k','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_Background_BackgroundTaskCompletedEventArgs[] = L"Windows.ApplicationModel.Background.BackgroundTaskCompletedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_Background_BackgroundTaskCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','B','a','c','k','g','r','o','u','n','d','.','B','a','c','k','g','r','o','u','n','d','T','a','s','k','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_Background_BackgroundTaskCompletedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

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

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

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

/*
 * Class Windows.ApplicationModel.Background.BackgroundTaskRegistrationGroup
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_Background_BackgroundTaskRegistrationGroup_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_Background_BackgroundTaskRegistrationGroup_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_Background_BackgroundTaskRegistrationGroup[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','B','a','c','k','g','r','o','u','n','d','.','B','a','c','k','g','r','o','u','n','d','T','a','s','k','R','e','g','i','s','t','r','a','t','i','o','n','G','r','o','u','p',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_Background_BackgroundTaskRegistrationGroup[] = L"Windows.ApplicationModel.Background.BackgroundTaskRegistrationGroup";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_Background_BackgroundTaskRegistrationGroup[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','B','a','c','k','g','r','o','u','n','d','.','B','a','c','k','g','r','o','u','n','d','T','a','s','k','R','e','g','i','s','t','r','a','t','i','o','n','G','r','o','u','p',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_Background_BackgroundTaskRegistrationGroup_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IEventHandler<ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs, 0x49a07732, 0xe7b8, 0x5c5b, 0x9d,0xe7, 0x22,0xe3,0x3c,0xb9,0x70,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("49a07732-e7b8-5c5b-9de7-22e33cb97004")
            IEventHandler<ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs*, ABI::Windows::ApplicationModel::Activation::IBackgroundActivatedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs, 0x49a07732, 0xe7b8, 0x5c5b, 0x9d,0xe7, 0x22,0xe3,0x3c,0xb9,0x70,0x04)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEventHandler<ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs *This,
        IInspectable *sender,
        __x_ABI_CWindows_CApplicationModel_CActivation_CIBackgroundActivatedEventArgs *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgsVtbl;

interface __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs {
    CONST_VTBL __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_QueryInterface(__FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_AddRef(__FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Release(__FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > methods ***/
static inline HRESULT __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Invoke(__FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs* This,IInspectable *sender,__x_ABI_CWindows_CApplicationModel_CActivation_CIBackgroundActivatedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_BackgroundActivatedEventArgs IID___FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs
#define IEventHandler_BackgroundActivatedEventArgsVtbl __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgsVtbl
#define IEventHandler_BackgroundActivatedEventArgs __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs
#define IEventHandler_BackgroundActivatedEventArgs_QueryInterface __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_QueryInterface
#define IEventHandler_BackgroundActivatedEventArgs_AddRef __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_AddRef
#define IEventHandler_BackgroundActivatedEventArgs_Release __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Release
#define IEventHandler_BackgroundActivatedEventArgs_Invoke __FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup*,ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs, 0xd4f89768, 0x688f, 0x59ec, 0xbf,0x24, 0xc2,0xaf,0x6a,0x31,0x0f,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("d4f89768-688f-59ec-bf24-c2af6a310fa4")
            ITypedEventHandler<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup*,ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup*, ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroup* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs*, ABI::Windows::ApplicationModel::Activation::IBackgroundActivatedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs, 0xd4f89768, 0x688f, 0x59ec, 0xbf,0x24, 0xc2,0xaf,0x6a,0x31,0x0f,0xa4)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup*,ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup *sender,
        __x_ABI_CWindows_CApplicationModel_CActivation_CIBackgroundActivatedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup*,ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Release(__FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup*,ABI::Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs* This,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup *sender,__x_ABI_CWindows_CApplicationModel_CActivation_CIBackgroundActivatedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_BackgroundTaskRegistrationGroup_BackgroundActivatedEventArgs IID___FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs
#define ITypedEventHandler_BackgroundTaskRegistrationGroup_BackgroundActivatedEventArgsVtbl __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgsVtbl
#define ITypedEventHandler_BackgroundTaskRegistrationGroup_BackgroundActivatedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs
#define ITypedEventHandler_BackgroundTaskRegistrationGroup_BackgroundActivatedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_QueryInterface
#define ITypedEventHandler_BackgroundTaskRegistrationGroup_BackgroundActivatedEventArgs_AddRef __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_AddRef
#define ITypedEventHandler_BackgroundTaskRegistrationGroup_BackgroundActivatedEventArgs_Release __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Release
#define ITypedEventHandler_BackgroundTaskRegistrationGroup_BackgroundActivatedEventArgs_Invoke __FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Windows__CApplicationModel__CActivation__CBackgroundActivatedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapView<GUID,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistration* > interface
 */
#ifndef ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_INTERFACE_DEFINED__
#define ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration, 0x2c08602f, 0x40b1, 0x5e97, 0xae,0x21, 0x5c,0x04,0xd7,0xfb,0x82,0x9c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("2c08602f-40b1-5e97-ae21-5c04d7fb829c")
                IMapView<GUID,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistration* > : IMapView_impl<GUID, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistration*, ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration, 0x2c08602f, 0x40b1, 0x5e97, 0xae,0x21, 0x5c,0x04,0xd7,0xfb,0x82,0x9c)
#endif
#else
typedef struct __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMapView<GUID,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistration* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration *This,
        GUID key,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration *This,
        GUID key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *Split)(
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration *This,
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration **first,
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration **second);

    END_INTERFACE
} __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationVtbl;

interface __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration {
    CONST_VTBL __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMapView<GUID,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistration* > methods ***/
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_Split(This,first,second) (This)->lpVtbl->Split(This,first,second)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_QueryInterface(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_AddRef(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_Release(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_GetIids(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_GetRuntimeClassName(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_GetTrustLevel(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMapView<GUID,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistration* > methods ***/
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_Lookup(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This,GUID key,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration **value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_get_Size(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_HasKey(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This,GUID key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_Split(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration* This,__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration **first,__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration **second) {
    return This->lpVtbl->Split(This,first,second);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapView_GUID_BackgroundTaskRegistration IID___FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration
#define IMapView_GUID_BackgroundTaskRegistrationVtbl __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationVtbl
#define IMapView_GUID_BackgroundTaskRegistration __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration
#define IMapView_GUID_BackgroundTaskRegistration_QueryInterface __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_QueryInterface
#define IMapView_GUID_BackgroundTaskRegistration_AddRef __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_AddRef
#define IMapView_GUID_BackgroundTaskRegistration_Release __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_Release
#define IMapView_GUID_BackgroundTaskRegistration_GetIids __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_GetIids
#define IMapView_GUID_BackgroundTaskRegistration_GetRuntimeClassName __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_GetRuntimeClassName
#define IMapView_GUID_BackgroundTaskRegistration_GetTrustLevel __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_GetTrustLevel
#define IMapView_GUID_BackgroundTaskRegistration_Lookup __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_Lookup
#define IMapView_GUID_BackgroundTaskRegistration_get_Size __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_get_Size
#define IMapView_GUID_BackgroundTaskRegistration_HasKey __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_HasKey
#define IMapView_GUID_BackgroundTaskRegistration_Split __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_Split
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistration_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapView<GUID,ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* > interface
 */
#ifndef ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_INTERFACE_DEFINED__
#define ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration, 0x78c880f6, 0xa7dc, 0x5172, 0x89,0xda, 0x77,0x49,0xfc,0x82,0xaa,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("78c880f6-a7dc-5172-89da-7749fc82aa82")
                IMapView<GUID,ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* > : IMapView_impl<GUID, ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration, 0x78c880f6, 0xa7dc, 0x5172, 0x89,0xda, 0x77,0x49,0xfc,0x82,0xaa,0x82)
#endif
#else
typedef struct __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistrationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMapView<GUID,ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration *This,
        GUID key,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration *This,
        GUID key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *Split)(
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration *This,
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration **first,
        __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration **second);

    END_INTERFACE
} __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistrationVtbl;

interface __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration {
    CONST_VTBL __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistrationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMapView<GUID,ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* > methods ***/
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_Split(This,first,second) (This)->lpVtbl->Split(This,first,second)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_QueryInterface(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_AddRef(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_Release(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_GetIids(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_GetRuntimeClassName(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_GetTrustLevel(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMapView<GUID,ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistration* > methods ***/
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_Lookup(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This,GUID key,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistration **value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_get_Size(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_HasKey(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This,GUID key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_Split(__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration* This,__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration **first,__FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration **second) {
    return This->lpVtbl->Split(This,first,second);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapView_GUID_IBackgroundTaskRegistration IID___FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration
#define IMapView_GUID_IBackgroundTaskRegistrationVtbl __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistrationVtbl
#define IMapView_GUID_IBackgroundTaskRegistration __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration
#define IMapView_GUID_IBackgroundTaskRegistration_QueryInterface __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_QueryInterface
#define IMapView_GUID_IBackgroundTaskRegistration_AddRef __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_AddRef
#define IMapView_GUID_IBackgroundTaskRegistration_Release __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_Release
#define IMapView_GUID_IBackgroundTaskRegistration_GetIids __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_GetIids
#define IMapView_GUID_IBackgroundTaskRegistration_GetRuntimeClassName __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_GetRuntimeClassName
#define IMapView_GUID_IBackgroundTaskRegistration_GetTrustLevel __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_GetTrustLevel
#define IMapView_GUID_IBackgroundTaskRegistration_Lookup __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_Lookup
#define IMapView_GUID_IBackgroundTaskRegistration_get_Size __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_get_Size
#define IMapView_GUID_IBackgroundTaskRegistration_HasKey __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_HasKey
#define IMapView_GUID_IBackgroundTaskRegistration_Split __FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_Split
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapView_2_GUID_Windows__CApplicationModel__CBackground__CIBackgroundTaskRegistration_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapView<HSTRING,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup* > interface
 */
#ifndef ____FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_INTERFACE_DEFINED__
#define ____FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup, 0xf6a9dc12, 0x01f7, 0x54f0, 0xa2,0x57, 0xc4,0x04,0x81,0x5b,0x9c,0x1c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("f6a9dc12-01f7-54f0-a257-c404815b9c1c")
                IMapView<HSTRING,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup* > : IMapView_impl<HSTRING, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup*, ABI::Windows::ApplicationModel::Background::IBackgroundTaskRegistrationGroup* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup, 0xf6a9dc12, 0x01f7, 0x54f0, 0xa2,0x57, 0xc4,0x04,0x81,0x5b,0x9c,0x1c)
#endif
#else
typedef struct __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroupVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMapView<HSTRING,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup *This,
        HSTRING key,
        __x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup *This,
        HSTRING key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *Split)(
        __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup *This,
        __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup **first,
        __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup **second);

    END_INTERFACE
} __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroupVtbl;

interface __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup {
    CONST_VTBL __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMapView<HSTRING,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup* > methods ***/
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Split(This,first,second) (This)->lpVtbl->Split(This,first,second)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_QueryInterface(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_AddRef(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Release(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_GetIids(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_GetRuntimeClassName(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_GetTrustLevel(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMapView<HSTRING,ABI::Windows::ApplicationModel::Background::BackgroundTaskRegistrationGroup* > methods ***/
static inline HRESULT __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Lookup(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This,HSTRING key,__x_ABI_CWindows_CApplicationModel_CBackground_CIBackgroundTaskRegistrationGroup **value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_get_Size(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_HasKey(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This,HSTRING key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Split(__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup* This,__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup **first,__FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup **second) {
    return This->lpVtbl->Split(This,first,second);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapView_HSTRING_BackgroundTaskRegistrationGroup IID___FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup
#define IMapView_HSTRING_BackgroundTaskRegistrationGroupVtbl __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroupVtbl
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_QueryInterface __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_QueryInterface
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_AddRef __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_AddRef
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_Release __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Release
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_GetIids __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_GetIids
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_GetRuntimeClassName __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_GetRuntimeClassName
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_GetTrustLevel __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_GetTrustLevel
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_Lookup __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Lookup
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_get_Size __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_get_Size
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_HasKey __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_HasKey
#define IMapView_HSTRING_BackgroundTaskRegistrationGroup_Split __FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_Split
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapView_2_HSTRING_Windows__CApplicationModel__CBackground__CBackgroundTaskRegistrationGroup_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_applicationmodel_background_h__ */
