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

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

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

#ifndef __windows_system_h__
#define __windows_system_h__

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

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler ABI::Windows::System::IDispatcherQueueHandler
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueHandler;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueue_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueue_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueue __x_ABI_CWindows_CSystem_CIDispatcherQueue;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue ABI::Windows::System::IDispatcherQueue
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueue;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueue2_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueue2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueue2 __x_ABI_CWindows_CSystem_CIDispatcherQueue2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue2 ABI::Windows::System::IDispatcherQueue2
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueue2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueController_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueController_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueController __x_ABI_CWindows_CSystem_CIDispatcherQueueController;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController ABI::Windows::System::IDispatcherQueueController
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueController;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics ABI::Windows::System::IDispatcherQueueControllerStatics
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueControllerStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs ABI::Windows::System::IDispatcherQueueShutdownStartingEventArgs
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueShutdownStartingEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics ABI::Windows::System::IDispatcherQueueStatics
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer ABI::Windows::System::IDispatcherQueueTimer
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueTimer;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIUserChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIUserChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIUserChangedEventArgs __x_ABI_CWindows_CSystem_CIUserChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs ABI::Windows::System::IUserChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace System {
            interface IUserChangedEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CDispatcherQueue_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CDispatcherQueue_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            class DispatcherQueue;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSystem_CDispatcherQueue __x_ABI_CWindows_CSystem_CDispatcherQueue;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSystem_CDispatcherQueue_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSystem_CDispatcherQueueController_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CDispatcherQueueController_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            class DispatcherQueueController;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSystem_CDispatcherQueueController __x_ABI_CWindows_CSystem_CDispatcherQueueController;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSystem_CDispatcherQueueController_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSystem_CDispatcherQueueShutdownStartingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CDispatcherQueueShutdownStartingEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            class DispatcherQueueShutdownStartingEventArgs;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSystem_CDispatcherQueueShutdownStartingEventArgs __x_ABI_CWindows_CSystem_CDispatcherQueueShutdownStartingEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSystem_CDispatcherQueueShutdownStartingEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSystem_CDispatcherQueueTimer_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CDispatcherQueueTimer_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            class DispatcherQueueTimer;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSystem_CDispatcherQueueTimer __x_ABI_CWindows_CSystem_CDispatcherQueueTimer;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSystem_CDispatcherQueueTimer_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSystem_CUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CUser_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            class User;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSystem_CUser __x_ABI_CWindows_CSystem_CUser;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSystem_CUser_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSystem_CUserChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CUserChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace System {
            class UserChangedEventArgs;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSystem_CUserChangedEventArgs __x_ABI_CWindows_CSystem_CUserChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSystem_CUserChangedEventArgs_FWD_DEFINED__ */

#ifndef ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,ABI::Windows::System::DispatcherQueueShutdownStartingEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::System::DispatcherQueueTimer*,IInspectable* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

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

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

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueue_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueue_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueue __x_ABI_CWindows_CSystem_CIDispatcherQueue;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue ABI::Windows::System::IDispatcherQueue
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueue;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueue2_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueue2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueue2 __x_ABI_CWindows_CSystem_CIDispatcherQueue2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue2 ABI::Windows::System::IDispatcherQueue2
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueue2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueController_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueController_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueController __x_ABI_CWindows_CSystem_CIDispatcherQueueController;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController ABI::Windows::System::IDispatcherQueueController
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueController;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics ABI::Windows::System::IDispatcherQueueControllerStatics
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueControllerStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs ABI::Windows::System::IDispatcherQueueShutdownStartingEventArgs
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueShutdownStartingEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics ABI::Windows::System::IDispatcherQueueStatics
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer ABI::Windows::System::IDispatcherQueueTimer
namespace ABI {
    namespace Windows {
        namespace System {
            interface IDispatcherQueueTimer;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIUser __x_ABI_CWindows_CSystem_CIUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIUser ABI::Windows::System::IUser
namespace ABI {
    namespace Windows {
        namespace System {
            interface IUser;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIUserStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIUserStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIUserStatics __x_ABI_CWindows_CSystem_CIUserStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIUserStatics ABI::Windows::System::IUserStatics
namespace ABI {
    namespace Windows {
        namespace System {
            interface IUserStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIUserChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIUserChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIUserChangedEventArgs __x_ABI_CWindows_CSystem_CIUserChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs ABI::Windows::System::IUserChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace System {
            interface IUserChangedEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSystem_CIUserChangedEventArgs2_FWD_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIUserChangedEventArgs2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSystem_CIUserChangedEventArgs2 __x_ABI_CWindows_CSystem_CIUserChangedEventArgs2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs2 ABI::Windows::System::IUserChangedEventArgs2
namespace ABI {
    namespace Windows {
        namespace System {
            interface IUserChangedEventArgs2;
        }
    }
}
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            enum DispatcherQueuePriority {
                DispatcherQueuePriority_Low = -10,
                DispatcherQueuePriority_Normal = 0,
                DispatcherQueuePriority_High = 10
            };
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSystem_CDispatcherQueuePriority {
    DispatcherQueuePriority_Low = -10,
    DispatcherQueuePriority_Normal = 0,
    DispatcherQueuePriority_High = 10
};
#ifdef WIDL_using_Windows_System
#define DispatcherQueuePriority __x_ABI_CWindows_CSystem_CDispatcherQueuePriority
#endif /* WIDL_using_Windows_System */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            enum ProcessorArchitecture {
                ProcessorArchitecture_X86 = 0,
                ProcessorArchitecture_Arm = 5,
                ProcessorArchitecture_X64 = 9,
                ProcessorArchitecture_Neutral = 11,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                ProcessorArchitecture_Arm64 = 12,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                ProcessorArchitecture_X86OnArm64 = 14,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
                ProcessorArchitecture_Unknown = 65535
            };
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSystem_CProcessorArchitecture {
    ProcessorArchitecture_X86 = 0,
    ProcessorArchitecture_Arm = 5,
    ProcessorArchitecture_X64 = 9,
    ProcessorArchitecture_Neutral = 11,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    ProcessorArchitecture_Arm64 = 12,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    ProcessorArchitecture_X86OnArm64 = 14,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
    ProcessorArchitecture_Unknown = 65535
};
#ifdef WIDL_using_Windows_System
#define ProcessorArchitecture __x_ABI_CWindows_CSystem_CProcessorArchitecture
#endif /* WIDL_using_Windows_System */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IDispatcherQueueHandler interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CIDispatcherQueueHandler, 0xdfa2dc9c, 0x1a2d, 0x4917, 0x98,0xf2, 0x93,0x9a,0xf1,0xd6,0xe0,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            MIDL_INTERFACE("dfa2dc9c-1a2d-4917-98f2-939af1d6e0c8")
            IDispatcherQueueHandler : public IUnknown
            {
                virtual HRESULT STDMETHODCALLTYPE Invoke(
                    ) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CIDispatcherQueueHandler, 0xdfa2dc9c, 0x1a2d, 0x4917, 0x98,0xf2, 0x93,0x9a,0xf1,0xd6,0xe0,0xc8)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CIDispatcherQueueHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatcherQueueHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler *This);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CIDispatcherQueueHandlerVtbl;

interface __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler {
    CONST_VTBL __x_ABI_CWindows_CSystem_CIDispatcherQueueHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatcherQueueHandler methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_Invoke(This) (This)->lpVtbl->Invoke(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_QueryInterface(__x_ABI_CWindows_CSystem_CIDispatcherQueueHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_AddRef(__x_ABI_CWindows_CSystem_CIDispatcherQueueHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_Release(__x_ABI_CWindows_CSystem_CIDispatcherQueueHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatcherQueueHandler methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_Invoke(__x_ABI_CWindows_CSystem_CIDispatcherQueueHandler* This) {
    return This->lpVtbl->Invoke(This);
}
#endif
#ifdef WIDL_using_Windows_System
#define IID_IDispatcherQueueHandler IID___x_ABI_CWindows_CSystem_CIDispatcherQueueHandler
#define IDispatcherQueueHandlerVtbl __x_ABI_CWindows_CSystem_CIDispatcherQueueHandlerVtbl
#define IDispatcherQueueHandler __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler
#define IDispatcherQueueHandler_QueryInterface __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_QueryInterface
#define IDispatcherQueueHandler_AddRef __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_AddRef
#define IDispatcherQueueHandler_Release __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_Release
#define IDispatcherQueueHandler_Invoke __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_Invoke
#endif /* WIDL_using_Windows_System */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CIDispatcherQueueHandler_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * IDispatcherQueue interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueue_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueue_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CIDispatcherQueue, 0x603e88e4, 0xa338, 0x4ffe, 0xa4,0x57, 0xa5,0xcf,0xb9,0xce,0xb8,0x99);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            MIDL_INTERFACE("603e88e4-a338-4ffe-a457-a5cfb9ceb899")
            IDispatcherQueue : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE CreateTimer(
                    ABI::Windows::System::IDispatcherQueueTimer **result) = 0;

                virtual HRESULT STDMETHODCALLTYPE TryEnqueue(
                    ABI::Windows::System::IDispatcherQueueHandler *callback,
                    boolean *result) = 0;

                virtual HRESULT STDMETHODCALLTYPE TryEnqueueWithPriority(
                    enum DispatcherQueuePriority priority,
                    ABI::Windows::System::IDispatcherQueueHandler *callback,
                    boolean *result) = 0;

                virtual HRESULT STDMETHODCALLTYPE add_ShutdownStarting(
                    ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,ABI::Windows::System::DispatcherQueueShutdownStartingEventArgs* > *handler,
                    EventRegistrationToken *token) = 0;

                virtual HRESULT STDMETHODCALLTYPE remove_ShutdownStarting(
                    EventRegistrationToken token) = 0;

                virtual HRESULT STDMETHODCALLTYPE add_ShutdownCompleted(
                    ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,IInspectable* > *handler,
                    EventRegistrationToken *token) = 0;

                virtual HRESULT STDMETHODCALLTYPE remove_ShutdownCompleted(
                    EventRegistrationToken token) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CIDispatcherQueue, 0x603e88e4, 0xa338, 0x4ffe, 0xa4,0x57, 0xa5,0xcf,0xb9,0xce,0xb8,0x99)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CIDispatcherQueueVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDispatcherQueue methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTimer)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueue *This,
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer **result);

    HRESULT (STDMETHODCALLTYPE *TryEnqueue)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueue *This,
        __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler *callback,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *TryEnqueueWithPriority)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueue *This,
        enum __x_ABI_CWindows_CSystem_CDispatcherQueuePriority priority,
        __x_ABI_CWindows_CSystem_CIDispatcherQueueHandler *callback,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *add_ShutdownStarting)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueue *This,
        __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ShutdownStarting)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueue *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_ShutdownCompleted)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueue *This,
        __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ShutdownCompleted)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueue *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CIDispatcherQueueVtbl;

interface __x_ABI_CWindows_CSystem_CIDispatcherQueue {
    CONST_VTBL __x_ABI_CWindows_CSystem_CIDispatcherQueueVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDispatcherQueue methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_CreateTimer(This,result) (This)->lpVtbl->CreateTimer(This,result)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_TryEnqueue(This,callback,result) (This)->lpVtbl->TryEnqueue(This,callback,result)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_TryEnqueueWithPriority(This,priority,callback,result) (This)->lpVtbl->TryEnqueueWithPriority(This,priority,callback,result)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_add_ShutdownStarting(This,handler,token) (This)->lpVtbl->add_ShutdownStarting(This,handler,token)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_remove_ShutdownStarting(This,token) (This)->lpVtbl->remove_ShutdownStarting(This,token)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_add_ShutdownCompleted(This,handler,token) (This)->lpVtbl->add_ShutdownCompleted(This,handler,token)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue_remove_ShutdownCompleted(This,token) (This)->lpVtbl->remove_ShutdownCompleted(This,token)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_QueryInterface(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueue_AddRef(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueue_Release(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_GetIids(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_GetTrustLevel(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDispatcherQueue methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_CreateTimer(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer **result) {
    return This->lpVtbl->CreateTimer(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_TryEnqueue(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,__x_ABI_CWindows_CSystem_CIDispatcherQueueHandler *callback,boolean *result) {
    return This->lpVtbl->TryEnqueue(This,callback,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_TryEnqueueWithPriority(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,enum __x_ABI_CWindows_CSystem_CDispatcherQueuePriority priority,__x_ABI_CWindows_CSystem_CIDispatcherQueueHandler *callback,boolean *result) {
    return This->lpVtbl->TryEnqueueWithPriority(This,priority,callback,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_add_ShutdownStarting(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_ShutdownStarting(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_remove_ShutdownStarting(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ShutdownStarting(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_add_ShutdownCompleted(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_ShutdownCompleted(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue_remove_ShutdownCompleted(__x_ABI_CWindows_CSystem_CIDispatcherQueue* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ShutdownCompleted(This,token);
}
#endif
#ifdef WIDL_using_Windows_System
#define IID_IDispatcherQueue IID___x_ABI_CWindows_CSystem_CIDispatcherQueue
#define IDispatcherQueueVtbl __x_ABI_CWindows_CSystem_CIDispatcherQueueVtbl
#define IDispatcherQueue __x_ABI_CWindows_CSystem_CIDispatcherQueue
#define IDispatcherQueue_QueryInterface __x_ABI_CWindows_CSystem_CIDispatcherQueue_QueryInterface
#define IDispatcherQueue_AddRef __x_ABI_CWindows_CSystem_CIDispatcherQueue_AddRef
#define IDispatcherQueue_Release __x_ABI_CWindows_CSystem_CIDispatcherQueue_Release
#define IDispatcherQueue_GetIids __x_ABI_CWindows_CSystem_CIDispatcherQueue_GetIids
#define IDispatcherQueue_GetRuntimeClassName __x_ABI_CWindows_CSystem_CIDispatcherQueue_GetRuntimeClassName
#define IDispatcherQueue_GetTrustLevel __x_ABI_CWindows_CSystem_CIDispatcherQueue_GetTrustLevel
#define IDispatcherQueue_CreateTimer __x_ABI_CWindows_CSystem_CIDispatcherQueue_CreateTimer
#define IDispatcherQueue_TryEnqueue __x_ABI_CWindows_CSystem_CIDispatcherQueue_TryEnqueue
#define IDispatcherQueue_TryEnqueueWithPriority __x_ABI_CWindows_CSystem_CIDispatcherQueue_TryEnqueueWithPriority
#define IDispatcherQueue_add_ShutdownStarting __x_ABI_CWindows_CSystem_CIDispatcherQueue_add_ShutdownStarting
#define IDispatcherQueue_remove_ShutdownStarting __x_ABI_CWindows_CSystem_CIDispatcherQueue_remove_ShutdownStarting
#define IDispatcherQueue_add_ShutdownCompleted __x_ABI_CWindows_CSystem_CIDispatcherQueue_add_ShutdownCompleted
#define IDispatcherQueue_remove_ShutdownCompleted __x_ABI_CWindows_CSystem_CIDispatcherQueue_remove_ShutdownCompleted
#endif /* WIDL_using_Windows_System */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CIDispatcherQueue_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * IDispatcherQueue2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueue2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueue2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CIDispatcherQueue2, 0xc822c647, 0x30ef, 0x506e, 0xbd,0x1e, 0xa6,0x47,0xae,0x66,0x75,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            MIDL_INTERFACE("c822c647-30ef-506e-bd1e-a647ae6675ff")
            IDispatcherQueue2 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_HasThreadAccess(
                    boolean *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CIDispatcherQueue2, 0xc822c647, 0x30ef, 0x506e, 0xbd,0x1e, 0xa6,0x47,0xae,0x66,0x75,0xff)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CIDispatcherQueue2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDispatcherQueue2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HasThreadAccess)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueue2 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CIDispatcherQueue2Vtbl;

interface __x_ABI_CWindows_CSystem_CIDispatcherQueue2 {
    CONST_VTBL __x_ABI_CWindows_CSystem_CIDispatcherQueue2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDispatcherQueue2 methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueue2_get_HasThreadAccess(This,value) (This)->lpVtbl->get_HasThreadAccess(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue2_QueryInterface(__x_ABI_CWindows_CSystem_CIDispatcherQueue2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueue2_AddRef(__x_ABI_CWindows_CSystem_CIDispatcherQueue2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueue2_Release(__x_ABI_CWindows_CSystem_CIDispatcherQueue2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue2_GetIids(__x_ABI_CWindows_CSystem_CIDispatcherQueue2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue2_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CIDispatcherQueue2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue2_GetTrustLevel(__x_ABI_CWindows_CSystem_CIDispatcherQueue2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDispatcherQueue2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueue2_get_HasThreadAccess(__x_ABI_CWindows_CSystem_CIDispatcherQueue2* This,boolean *value) {
    return This->lpVtbl->get_HasThreadAccess(This,value);
}
#endif
#ifdef WIDL_using_Windows_System
#define IID_IDispatcherQueue2 IID___x_ABI_CWindows_CSystem_CIDispatcherQueue2
#define IDispatcherQueue2Vtbl __x_ABI_CWindows_CSystem_CIDispatcherQueue2Vtbl
#define IDispatcherQueue2 __x_ABI_CWindows_CSystem_CIDispatcherQueue2
#define IDispatcherQueue2_QueryInterface __x_ABI_CWindows_CSystem_CIDispatcherQueue2_QueryInterface
#define IDispatcherQueue2_AddRef __x_ABI_CWindows_CSystem_CIDispatcherQueue2_AddRef
#define IDispatcherQueue2_Release __x_ABI_CWindows_CSystem_CIDispatcherQueue2_Release
#define IDispatcherQueue2_GetIids __x_ABI_CWindows_CSystem_CIDispatcherQueue2_GetIids
#define IDispatcherQueue2_GetRuntimeClassName __x_ABI_CWindows_CSystem_CIDispatcherQueue2_GetRuntimeClassName
#define IDispatcherQueue2_GetTrustLevel __x_ABI_CWindows_CSystem_CIDispatcherQueue2_GetTrustLevel
#define IDispatcherQueue2_get_HasThreadAccess __x_ABI_CWindows_CSystem_CIDispatcherQueue2_get_HasThreadAccess
#endif /* WIDL_using_Windows_System */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CIDispatcherQueue2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IDispatcherQueueController interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueController_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueController_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CIDispatcherQueueController, 0x22f34e66, 0x50db, 0x4e36, 0xa9,0x8d, 0x61,0xc0,0x1b,0x38,0x4d,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            MIDL_INTERFACE("22f34e66-50db-4e36-a98d-61c01b384d20")
            IDispatcherQueueController : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_DispatcherQueue(
                    ABI::Windows::System::IDispatcherQueue **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE ShutdownQueueAsync(
                    ABI::Windows::Foundation::IAsyncAction **operation) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CIDispatcherQueueController, 0x22f34e66, 0x50db, 0x4e36, 0xa9,0x8d, 0x61,0xc0,0x1b,0x38,0x4d,0x20)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDispatcherQueueController methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DispatcherQueue)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueController *This,
        __x_ABI_CWindows_CSystem_CIDispatcherQueue **value);

    HRESULT (STDMETHODCALLTYPE *ShutdownQueueAsync)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueController *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerVtbl;

interface __x_ABI_CWindows_CSystem_CIDispatcherQueueController {
    CONST_VTBL __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDispatcherQueueController methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController_get_DispatcherQueue(This,value) (This)->lpVtbl->get_DispatcherQueue(This,value)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueController_ShutdownQueueAsync(This,operation) (This)->lpVtbl->ShutdownQueueAsync(This,operation)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueController_QueryInterface(__x_ABI_CWindows_CSystem_CIDispatcherQueueController* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueController_AddRef(__x_ABI_CWindows_CSystem_CIDispatcherQueueController* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueController_Release(__x_ABI_CWindows_CSystem_CIDispatcherQueueController* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueController_GetIids(__x_ABI_CWindows_CSystem_CIDispatcherQueueController* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueController_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CIDispatcherQueueController* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueController_GetTrustLevel(__x_ABI_CWindows_CSystem_CIDispatcherQueueController* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDispatcherQueueController methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueController_get_DispatcherQueue(__x_ABI_CWindows_CSystem_CIDispatcherQueueController* This,__x_ABI_CWindows_CSystem_CIDispatcherQueue **value) {
    return This->lpVtbl->get_DispatcherQueue(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueController_ShutdownQueueAsync(__x_ABI_CWindows_CSystem_CIDispatcherQueueController* This,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->ShutdownQueueAsync(This,operation);
}
#endif
#ifdef WIDL_using_Windows_System
#define IID_IDispatcherQueueController IID___x_ABI_CWindows_CSystem_CIDispatcherQueueController
#define IDispatcherQueueControllerVtbl __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerVtbl
#define IDispatcherQueueController __x_ABI_CWindows_CSystem_CIDispatcherQueueController
#define IDispatcherQueueController_QueryInterface __x_ABI_CWindows_CSystem_CIDispatcherQueueController_QueryInterface
#define IDispatcherQueueController_AddRef __x_ABI_CWindows_CSystem_CIDispatcherQueueController_AddRef
#define IDispatcherQueueController_Release __x_ABI_CWindows_CSystem_CIDispatcherQueueController_Release
#define IDispatcherQueueController_GetIids __x_ABI_CWindows_CSystem_CIDispatcherQueueController_GetIids
#define IDispatcherQueueController_GetRuntimeClassName __x_ABI_CWindows_CSystem_CIDispatcherQueueController_GetRuntimeClassName
#define IDispatcherQueueController_GetTrustLevel __x_ABI_CWindows_CSystem_CIDispatcherQueueController_GetTrustLevel
#define IDispatcherQueueController_get_DispatcherQueue __x_ABI_CWindows_CSystem_CIDispatcherQueueController_get_DispatcherQueue
#define IDispatcherQueueController_ShutdownQueueAsync __x_ABI_CWindows_CSystem_CIDispatcherQueueController_ShutdownQueueAsync
#endif /* WIDL_using_Windows_System */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CIDispatcherQueueController_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * IDispatcherQueueControllerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics, 0x0a6c98e0, 0x5198, 0x49a2, 0xa3,0x13, 0x3f,0x70,0xd1,0xf1,0x3c,0x27);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            MIDL_INTERFACE("0a6c98e0-5198-49a2-a313-3f70d1f13c27")
            IDispatcherQueueControllerStatics : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE CreateOnDedicatedThread(
                    ABI::Windows::System::IDispatcherQueueController **result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics, 0x0a6c98e0, 0x5198, 0x49a2, 0xa3,0x13, 0x3f,0x70,0xd1,0xf1,0x3c,0x27)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDispatcherQueueControllerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateOnDedicatedThread)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics *This,
        __x_ABI_CWindows_CSystem_CIDispatcherQueueController **result);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStaticsVtbl;

interface __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics {
    CONST_VTBL __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDispatcherQueueControllerStatics methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_CreateOnDedicatedThread(This,result) (This)->lpVtbl->CreateOnDedicatedThread(This,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_QueryInterface(__x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_AddRef(__x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_Release(__x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_GetIids(__x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_GetTrustLevel(__x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDispatcherQueueControllerStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_CreateOnDedicatedThread(__x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics* This,__x_ABI_CWindows_CSystem_CIDispatcherQueueController **result) {
    return This->lpVtbl->CreateOnDedicatedThread(This,result);
}
#endif
#ifdef WIDL_using_Windows_System
#define IID_IDispatcherQueueControllerStatics IID___x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics
#define IDispatcherQueueControllerStaticsVtbl __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStaticsVtbl
#define IDispatcherQueueControllerStatics __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics
#define IDispatcherQueueControllerStatics_QueryInterface __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_QueryInterface
#define IDispatcherQueueControllerStatics_AddRef __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_AddRef
#define IDispatcherQueueControllerStatics_Release __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_Release
#define IDispatcherQueueControllerStatics_GetIids __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_GetIids
#define IDispatcherQueueControllerStatics_GetRuntimeClassName __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_GetRuntimeClassName
#define IDispatcherQueueControllerStatics_GetTrustLevel __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_GetTrustLevel
#define IDispatcherQueueControllerStatics_CreateOnDedicatedThread __x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_CreateOnDedicatedThread
#endif /* WIDL_using_Windows_System */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CIDispatcherQueueControllerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * IDispatcherQueueShutdownStartingEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs, 0xc4724c4c, 0xff97, 0x40c0, 0xa2,0x26, 0xcc,0x0a,0xaa,0x54,0x5e,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            MIDL_INTERFACE("c4724c4c-ff97-40c0-a226-cc0aaa545e89")
            IDispatcherQueueShutdownStartingEventArgs : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                    ABI::Windows::Foundation::IDeferral **result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs, 0xc4724c4c, 0xff97, 0x40c0, 0xa2,0x26, 0xcc,0x0a,0xaa,0x54,0x5e,0x89)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDispatcherQueueShutdownStartingEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **result);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgsVtbl;

interface __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs {
    CONST_VTBL __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDispatcherQueueShutdownStartingEventArgs methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetDeferral(This,result) (This)->lpVtbl->GetDeferral(This,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_QueryInterface(__x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_AddRef(__x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_Release(__x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetIids(__x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetTrustLevel(__x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDispatcherQueueShutdownStartingEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetDeferral(__x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **result) {
    return This->lpVtbl->GetDeferral(This,result);
}
#endif
#ifdef WIDL_using_Windows_System
#define IID_IDispatcherQueueShutdownStartingEventArgs IID___x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs
#define IDispatcherQueueShutdownStartingEventArgsVtbl __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgsVtbl
#define IDispatcherQueueShutdownStartingEventArgs __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs
#define IDispatcherQueueShutdownStartingEventArgs_QueryInterface __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_QueryInterface
#define IDispatcherQueueShutdownStartingEventArgs_AddRef __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_AddRef
#define IDispatcherQueueShutdownStartingEventArgs_Release __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_Release
#define IDispatcherQueueShutdownStartingEventArgs_GetIids __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetIids
#define IDispatcherQueueShutdownStartingEventArgs_GetRuntimeClassName __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetRuntimeClassName
#define IDispatcherQueueShutdownStartingEventArgs_GetTrustLevel __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetTrustLevel
#define IDispatcherQueueShutdownStartingEventArgs_GetDeferral __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_GetDeferral
#endif /* WIDL_using_Windows_System */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * IDispatcherQueueStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CIDispatcherQueueStatics, 0xa96d83d7, 0x9371, 0x4517, 0x92,0x45, 0xd0,0x82,0x4a,0xc1,0x2c,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            MIDL_INTERFACE("a96d83d7-9371-4517-9245-d0824ac12c74")
            IDispatcherQueueStatics : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetForCurrentThread(
                    ABI::Windows::System::IDispatcherQueue **result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CIDispatcherQueueStatics, 0xa96d83d7, 0x9371, 0x4517, 0x92,0x45, 0xd0,0x82,0x4a,0xc1,0x2c,0x74)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CIDispatcherQueueStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDispatcherQueueStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForCurrentThread)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics *This,
        __x_ABI_CWindows_CSystem_CIDispatcherQueue **result);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CIDispatcherQueueStaticsVtbl;

interface __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics {
    CONST_VTBL __x_ABI_CWindows_CSystem_CIDispatcherQueueStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDispatcherQueueStatics methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetForCurrentThread(This,result) (This)->lpVtbl->GetForCurrentThread(This,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_QueryInterface(__x_ABI_CWindows_CSystem_CIDispatcherQueueStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_AddRef(__x_ABI_CWindows_CSystem_CIDispatcherQueueStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_Release(__x_ABI_CWindows_CSystem_CIDispatcherQueueStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetIids(__x_ABI_CWindows_CSystem_CIDispatcherQueueStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CIDispatcherQueueStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetTrustLevel(__x_ABI_CWindows_CSystem_CIDispatcherQueueStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDispatcherQueueStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetForCurrentThread(__x_ABI_CWindows_CSystem_CIDispatcherQueueStatics* This,__x_ABI_CWindows_CSystem_CIDispatcherQueue **result) {
    return This->lpVtbl->GetForCurrentThread(This,result);
}
#endif
#ifdef WIDL_using_Windows_System
#define IID_IDispatcherQueueStatics IID___x_ABI_CWindows_CSystem_CIDispatcherQueueStatics
#define IDispatcherQueueStaticsVtbl __x_ABI_CWindows_CSystem_CIDispatcherQueueStaticsVtbl
#define IDispatcherQueueStatics __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics
#define IDispatcherQueueStatics_QueryInterface __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_QueryInterface
#define IDispatcherQueueStatics_AddRef __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_AddRef
#define IDispatcherQueueStatics_Release __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_Release
#define IDispatcherQueueStatics_GetIids __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetIids
#define IDispatcherQueueStatics_GetRuntimeClassName __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetRuntimeClassName
#define IDispatcherQueueStatics_GetTrustLevel __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetTrustLevel
#define IDispatcherQueueStatics_GetForCurrentThread __x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_GetForCurrentThread
#endif /* WIDL_using_Windows_System */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CIDispatcherQueueStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * IDispatcherQueueTimer interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CIDispatcherQueueTimer, 0x5feabb1d, 0xa31c, 0x4727, 0xb1,0xac, 0x37,0x45,0x46,0x49,0xd5,0x6a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            MIDL_INTERFACE("5feabb1d-a31c-4727-b1ac-37454649d56a")
            IDispatcherQueueTimer : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Interval(
                    struct TimeSpan *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE put_Interval(
                    struct TimeSpan value) = 0;

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

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

                virtual HRESULT STDMETHODCALLTYPE put_IsRepeating(
                    boolean value) = 0;

                virtual HRESULT STDMETHODCALLTYPE Start(
                    ) = 0;

                virtual HRESULT STDMETHODCALLTYPE Stop(
                    ) = 0;

                virtual HRESULT STDMETHODCALLTYPE add_Tick(
                    ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::System::DispatcherQueueTimer*,IInspectable* > *handler,
                    EventRegistrationToken *token) = 0;

                virtual HRESULT STDMETHODCALLTYPE remove_Tick(
                    EventRegistrationToken token) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer, 0x5feabb1d, 0xa31c, 0x4727, 0xb1,0xac, 0x37,0x45,0x46,0x49,0xd5,0x6a)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CIDispatcherQueueTimerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDispatcherQueueTimer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Interval)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *This,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *put_Interval)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *This,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan value);

    HRESULT (STDMETHODCALLTYPE *get_IsRunning)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsRepeating)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsRepeating)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *Start)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *This);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *This);

    HRESULT (STDMETHODCALLTYPE *add_Tick)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *This,
        __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Tick)(
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CIDispatcherQueueTimerVtbl;

interface __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer {
    CONST_VTBL __x_ABI_CWindows_CSystem_CIDispatcherQueueTimerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDispatcherQueueTimer methods ***/
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_get_Interval(This,value) (This)->lpVtbl->get_Interval(This,value)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_put_Interval(This,value) (This)->lpVtbl->put_Interval(This,value)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_get_IsRunning(This,value) (This)->lpVtbl->get_IsRunning(This,value)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_get_IsRepeating(This,value) (This)->lpVtbl->get_IsRepeating(This,value)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_put_IsRepeating(This,value) (This)->lpVtbl->put_IsRepeating(This,value)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_Start(This) (This)->lpVtbl->Start(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_Stop(This) (This)->lpVtbl->Stop(This)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_add_Tick(This,handler,token) (This)->lpVtbl->add_Tick(This,handler,token)
#define __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_remove_Tick(This,token) (This)->lpVtbl->remove_Tick(This,token)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_QueryInterface(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_AddRef(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_Release(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_GetIids(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_GetTrustLevel(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDispatcherQueueTimer methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_get_Interval(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,struct __x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_Interval(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_put_Interval(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,struct __x_ABI_CWindows_CFoundation_CTimeSpan value) {
    return This->lpVtbl->put_Interval(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_get_IsRunning(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,boolean *value) {
    return This->lpVtbl->get_IsRunning(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_get_IsRepeating(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,boolean *value) {
    return This->lpVtbl->get_IsRepeating(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_put_IsRepeating(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,boolean value) {
    return This->lpVtbl->put_IsRepeating(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_Start(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This) {
    return This->lpVtbl->Start(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_Stop(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This) {
    return This->lpVtbl->Stop(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_add_Tick(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Tick(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_remove_Tick(__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Tick(This,token);
}
#endif
#ifdef WIDL_using_Windows_System
#define IID_IDispatcherQueueTimer IID___x_ABI_CWindows_CSystem_CIDispatcherQueueTimer
#define IDispatcherQueueTimerVtbl __x_ABI_CWindows_CSystem_CIDispatcherQueueTimerVtbl
#define IDispatcherQueueTimer __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer
#define IDispatcherQueueTimer_QueryInterface __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_QueryInterface
#define IDispatcherQueueTimer_AddRef __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_AddRef
#define IDispatcherQueueTimer_Release __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_Release
#define IDispatcherQueueTimer_GetIids __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_GetIids
#define IDispatcherQueueTimer_GetRuntimeClassName __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_GetRuntimeClassName
#define IDispatcherQueueTimer_GetTrustLevel __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_GetTrustLevel
#define IDispatcherQueueTimer_get_Interval __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_get_Interval
#define IDispatcherQueueTimer_put_Interval __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_put_Interval
#define IDispatcherQueueTimer_get_IsRunning __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_get_IsRunning
#define IDispatcherQueueTimer_get_IsRepeating __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_get_IsRepeating
#define IDispatcherQueueTimer_put_IsRepeating __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_put_IsRepeating
#define IDispatcherQueueTimer_Start __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_Start
#define IDispatcherQueueTimer_Stop __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_Stop
#define IDispatcherQueueTimer_add_Tick __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_add_Tick
#define IDispatcherQueueTimer_remove_Tick __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_remove_Tick
#endif /* WIDL_using_Windows_System */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSystem_CIDispatcherQueueTimer_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * IUserChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSystem_CIUserChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSystem_CIUserChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CIUserChangedEventArgs, 0x086459dc, 0x18c6, 0x48db, 0xbc,0x99, 0x72,0x4f,0xb9,0x20,0x3c,0xcc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace System {
            MIDL_INTERFACE("086459dc-18c6-48db-bc99-724fb9203ccc")
            IUserChangedEventArgs : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_User(
                    ABI::Windows::System::IUser **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSystem_CIUserChangedEventArgs, 0x086459dc, 0x18c6, 0x48db, 0xbc,0x99, 0x72,0x4f,0xb9,0x20,0x3c,0xcc)
#endif
#else
typedef struct __x_ABI_CWindows_CSystem_CIUserChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUserChangedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CSystem_CIUserChangedEventArgs *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    END_INTERFACE
} __x_ABI_CWindows_CSystem_CIUserChangedEventArgsVtbl;

interface __x_ABI_CWindows_CSystem_CIUserChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CSystem_CIUserChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUserChangedEventArgs methods ***/
#define __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_QueryInterface(__x_ABI_CWindows_CSystem_CIUserChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_AddRef(__x_ABI_CWindows_CSystem_CIUserChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_Release(__x_ABI_CWindows_CSystem_CIUserChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_GetIids(__x_ABI_CWindows_CSystem_CIUserChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CIUserChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CSystem_CIUserChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUserChangedEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_get_User(__x_ABI_CWindows_CSystem_CIUserChangedEventArgs* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
#endif
#ifdef WIDL_using_Windows_System
#define IID_IUserChangedEventArgs IID___x_ABI_CWindows_CSystem_CIUserChangedEventArgs
#define IUserChangedEventArgsVtbl __x_ABI_CWindows_CSystem_CIUserChangedEventArgsVtbl
#define IUserChangedEventArgs __x_ABI_CWindows_CSystem_CIUserChangedEventArgs
#define IUserChangedEventArgs_QueryInterface __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_QueryInterface
#define IUserChangedEventArgs_AddRef __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_AddRef
#define IUserChangedEventArgs_Release __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_Release
#define IUserChangedEventArgs_GetIids __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_GetIids
#define IUserChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_GetRuntimeClassName
#define IUserChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_GetTrustLevel
#define IUserChangedEventArgs_get_User __x_ABI_CWindows_CSystem_CIUserChangedEventArgs_get_User
#endif /* WIDL_using_Windows_System */
#endif

#endif

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

/*
 * Class Windows.System.DispatcherQueue
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef RUNTIMECLASS_Windows_System_DispatcherQueue_DEFINED
#define RUNTIMECLASS_Windows_System_DispatcherQueue_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_System_DispatcherQueue[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','D','i','s','p','a','t','c','h','e','r','Q','u','e','u','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_DispatcherQueue[] = L"Windows.System.DispatcherQueue";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_DispatcherQueue[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','D','i','s','p','a','t','c','h','e','r','Q','u','e','u','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_System_DispatcherQueue_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*
 * Class Windows.System.DispatcherQueueController
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef RUNTIMECLASS_Windows_System_DispatcherQueueController_DEFINED
#define RUNTIMECLASS_Windows_System_DispatcherQueueController_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_System_DispatcherQueueController[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','D','i','s','p','a','t','c','h','e','r','Q','u','e','u','e','C','o','n','t','r','o','l','l','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_DispatcherQueueController[] = L"Windows.System.DispatcherQueueController";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_DispatcherQueueController[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','D','i','s','p','a','t','c','h','e','r','Q','u','e','u','e','C','o','n','t','r','o','l','l','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_System_DispatcherQueueController_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*
 * Class Windows.System.DispatcherQueueShutdownStartingEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef RUNTIMECLASS_Windows_System_DispatcherQueueShutdownStartingEventArgs_DEFINED
#define RUNTIMECLASS_Windows_System_DispatcherQueueShutdownStartingEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_System_DispatcherQueueShutdownStartingEventArgs[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','D','i','s','p','a','t','c','h','e','r','Q','u','e','u','e','S','h','u','t','d','o','w','n','S','t','a','r','t','i','n','g','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_DispatcherQueueShutdownStartingEventArgs[] = L"Windows.System.DispatcherQueueShutdownStartingEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_DispatcherQueueShutdownStartingEventArgs[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','D','i','s','p','a','t','c','h','e','r','Q','u','e','u','e','S','h','u','t','d','o','w','n','S','t','a','r','t','i','n','g','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_System_DispatcherQueueShutdownStartingEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*
 * Class Windows.System.DispatcherQueueTimer
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef RUNTIMECLASS_Windows_System_DispatcherQueueTimer_DEFINED
#define RUNTIMECLASS_Windows_System_DispatcherQueueTimer_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_System_DispatcherQueueTimer[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','D','i','s','p','a','t','c','h','e','r','Q','u','e','u','e','T','i','m','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_DispatcherQueueTimer[] = L"Windows.System.DispatcherQueueTimer";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_DispatcherQueueTimer[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','D','i','s','p','a','t','c','h','e','r','Q','u','e','u','e','T','i','m','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_System_DispatcherQueueTimer_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*
 * Class Windows.System.User
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_System_User_DEFINED
#define RUNTIMECLASS_Windows_System_User_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_System_User[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','U','s','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_User[] = L"Windows.System.User";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_User[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','U','s','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_System_User_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.System.UserChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_System_UserChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_System_UserChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_System_UserChangedEventArgs[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','U','s','e','r','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_UserChangedEventArgs[] = L"Windows.System.UserChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_System_UserChangedEventArgs[] = {'W','i','n','d','o','w','s','.','S','y','s','t','e','m','.','U','s','e','r','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_System_UserChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable, 0xfe79f855, 0x2f40, 0x5b88, 0xa0,0xc3, 0x4c,0x04,0x2a,0x05,0xdd,0x05);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("fe79f855-2f40-5b88-a0c3-4c042a05dd05")
            ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::System::DispatcherQueue*, ABI::Windows::System::IDispatcherQueue* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable, 0xfe79f855, 0x2f40, 0x5b88, 0xa0,0xc3, 0x4c,0x04,0x2a,0x05,0xdd,0x05)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable *This,
        __x_ABI_CWindows_CSystem_CIDispatcherQueue *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_Release(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,IInspectable* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable* This,__x_ABI_CWindows_CSystem_CIDispatcherQueue *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DispatcherQueue_IInspectable IID___FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable
#define ITypedEventHandler_DispatcherQueue_IInspectableVtbl __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectableVtbl
#define ITypedEventHandler_DispatcherQueue_IInspectable __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable
#define ITypedEventHandler_DispatcherQueue_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_QueryInterface
#define ITypedEventHandler_DispatcherQueue_IInspectable_AddRef __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_AddRef
#define ITypedEventHandler_DispatcherQueue_IInspectable_Release __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_Release
#define ITypedEventHandler_DispatcherQueue_IInspectable_Invoke __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,ABI::Windows::System::DispatcherQueueShutdownStartingEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs, 0xb58b5e24, 0xe1c6, 0x528e, 0x9d,0x99, 0x07,0xec,0x88,0x29,0xde,0xa5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b58b5e24-e1c6-528e-9d99-07ec8829dea5")
            ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,ABI::Windows::System::DispatcherQueueShutdownStartingEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::System::DispatcherQueue*, ABI::Windows::System::IDispatcherQueue* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::System::DispatcherQueueShutdownStartingEventArgs*, ABI::Windows::System::IDispatcherQueueShutdownStartingEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs, 0xb58b5e24, 0xe1c6, 0x528e, 0x9d,0x99, 0x07,0xec,0x88,0x29,0xde,0xa5)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,ABI::Windows::System::DispatcherQueueShutdownStartingEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs *This,
        __x_ABI_CWindows_CSystem_CIDispatcherQueue *sender,
        __x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,ABI::Windows::System::DispatcherQueueShutdownStartingEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_AddRef(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_Release(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::System::DispatcherQueue*,ABI::Windows::System::DispatcherQueueShutdownStartingEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_Invoke(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs* This,__x_ABI_CWindows_CSystem_CIDispatcherQueue *sender,__x_ABI_CWindows_CSystem_CIDispatcherQueueShutdownStartingEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DispatcherQueue_DispatcherQueueShutdownStartingEventArgs IID___FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs
#define ITypedEventHandler_DispatcherQueue_DispatcherQueueShutdownStartingEventArgsVtbl __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgsVtbl
#define ITypedEventHandler_DispatcherQueue_DispatcherQueueShutdownStartingEventArgs __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs
#define ITypedEventHandler_DispatcherQueue_DispatcherQueueShutdownStartingEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_QueryInterface
#define ITypedEventHandler_DispatcherQueue_DispatcherQueueShutdownStartingEventArgs_AddRef __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_AddRef
#define ITypedEventHandler_DispatcherQueue_DispatcherQueueShutdownStartingEventArgs_Release __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_Release
#define ITypedEventHandler_DispatcherQueue_DispatcherQueueShutdownStartingEventArgs_Invoke __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueue_Windows__CSystem__CDispatcherQueueShutdownStartingEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::System::DispatcherQueueTimer*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable, 0x8b5644c8, 0x8b57, 0x50ce, 0x89,0x33, 0x7a,0xb2,0xcc,0x5a,0x14,0xef);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("8b5644c8-8b57-50ce-8933-7ab2cc5a14ef")
            ITypedEventHandler<ABI::Windows::System::DispatcherQueueTimer*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::System::DispatcherQueueTimer*, ABI::Windows::System::IDispatcherQueueTimer* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable, 0x8b5644c8, 0x8b57, 0x50ce, 0x89,0x33, 0x7a,0xb2,0xcc,0x5a,0x14,0xef)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::System::DispatcherQueueTimer*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable *This,
        __x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::System::DispatcherQueueTimer*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_Release(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::System::DispatcherQueueTimer*,IInspectable* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable* This,__x_ABI_CWindows_CSystem_CIDispatcherQueueTimer *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DispatcherQueueTimer_IInspectable IID___FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable
#define ITypedEventHandler_DispatcherQueueTimer_IInspectableVtbl __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectableVtbl
#define ITypedEventHandler_DispatcherQueueTimer_IInspectable __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable
#define ITypedEventHandler_DispatcherQueueTimer_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_QueryInterface
#define ITypedEventHandler_DispatcherQueueTimer_IInspectable_AddRef __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_AddRef
#define ITypedEventHandler_DispatcherQueueTimer_IInspectable_Release __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_Release
#define ITypedEventHandler_DispatcherQueueTimer_IInspectable_Invoke __FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CSystem__CDispatcherQueueTimer_IInspectable_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_system_h__ */
