/*** Autogenerated by WIDL 9.8 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__

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

/* Forward declarations */

#ifndef ____x_ABI_CWindows_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 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(
                        struct 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,
        struct __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 __WIDL_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 __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_AddRef(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_Release(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace_get_FaceBox(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace* This,struct __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,
                        struct 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(
                        struct BitmapSize *return_value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_MinDetectableFaceSize(
                        struct BitmapSize value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MaxDetectableFaceSize(
                        struct BitmapSize *return_value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_MaxDetectableFaceSize(
                        struct 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,
        struct __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,
        struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize *return_value);

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

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

    HRESULT (STDMETHODCALLTYPE *put_MaxDetectableFaceSize)(
        __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector *This,
        struct __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 __WIDL_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 __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_AddRef(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_Release(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_DetectFacesWithSearchAreaAsync(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *image,struct __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 __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_get_MinDetectableFaceSize(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize *return_value) {
    return This->lpVtbl->get_MinDetectableFaceSize(This,return_value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_put_MinDetectableFaceSize(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize value) {
    return This->lpVtbl->put_MinDetectableFaceSize(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_get_MaxDetectableFaceSize(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize *return_value) {
    return This->lpVtbl->get_MaxDetectableFaceSize(This,return_value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector_put_MaxDetectableFaceSize(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector* This,struct __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(
                        enum 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,
        enum __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 __WIDL_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 __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_AddRef(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_Release(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_IsBitmapPixelFormatSupported(__x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics* This,enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat bitmap_pixel_format,boolean *result) {
    return This->lpVtbl->IsBitmapPixelFormatSupported(This,bitmap_pixel_format,result);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE ULONG __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIIterable_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE ULONG __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIIterator_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE ULONG __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIVectorView_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE ULONG __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_AddRef(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Release(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_RemoveAtEnd(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace_Clear(__FIVector_1_Windows__CMedia__CFaceAnalysis__CDetectedFace* This) {
    return This->lpVtbl->Clear(This);
}
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_AddRef(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_Release(__FIAsyncOperation_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CFaceAnalysis__CFaceDetector* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_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__ */
