/*** Autogenerated by WIDL 9.17 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(
                        ABI::Windows::Graphics::Imaging::BitmapBounds *return_value) = 0;

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

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

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFaceVtbl;

interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFace {
    CONST_VTBL __x_ABI_CWindows_CMedia_CFaceAnalysis_CIDetectedFaceVtbl* lpVtbl;
};

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

#endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorVtbl;

interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetector {
    CONST_VTBL __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorVtbl* lpVtbl;
};

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

#endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStaticsVtbl;

interface __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics {
    CONST_VTBL __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IFaceDetectorStatics methods ***/
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_CreateAsync(This,return_value) (This)->lpVtbl->CreateAsync(This,return_value)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_GetSupportedBitmapPixelFormats(This,result) (This)->lpVtbl->GetSupportedBitmapPixelFormats(This,result)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_IsBitmapPixelFormatSupported(This,bitmap_pixel_format,result) (This)->lpVtbl->IsBitmapPixelFormatSupported(This,bitmap_pixel_format,result)
#define __x_ABI_CWindows_CMedia_CFaceAnalysis_CIFaceDetectorStatics_get_IsSupported(This,return_value) (This)->lpVtbl->get_IsSupported(This,return_value)
#else
/*** IUnknown methods ***/
static __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,__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__ */
