/*** Autogenerated by WIDL 11.6 from include/windows.media.faceanalysis.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_media_faceanalysis_h__
#define __windows_media_faceanalysis_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace ABI::Windows::Media::FaceAnalysis::IDetectedFace
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                interface IDetectedFace;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector ABI::Windows::Media::FaceAnalysis::IFaceDetector
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                interface IFaceDetector;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics ABI::Windows::Media::FaceAnalysis::IFaceDetectorStatics
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                interface IFaceDetectorStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CDetectedFace_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CDetectedFace_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                class DetectedFace;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CFaceAnalysis_CDetectedFace __x_ABI_CWindows_CMedia_CFaceAnalysis_CDetectedFace;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CFaceAnalysis_CDetectedFace_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CFaceDetector_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CFaceDetector_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                class FaceDetector;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CFaceAnalysis_CFaceDetector __x_ABI_CWindows_CMedia_CFaceAnalysis_CFaceDetector;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CFaceAnalysis_CFaceDetector_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::FaceAnalysis::DetectedFace* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::FaceAnalysis::DetectedFace* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::FaceAnalysis::DetectedFace* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::FaceAnalysis::FaceDetector* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Media::FaceAnalysis::FaceDetector* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace ABI::Windows::Media::FaceAnalysis::IDetectedFace
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                interface IDetectedFace;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector ABI::Windows::Media::FaceAnalysis::IFaceDetector
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                interface IFaceDetector;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics ABI::Windows::Media::FaceAnalysis::IFaceDetectorStatics
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                interface IFaceDetectorStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::FaceAnalysis::DetectedFace* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::FaceAnalysis::DetectedFace* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::FaceAnalysis::DetectedFace* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::FaceAnalysis::FaceDetector* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* >
#endif /* __cplusplus */
#endif

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

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace, 0x8200d454, 0x66bc, 0x34df, 0x94,0x10, 0xe8,0x94,0x00,0x19,0x54,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                MIDL_INTERFACE("8200d454-66bc-34df-9410-e89400195414")
                IDetectedFace : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_FaceBox(
                        ABI::Windows::Graphics::Imaging::BitmapBounds *return_value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace, 0x8200d454, 0x66bc, 0x34df, 0x94,0x10, 0xe8,0x94,0x00,0x19,0x54,0x14)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFaceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDetectedFace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_FaceBox)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds *return_value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFaceVtbl;

interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace {
    CONST_VTBL __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDetectedFace methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_get_FaceBox(This,return_value) (This)->lpVtbl->get_FaceBox(This,return_value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_QueryInterface(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_AddRef(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_Release(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_GetIids(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_GetTrustLevel(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDetectedFace methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_get_FaceBox(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds *return_value) {
    return This->lpVtbl->get_FaceBox(This,return_value);
}
#endif
#ifdef WIDL_using_Windows_Media_FaceAnalysis
#define IID_IDetectedFace IID___x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace
#define IDetectedFaceVtbl __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFaceVtbl
#define IDetectedFace __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace
#define IDetectedFace_QueryInterface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_QueryInterface
#define IDetectedFace_AddRef __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_AddRef
#define IDetectedFace_Release __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_Release
#define IDetectedFace_GetIids __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_GetIids
#define IDetectedFace_GetRuntimeClassName __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_GetRuntimeClassName
#define IDetectedFace_GetTrustLevel __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_GetTrustLevel
#define IDetectedFace_get_FaceBox __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_get_FaceBox
#endif /* WIDL_using_Windows_Media_FaceAnalysis */
#endif

#endif

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

/*****************************************************************************
 * IFaceDetector interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector, 0x16b672dc, 0xfe6f, 0x3117, 0x8d,0x95, 0xc3,0xf0,0x4d,0x51,0x63,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                MIDL_INTERFACE("16b672dc-fe6f-3117-8d95-c3f04d51630c")
                IFaceDetector : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE DetectFacesAsync(
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap *image,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > **return_value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE DetectFacesWithSearchAreaAsync(
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap *image,
                        ABI::Windows::Graphics::Imaging::BitmapBounds search_area,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > **return_value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MinDetectableFaceSize(
                        ABI::Windows::Graphics::Imaging::BitmapSize *return_value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_MinDetectableFaceSize(
                        ABI::Windows::Graphics::Imaging::BitmapSize value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MaxDetectableFaceSize(
                        ABI::Windows::Graphics::Imaging::BitmapSize *return_value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_MaxDetectableFaceSize(
                        ABI::Windows::Graphics::Imaging::BitmapSize value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector, 0x16b672dc, 0xfe6f, 0x3117, 0x8d,0x95, 0xc3,0xf0,0x4d,0x51,0x63,0x0c)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IFaceDetector methods ***/
    HRESULT (STDMETHODCALLTYPE *DetectFacesAsync)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector *This,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *image,
        __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **return_value);

    HRESULT (STDMETHODCALLTYPE *DetectFacesWithSearchAreaAsync)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector *This,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *image,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds search_area,
        __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **return_value);

    HRESULT (STDMETHODCALLTYPE *get_MinDetectableFaceSize)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize *return_value);

    HRESULT (STDMETHODCALLTYPE *put_MinDetectableFaceSize)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize value);

    HRESULT (STDMETHODCALLTYPE *get_MaxDetectableFaceSize)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize *return_value);

    HRESULT (STDMETHODCALLTYPE *put_MaxDetectableFaceSize)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorVtbl;

interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector {
    CONST_VTBL __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IFaceDetector methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_DetectFacesAsync(This,image,return_value) (This)->lpVtbl->DetectFacesAsync(This,image,return_value)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_DetectFacesWithSearchAreaAsync(This,image,search_area,return_value) (This)->lpVtbl->DetectFacesWithSearchAreaAsync(This,image,search_area,return_value)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_get_MinDetectableFaceSize(This,return_value) (This)->lpVtbl->get_MinDetectableFaceSize(This,return_value)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_put_MinDetectableFaceSize(This,value) (This)->lpVtbl->put_MinDetectableFaceSize(This,value)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_get_MaxDetectableFaceSize(This,return_value) (This)->lpVtbl->get_MaxDetectableFaceSize(This,return_value)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_put_MaxDetectableFaceSize(This,value) (This)->lpVtbl->put_MaxDetectableFaceSize(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_QueryInterface(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_AddRef(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_Release(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_GetIids(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_GetTrustLevel(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IFaceDetector methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_DetectFacesAsync(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *image,__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **return_value) {
    return This->lpVtbl->DetectFacesAsync(This,image,return_value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_DetectFacesWithSearchAreaAsync(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *image,__x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds search_area,__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **return_value) {
    return This->lpVtbl->DetectFacesWithSearchAreaAsync(This,image,search_area,return_value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_get_MinDetectableFaceSize(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapSize *return_value) {
    return This->lpVtbl->get_MinDetectableFaceSize(This,return_value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_put_MinDetectableFaceSize(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapSize value) {
    return This->lpVtbl->put_MinDetectableFaceSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_get_MaxDetectableFaceSize(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapSize *return_value) {
    return This->lpVtbl->get_MaxDetectableFaceSize(This,return_value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_put_MaxDetectableFaceSize(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapSize value) {
    return This->lpVtbl->put_MaxDetectableFaceSize(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_FaceAnalysis
#define IID_IFaceDetector IID___x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector
#define IFaceDetectorVtbl __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorVtbl
#define IFaceDetector __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector
#define IFaceDetector_QueryInterface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_QueryInterface
#define IFaceDetector_AddRef __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_AddRef
#define IFaceDetector_Release __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_Release
#define IFaceDetector_GetIids __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_GetIids
#define IFaceDetector_GetRuntimeClassName __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_GetRuntimeClassName
#define IFaceDetector_GetTrustLevel __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_GetTrustLevel
#define IFaceDetector_DetectFacesAsync __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_DetectFacesAsync
#define IFaceDetector_DetectFacesWithSearchAreaAsync __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_DetectFacesWithSearchAreaAsync
#define IFaceDetector_get_MinDetectableFaceSize __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_get_MinDetectableFaceSize
#define IFaceDetector_put_MinDetectableFaceSize __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_put_MinDetectableFaceSize
#define IFaceDetector_get_MaxDetectableFaceSize __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_get_MaxDetectableFaceSize
#define IFaceDetector_put_MaxDetectableFaceSize __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_put_MaxDetectableFaceSize
#endif /* WIDL_using_Windows_Media_FaceAnalysis */
#endif

#endif

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

/*****************************************************************************
 * IFaceDetectorStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics, 0xbc042d67, 0x9047, 0x33f6, 0x88,0x1b, 0x67,0x46,0xc1,0xb2,0x18,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace FaceAnalysis {
                MIDL_INTERFACE("bc042d67-9047-33f6-881b-6746c1b218b8")
                IFaceDetectorStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::FaceAnalysis::FaceDetector* > **return_value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetSupportedBitmapPixelFormats(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE IsBitmapPixelFormatSupported(
                        ABI::Windows::Graphics::Imaging::BitmapPixelFormat bitmap_pixel_format,
                        boolean *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsSupported(
                        boolean *return_value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics, 0xbc042d67, 0x9047, 0x33f6, 0x88,0x1b, 0x67,0x46,0xc1,0xb2,0x18,0xb8)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IFaceDetectorStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateAsync)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics *This,
        __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector **return_value);

    HRESULT (STDMETHODCALLTYPE *GetSupportedBitmapPixelFormats)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics *This,
        __FIVectorView_1_BitmapPixelFormat **result);

    HRESULT (STDMETHODCALLTYPE *IsBitmapPixelFormatSupported)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat bitmap_pixel_format,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *get_IsSupported)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics *This,
        boolean *return_value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStaticsVtbl;

interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics {
    CONST_VTBL __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IFaceDetectorStatics methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_CreateAsync(This,return_value) (This)->lpVtbl->CreateAsync(This,return_value)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetSupportedBitmapPixelFormats(This,result) (This)->lpVtbl->GetSupportedBitmapPixelFormats(This,result)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_IsBitmapPixelFormatSupported(This,bitmap_pixel_format,result) (This)->lpVtbl->IsBitmapPixelFormatSupported(This,bitmap_pixel_format,result)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_get_IsSupported(This,return_value) (This)->lpVtbl->get_IsSupported(This,return_value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_QueryInterface(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_AddRef(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_Release(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetIids(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetTrustLevel(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IFaceDetectorStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_CreateAsync(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This,__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector **return_value) {
    return This->lpVtbl->CreateAsync(This,return_value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetSupportedBitmapPixelFormats(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This,__FIVectorView_1_BitmapPixelFormat **result) {
    return This->lpVtbl->GetSupportedBitmapPixelFormats(This,result);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_IsBitmapPixelFormatSupported(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat bitmap_pixel_format,boolean *result) {
    return This->lpVtbl->IsBitmapPixelFormatSupported(This,bitmap_pixel_format,result);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_get_IsSupported(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This,boolean *return_value) {
    return This->lpVtbl->get_IsSupported(This,return_value);
}
#endif
#ifdef WIDL_using_Windows_Media_FaceAnalysis
#define IID_IFaceDetectorStatics IID___x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics
#define IFaceDetectorStaticsVtbl __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStaticsVtbl
#define IFaceDetectorStatics __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics
#define IFaceDetectorStatics_QueryInterface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_QueryInterface
#define IFaceDetectorStatics_AddRef __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_AddRef
#define IFaceDetectorStatics_Release __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_Release
#define IFaceDetectorStatics_GetIids __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetIids
#define IFaceDetectorStatics_GetRuntimeClassName __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetRuntimeClassName
#define IFaceDetectorStatics_GetTrustLevel __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetTrustLevel
#define IFaceDetectorStatics_CreateAsync __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_CreateAsync
#define IFaceDetectorStatics_GetSupportedBitmapPixelFormats __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetSupportedBitmapPixelFormats
#define IFaceDetectorStatics_IsBitmapPixelFormatSupported __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_IsBitmapPixelFormatSupported
#define IFaceDetectorStatics_get_IsSupported __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_get_IsSupported
#endif /* WIDL_using_Windows_Media_FaceAnalysis */
#endif

#endif

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

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

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

/*****************************************************************************
 * IIterable<ABI::Windows::Media::FaceAnalysis::DetectedFace* > interface
 */
#ifndef ____FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0x25347323, 0x3556, 0x5cbb, 0x98,0x55, 0x2b,0x58,0x56,0x43,0x7f,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("25347323-3556-5cbb-9855-2b5856437f4d")
                IIterable<ABI::Windows::Media::FaceAnalysis::DetectedFace* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::FaceAnalysis::DetectedFace*, ABI::Windows::Media::FaceAnalysis::IDetectedFace* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0x25347323, 0x3556, 0x5cbb, 0x98,0x55, 0x2b,0x58,0x56,0x43,0x7f,0x4d)
#endif
#else
typedef struct __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **value);

    END_INTERFACE
} __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl;

interface __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace {
    CONST_VTBL __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
#define __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_First(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_DetectedFace IID___FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IIterable_DetectedFaceVtbl __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl
#define IIterable_DetectedFace __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IIterable_DetectedFace_QueryInterface __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface
#define IIterable_DetectedFace_AddRef __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef
#define IIterable_DetectedFace_Release __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release
#define IIterable_DetectedFace_GetIids __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids
#define IIterable_DetectedFace_GetRuntimeClassName __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName
#define IIterable_DetectedFace_GetTrustLevel __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel
#define IIterable_DetectedFace_First __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Media::FaceAnalysis::DetectedFace* > interface
 */
#ifndef ____FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0xa0cf090e, 0x0340, 0x531f, 0x89,0x8b, 0xc2,0x1e,0xaf,0xb9,0xf4,0xae);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("a0cf090e-0340-531f-898b-c21eafb9f4ae")
                IIterator<ABI::Windows::Media::FaceAnalysis::DetectedFace* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::FaceAnalysis::DetectedFace*, ABI::Windows::Media::FaceAnalysis::IDetectedFace* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0xa0cf090e, 0x0340, 0x531f, 0x89,0x8b, 0xc2,0x1e,0xaf,0xb9,0xf4,0xae)
#endif
#else
typedef struct __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        UINT32 items_size,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl;

interface __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace {
    CONST_VTBL __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Current(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_HasCurrent(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_MoveNext(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetMany(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 items_size,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_DetectedFace IID___FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IIterator_DetectedFaceVtbl __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl
#define IIterator_DetectedFace __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IIterator_DetectedFace_QueryInterface __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface
#define IIterator_DetectedFace_AddRef __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef
#define IIterator_DetectedFace_Release __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release
#define IIterator_DetectedFace_GetIids __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids
#define IIterator_DetectedFace_GetRuntimeClassName __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName
#define IIterator_DetectedFace_GetTrustLevel __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel
#define IIterator_DetectedFace_get_Current __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Current
#define IIterator_DetectedFace_get_HasCurrent __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_HasCurrent
#define IIterator_DetectedFace_MoveNext __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_MoveNext
#define IIterator_DetectedFace_GetMany __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Media::FaceAnalysis::DetectedFace* > interface
 */
#ifndef ____FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0x39ef4411, 0x0618, 0x5b8d, 0x8e,0xa2, 0x81,0xc6,0x37,0xf8,0x23,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("39ef4411-0618-5b8d-8ea2-81c637f823f8")
                IVectorView<ABI::Windows::Media::FaceAnalysis::DetectedFace* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::FaceAnalysis::DetectedFace*, ABI::Windows::Media::FaceAnalysis::IDetectedFace* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0x39ef4411, 0x0618, 0x5b8d, 0x8e,0xa2, 0x81,0xc6,0x37,0xf8,0x23,0xf8)
#endif
#else
typedef struct __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        UINT32 index,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl;

interface __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace {
    CONST_VTBL __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetAt(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 index,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Size(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_IndexOf(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetMany(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_DetectedFace IID___FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IVectorView_DetectedFaceVtbl __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl
#define IVectorView_DetectedFace __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IVectorView_DetectedFace_QueryInterface __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface
#define IVectorView_DetectedFace_AddRef __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef
#define IVectorView_DetectedFace_Release __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release
#define IVectorView_DetectedFace_GetIids __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids
#define IVectorView_DetectedFace_GetRuntimeClassName __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName
#define IVectorView_DetectedFace_GetTrustLevel __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel
#define IVectorView_DetectedFace_GetAt __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetAt
#define IVectorView_DetectedFace_get_Size __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Size
#define IVectorView_DetectedFace_IndexOf __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_IndexOf
#define IVectorView_DetectedFace_GetMany __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* > interface
 */
#ifndef ____FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0x0dfd8e09, 0x73f2, 0x505c, 0xa7,0x96, 0xa8,0xf0,0x31,0xb4,0xed,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0dfd8e09-73f2-505c-a796-a8f031b4ede0")
                IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::FaceAnalysis::DetectedFace*, ABI::Windows::Media::FaceAnalysis::IDetectedFace* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0x0dfd8e09, 0x73f2, 0x505c, 0xa7,0x96, 0xa8,0xf0,0x31,0xb4,0xed,0xe0)
#endif
#else
typedef struct __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        UINT32 index,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **value);

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

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        UINT32 index,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        UINT32 index,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        UINT32 count,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **items);

    END_INTERFACE
} __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl;

interface __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace {
    CONST_VTBL __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* > methods ***/
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetAt(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 index,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Size(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetView(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **value) {
    return This->lpVtbl->GetView(This,value);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_IndexOf(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_SetAt(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 index,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_InsertAt(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 index,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_RemoveAt(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Append(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace *value) {
    return This->lpVtbl->Append(This,value);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_RemoveAtEnd(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Clear(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetMany(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static inline HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_ReplaceAll(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,UINT32 count,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_DetectedFace IID___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IVector_DetectedFaceVtbl __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl
#define IVector_DetectedFace __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IVector_DetectedFace_QueryInterface __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface
#define IVector_DetectedFace_AddRef __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef
#define IVector_DetectedFace_Release __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release
#define IVector_DetectedFace_GetIids __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids
#define IVector_DetectedFace_GetRuntimeClassName __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName
#define IVector_DetectedFace_GetTrustLevel __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel
#define IVector_DetectedFace_GetAt __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetAt
#define IVector_DetectedFace_get_Size __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Size
#define IVector_DetectedFace_GetView __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetView
#define IVector_DetectedFace_IndexOf __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_IndexOf
#define IVector_DetectedFace_SetAt __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_SetAt
#define IVector_DetectedFace_InsertAt __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_InsertAt
#define IVector_DetectedFace_RemoveAt __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_RemoveAt
#define IVector_DetectedFace_Append __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Append
#define IVector_DetectedFace_RemoveAtEnd __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_RemoveAtEnd
#define IVector_DetectedFace_Clear __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Clear
#define IVector_DetectedFace_GetMany __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetMany
#define IVector_DetectedFace_ReplaceAll __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Media::FaceAnalysis::FaceDetector* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector, 0xc0141cd2, 0x7a65, 0x514c, 0xbf,0xc4, 0xb4,0x9e,0x99,0x1f,0x03,0xeb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c0141cd2-7a65-514c-bfc4-b49e991f03eb")
            IAsyncOperation<ABI::Windows::Media::FaceAnalysis::FaceDetector* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::FaceAnalysis::FaceDetector*, ABI::Windows::Media::FaceAnalysis::IFaceDetector* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector, 0xc0141cd2, 0x7a65, 0x514c, 0xbf,0xc4, 0xb4,0x9e,0x99,0x1f,0x03,0xeb)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetectorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Media::FaceAnalysis::FaceDetector* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector *This,
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetectorVtbl;

interface __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector {
    CONST_VTBL __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Media::FaceAnalysis::FaceDetector* > methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_QueryInterface(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_AddRef(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Release(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetIids(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetTrustLevel(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Media::FaceAnalysis::FaceDetector* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_put_Completed(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This,__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_get_Completed(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This,__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetResults(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This,__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_FaceDetector IID___FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector
#define IAsyncOperation_FaceDetectorVtbl __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetectorVtbl
#define IAsyncOperation_FaceDetector __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector
#define IAsyncOperation_FaceDetector_QueryInterface __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_QueryInterface
#define IAsyncOperation_FaceDetector_AddRef __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_AddRef
#define IAsyncOperation_FaceDetector_Release __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Release
#define IAsyncOperation_FaceDetector_GetIids __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetIids
#define IAsyncOperation_FaceDetector_GetRuntimeClassName __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetRuntimeClassName
#define IAsyncOperation_FaceDetector_GetTrustLevel __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetTrustLevel
#define IAsyncOperation_FaceDetector_put_Completed __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_put_Completed
#define IAsyncOperation_FaceDetector_get_Completed __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_get_Completed
#define IAsyncOperation_FaceDetector_GetResults __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Media::FaceAnalysis::FaceDetector* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector, 0x3224aec6, 0xe785, 0x5066, 0x97,0x6f, 0x79,0xdd,0x08,0x1b,0x75,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("3224aec6-e785-5066-976f-79dd081b75a9")
            IAsyncOperationCompletedHandler<ABI::Windows::Media::FaceAnalysis::FaceDetector* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::FaceAnalysis::FaceDetector*, ABI::Windows::Media::FaceAnalysis::IFaceDetector* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector, 0x3224aec6, 0xe785, 0x5066, 0x97,0x6f, 0x79,0xdd,0x08,0x1b,0x75,0xa9)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetectorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Media::FaceAnalysis::FaceDetector* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector *This,
        __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetectorVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::FaceAnalysis::FaceDetector* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Release(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::FaceAnalysis::FaceDetector* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This,__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_FaceDetector IID___FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector
#define IAsyncOperationCompletedHandler_FaceDetectorVtbl __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetectorVtbl
#define IAsyncOperationCompletedHandler_FaceDetector __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector
#define IAsyncOperationCompletedHandler_FaceDetector_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_QueryInterface
#define IAsyncOperationCompletedHandler_FaceDetector_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_AddRef
#define IAsyncOperationCompletedHandler_FaceDetector_Release __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Release
#define IAsyncOperationCompletedHandler_FaceDetector_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > interface
 */
#ifndef ____FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0x37f1d7dc, 0xa1a4, 0x5a94, 0xb3,0x3b, 0x74,0x20,0x5a,0x65,0xa1,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("37f1d7dc-a1a4-5a94-b33b-74205a65a1ed")
            IAsyncOperation<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > : IAsyncOperation_impl<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0x37f1d7dc, 0xa1a4, 0x5a94, 0xb3,0x3b, 0x74,0x20,0x5a,0x65,0xa1,0xed)
#endif
#else
typedef struct __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **results);

    END_INTERFACE
} __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl;

interface __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace {
    CONST_VTBL __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > methods ***/
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_put_Completed(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Completed(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetResults(__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IVector_DetectedFace IID___FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IAsyncOperation_IVector_DetectedFaceVtbl __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl
#define IAsyncOperation_IVector_DetectedFace __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IAsyncOperation_IVector_DetectedFace_QueryInterface __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface
#define IAsyncOperation_IVector_DetectedFace_AddRef __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef
#define IAsyncOperation_IVector_DetectedFace_Release __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release
#define IAsyncOperation_IVector_DetectedFace_GetIids __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetIids
#define IAsyncOperation_IVector_DetectedFace_GetRuntimeClassName __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetRuntimeClassName
#define IAsyncOperation_IVector_DetectedFace_GetTrustLevel __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetTrustLevel
#define IAsyncOperation_IVector_DetectedFace_put_Completed __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_put_Completed
#define IAsyncOperation_IVector_DetectedFace_get_Completed __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_get_Completed
#define IAsyncOperation_IVector_DetectedFace_GetResults __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0xb0a53153, 0x2015, 0x58b3, 0x9d,0xd0, 0xbd,0xf2,0x91,0xb8,0x56,0xb2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b0a53153-2015-58b3-9dd0-bdf291b856b2")
            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace, 0xb0a53153, 0x2015, 0x58b3, 0x9d,0xd0, 0xbd,0xf2,0x91,0xb8,0x56,0xb2)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *This,
        __FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl;

interface __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface(__FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::FaceAnalysis::DetectedFace* >* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Invoke(__FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This,__FIAsyncOperation_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IVector_DetectedFace IID___FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IAsyncOperationCompletedHandler_IVector_DetectedFaceVtbl __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFaceVtbl
#define IAsyncOperationCompletedHandler_IVector_DetectedFace __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace
#define IAsyncOperationCompletedHandler_IVector_DetectedFace_QueryInterface __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_QueryInterface
#define IAsyncOperationCompletedHandler_IVector_DetectedFace_AddRef __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef
#define IAsyncOperationCompletedHandler_IVector_DetectedFace_Release __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release
#define IAsyncOperationCompletedHandler_IVector_DetectedFace_Invoke __FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1___FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_media_faceanalysis_h__ */
