/*** Autogenerated by WIDL 1.5.31 from include/windows.foundation.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

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

#ifndef __windows_foundation_h__
#define __windows_foundation_h__

/* Forward declarations */

#ifndef __IAsyncInfo_FWD_DEFINED__
#define __IAsyncInfo_FWD_DEFINED__
typedef interface IAsyncInfo IAsyncInfo;
#endif

#ifndef __IASyncAction_FWD_DEFINED__
#define __IASyncAction_FWD_DEFINED__
typedef interface IASyncAction IASyncAction;
#endif

#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__
#define __AsyncActionCompletedHandler_FWD_DEFINED__
typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler;
#endif

#ifndef __IAsyncOperation_FWD_DEFINED__
#define __IAsyncOperation_FWD_DEFINED__
typedef interface IAsyncOperation IAsyncOperation;
#endif

/* Headers for imported files */

#include <inspectable.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __IAsyncInfo_FWD_DEFINED__
#define __IAsyncInfo_FWD_DEFINED__
typedef interface IAsyncInfo IAsyncInfo;
#endif

#ifndef __IAsyncAction_FWD_DEFINED__
#define __IAsyncAction_FWD_DEFINED__
typedef interface IAsyncAction IAsyncAction;
#endif

#ifndef __IAsyncOperation_FWD_DEFINED__
#define __IAsyncOperation_FWD_DEFINED__
typedef interface IAsyncOperation IAsyncOperation;
#endif

#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__
#define __AsyncActionCompletedHandler_FWD_DEFINED__
typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler;
#endif

#ifndef __TypedEventHandler_FWD_DEFINED__
#define __TypedEventHandler_FWD_DEFINED__
typedef interface TypedEventHandler TypedEventHandler;
#endif

struct DateTime;

struct EventRegistrationToken;

#ifndef __IVectorView_FWD_DEFINED__
#define __IVectorView_FWD_DEFINED__
typedef interface IVectorView IVectorView;
#endif

#ifndef __IPropertySet_FWD_DEFINED__
#define __IPropertySet_FWD_DEFINED__
typedef interface IPropertySet IPropertySet;
#endif

typedef enum AsyncStatus {
    Started = 0,
    Completed = 1,
    Canceled = 2,
    Error = 3
} AsyncStatus;
typedef struct DateTime {
    UINT64 UniversalTime;
} DateTime;
typedef struct EventRegistrationToken {
    UINT64 Value;
} EventRegistrationToken;
/*****************************************************************************
 * IAsyncInfo interface
 */
#ifndef __IAsyncInfo_INTERFACE_DEFINED__
#define __IAsyncInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000036-0000-0000-c000-000000000046")
IAsyncInfo : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE get_Id(
        unsigned int *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Status(
        AsyncStatus *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ErrorCode(
        HRESULT *errorCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IAsyncInfoVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IAsyncInfo* This,
        unsigned int *id);

    HRESULT (STDMETHODCALLTYPE *get_Status)(
        IAsyncInfo* This,
        AsyncStatus *status);

    HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
        IAsyncInfo* This,
        HRESULT *errorCode);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IAsyncInfo* This);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IAsyncInfo* This);

    END_INTERFACE
} IAsyncInfoVtbl;
interface IAsyncInfo {
    CONST_VTBL IAsyncInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAsyncInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAsyncInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAsyncInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define IAsyncInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define IAsyncInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define IAsyncInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncInfo methods ***/
#define IAsyncInfo_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IAsyncInfo_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
#define IAsyncInfo_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
#define IAsyncInfo_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IAsyncInfo_Close(This) (This)->lpVtbl->Close(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAsyncInfo_QueryInterface(IAsyncInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAsyncInfo_AddRef(IAsyncInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAsyncInfo_Release(IAsyncInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT IAsyncInfo_GetIids(IAsyncInfo* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT IAsyncInfo_GetRuntimeClassName(IAsyncInfo* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT IAsyncInfo_GetTrustLevel(IAsyncInfo* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncInfo methods ***/
static FORCEINLINE HRESULT IAsyncInfo_get_Id(IAsyncInfo* This,unsigned int *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT IAsyncInfo_get_Status(IAsyncInfo* This,AsyncStatus *status) {
    return This->lpVtbl->get_Status(This,status);
}
static FORCEINLINE HRESULT IAsyncInfo_get_ErrorCode(IAsyncInfo* This,HRESULT *errorCode) {
    return This->lpVtbl->get_ErrorCode(This,errorCode);
}
static FORCEINLINE HRESULT IAsyncInfo_Cancel(IAsyncInfo* This) {
    return This->lpVtbl->Cancel(This);
}
static FORCEINLINE HRESULT IAsyncInfo_Close(IAsyncInfo* This) {
    return This->lpVtbl->Close(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Id_Proxy(
    IAsyncInfo* This,
    unsigned int *id);
void __RPC_STUB IAsyncInfo_get_Id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Status_Proxy(
    IAsyncInfo* This,
    AsyncStatus *status);
void __RPC_STUB IAsyncInfo_get_Status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAsyncInfo_get_ErrorCode_Proxy(
    IAsyncInfo* This,
    HRESULT *errorCode);
void __RPC_STUB IAsyncInfo_get_ErrorCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAsyncInfo_Cancel_Proxy(
    IAsyncInfo* This);
void __RPC_STUB IAsyncInfo_Cancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAsyncInfo_Close_Proxy(
    IAsyncInfo* This);
void __RPC_STUB IAsyncInfo_Close_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAsyncInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IASyncAction interface
 */
#ifndef __IASyncAction_INTERFACE_DEFINED__
#define __IASyncAction_INTERFACE_DEFINED__

DEFINE_GUID(IID_IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5a648006-843a-4da9-865b-9d26e5dfad7b")
IASyncAction : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE put_Completed(
        AsyncActionCompletedHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Completed(
        AsyncActionCompletedHandler **handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResults(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b)
#endif
#else
typedef struct IASyncActionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IASyncAction methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        IASyncAction* This,
        AsyncActionCompletedHandler *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        IASyncAction* This,
        AsyncActionCompletedHandler **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        IASyncAction* This);

    END_INTERFACE
} IASyncActionVtbl;
interface IASyncAction {
    CONST_VTBL IASyncActionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IASyncAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IASyncAction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IASyncAction_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define IASyncAction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define IASyncAction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define IASyncAction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IASyncAction methods ***/
#define IASyncAction_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define IASyncAction_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define IASyncAction_GetResults(This) (This)->lpVtbl->GetResults(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IASyncAction_QueryInterface(IASyncAction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IASyncAction_AddRef(IASyncAction* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IASyncAction_Release(IASyncAction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT IASyncAction_GetIids(IASyncAction* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT IASyncAction_GetRuntimeClassName(IASyncAction* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT IASyncAction_GetTrustLevel(IASyncAction* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IASyncAction methods ***/
static FORCEINLINE HRESULT IASyncAction_put_Completed(IASyncAction* This,AsyncActionCompletedHandler *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static FORCEINLINE HRESULT IASyncAction_get_Completed(IASyncAction* This,AsyncActionCompletedHandler **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static FORCEINLINE HRESULT IASyncAction_GetResults(IASyncAction* This) {
    return This->lpVtbl->GetResults(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IASyncAction_put_Completed_Proxy(
    IASyncAction* This,
    AsyncActionCompletedHandler *handler);
void __RPC_STUB IASyncAction_put_Completed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IASyncAction_get_Completed_Proxy(
    IASyncAction* This,
    AsyncActionCompletedHandler **handler);
void __RPC_STUB IASyncAction_get_Completed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IASyncAction_GetResults_Proxy(
    IASyncAction* This);
void __RPC_STUB IASyncAction_GetResults_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IASyncAction_INTERFACE_DEFINED__ */

/*****************************************************************************
 * AsyncActionCompletedHandler interface
 */
#ifndef __AsyncActionCompletedHandler_INTERFACE_DEFINED__
#define __AsyncActionCompletedHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a4ed5c81-76c9-40bd-8be6-b1d90fb20ae7")
AsyncActionCompletedHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Invoke(
        IInspectable *asyncAction,
        AsyncStatus status) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7)
#endif
#else
typedef struct AsyncActionCompletedHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** AsyncActionCompletedHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        AsyncActionCompletedHandler* This,
        IInspectable *asyncAction,
        AsyncStatus status);

    END_INTERFACE
} AsyncActionCompletedHandlerVtbl;
interface AsyncActionCompletedHandler {
    CONST_VTBL AsyncActionCompletedHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define AsyncActionCompletedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncActionCompletedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncActionCompletedHandler_Release(This) (This)->lpVtbl->Release(This)
/*** AsyncActionCompletedHandler methods ***/
#define AsyncActionCompletedHandler_Invoke(This,asyncAction,status) (This)->lpVtbl->Invoke(This,asyncAction,status)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT AsyncActionCompletedHandler_QueryInterface(AsyncActionCompletedHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG AsyncActionCompletedHandler_AddRef(AsyncActionCompletedHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG AsyncActionCompletedHandler_Release(AsyncActionCompletedHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** AsyncActionCompletedHandler methods ***/
static FORCEINLINE HRESULT AsyncActionCompletedHandler_Invoke(AsyncActionCompletedHandler* This,IInspectable *asyncAction,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,asyncAction,status);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE AsyncActionCompletedHandler_Invoke_Proxy(
    AsyncActionCompletedHandler* This,
    IInspectable *asyncAction,
    AsyncStatus status);
void __RPC_STUB AsyncActionCompletedHandler_Invoke_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __AsyncActionCompletedHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation interface
 */
#ifndef __IAsyncOperation_INTERFACE_DEFINED__
#define __IAsyncOperation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9fc2b0bb-e446-44e2-aa61-9cab8f636af2")
IAsyncOperation : public IAsyncInfo
{
    virtual HRESULT STDMETHODCALLTYPE put_Completed(
        AsyncActionCompletedHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Completed(
        AsyncActionCompletedHandler **handler) = 0;

    virtual IInspectable * STDMETHODCALLTYPE GetResults(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2)
#endif
#else
typedef struct IAsyncOperationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IAsyncOperation* This,
        unsigned int *id);

    HRESULT (STDMETHODCALLTYPE *get_Status)(
        IAsyncOperation* This,
        AsyncStatus *status);

    HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
        IAsyncOperation* This,
        HRESULT *errorCode);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IAsyncOperation* This);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IAsyncOperation* This);

    /*** IAsyncOperation methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        IAsyncOperation* This,
        AsyncActionCompletedHandler *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        IAsyncOperation* This,
        AsyncActionCompletedHandler **handler);

    IInspectable * (STDMETHODCALLTYPE *GetResults)(
        IAsyncOperation* This);

    END_INTERFACE
} IAsyncOperationVtbl;
interface IAsyncOperation {
    CONST_VTBL IAsyncOperationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAsyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAsyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAsyncOperation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define IAsyncOperation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define IAsyncOperation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define IAsyncOperation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncInfo methods ***/
#define IAsyncOperation_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IAsyncOperation_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
#define IAsyncOperation_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
#define IAsyncOperation_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IAsyncOperation_Close(This) (This)->lpVtbl->Close(This)
/*** IAsyncOperation methods ***/
#define IAsyncOperation_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define IAsyncOperation_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define IAsyncOperation_GetResults(This) (This)->lpVtbl->GetResults(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAsyncOperation_QueryInterface(IAsyncOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAsyncOperation_AddRef(IAsyncOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAsyncOperation_Release(IAsyncOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT IAsyncOperation_GetIids(IAsyncOperation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT IAsyncOperation_GetRuntimeClassName(IAsyncOperation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT IAsyncOperation_GetTrustLevel(IAsyncOperation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncInfo methods ***/
static FORCEINLINE HRESULT IAsyncOperation_get_Id(IAsyncOperation* This,unsigned int *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT IAsyncOperation_get_Status(IAsyncOperation* This,AsyncStatus *status) {
    return This->lpVtbl->get_Status(This,status);
}
static FORCEINLINE HRESULT IAsyncOperation_get_ErrorCode(IAsyncOperation* This,HRESULT *errorCode) {
    return This->lpVtbl->get_ErrorCode(This,errorCode);
}
static FORCEINLINE HRESULT IAsyncOperation_Cancel(IAsyncOperation* This) {
    return This->lpVtbl->Cancel(This);
}
static FORCEINLINE HRESULT IAsyncOperation_Close(IAsyncOperation* This) {
    return This->lpVtbl->Close(This);
}
/*** IAsyncOperation methods ***/
static FORCEINLINE HRESULT IAsyncOperation_put_Completed(IAsyncOperation* This,AsyncActionCompletedHandler *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static FORCEINLINE HRESULT IAsyncOperation_get_Completed(IAsyncOperation* This,AsyncActionCompletedHandler **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static FORCEINLINE IInspectable * IAsyncOperation_GetResults(IAsyncOperation* This) {
    return This->lpVtbl->GetResults(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAsyncOperation_put_Completed_Proxy(
    IAsyncOperation* This,
    AsyncActionCompletedHandler *handler);
void __RPC_STUB IAsyncOperation_put_Completed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAsyncOperation_get_Completed_Proxy(
    IAsyncOperation* This,
    AsyncActionCompletedHandler **handler);
void __RPC_STUB IAsyncOperation_get_Completed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
IInspectable * STDMETHODCALLTYPE IAsyncOperation_GetResults_Proxy(
    IAsyncOperation* This);
void __RPC_STUB IAsyncOperation_GetResults_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAsyncOperation_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_foundation_h__ */
