/*** Autogenerated by WIDL 8.19 from include/windows.storage.fileproperties.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_storage_fileproperties_h__
#define __windows_storage_fileproperties_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_CStorage_CFileProperties_CIBasicProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties ABI::Windows::Storage::FileProperties::IBasicProperties
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace FileProperties {
                interface IBasicProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CFileProperties_CBasicProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CFileProperties_CBasicProperties_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace FileProperties {
                class BasicProperties;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CStorage_CFileProperties_CBasicProperties __x_ABI_CWindows_CStorage_CFileProperties_CBasicProperties;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CStorage_CFileProperties_CBasicProperties_FWD_DEFINED__ */

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Storage::FileProperties::BasicProperties* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::FileProperties::BasicProperties* >
#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.devices.geolocation.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties ABI::Windows::Storage::FileProperties::IBasicProperties
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace FileProperties {
                interface IBasicProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::FileProperties::BasicProperties* >
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IBasicProperties interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties, 0xd05d55db, 0x785e, 0x4a66, 0xbe,0x02, 0x9b,0xee,0xc5,0x8a,0xea,0x81);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace FileProperties {
                MIDL_INTERFACE("d05d55db-785e-4a66-be02-9beec58aea81")
                IBasicProperties : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Size(
                        UINT64 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DateModified(
                        struct DateTime *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ItemDate(
                        struct DateTime *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties, 0xd05d55db, 0x785e, 0x4a66, 0xbe,0x02, 0x9b,0xee,0xc5,0x8a,0xea,0x81)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CFileProperties_CIBasicPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBasicProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties *This,
        UINT64 *value);

    HRESULT (STDMETHODCALLTYPE *get_DateModified)(
        __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties *This,
        struct __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ItemDate)(
        __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties *This,
        struct __x_ABI_CWindows_CFoundation_CDateTime *value);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CFileProperties_CIBasicPropertiesVtbl;

interface __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties {
    CONST_VTBL __x_ABI_CWindows_CStorage_CFileProperties_CIBasicPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBasicProperties methods ***/
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_get_DateModified(This,value) (This)->lpVtbl->get_DateModified(This,value)
#define __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_get_ItemDate(This,value) (This)->lpVtbl->get_ItemDate(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_QueryInterface(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_AddRef(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_Release(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_GetIids(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_GetTrustLevel(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBasicProperties methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_get_Size(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties* This,UINT64 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_get_DateModified(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties* This,struct __x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_DateModified(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_get_ItemDate(__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties* This,struct __x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_ItemDate(This,value);
}
#endif
#ifdef WIDL_using_Windows_Storage_FileProperties
#define IID_IBasicProperties IID___x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties
#define IBasicPropertiesVtbl __x_ABI_CWindows_CStorage_CFileProperties_CIBasicPropertiesVtbl
#define IBasicProperties __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties
#define IBasicProperties_QueryInterface __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_QueryInterface
#define IBasicProperties_AddRef __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_AddRef
#define IBasicProperties_Release __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_Release
#define IBasicProperties_GetIids __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_GetIids
#define IBasicProperties_GetRuntimeClassName __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_GetRuntimeClassName
#define IBasicProperties_GetTrustLevel __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_GetTrustLevel
#define IBasicProperties_get_Size __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_get_Size
#define IBasicProperties_get_DateModified __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_get_DateModified
#define IBasicProperties_get_ItemDate __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties_get_ItemDate
#endif /* WIDL_using_Windows_Storage_FileProperties */
#endif

#endif

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

/*
 * Class Windows.Storage.FileProperties.BasicProperties
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Storage_FileProperties_BasicProperties_DEFINED
#define RUNTIMECLASS_Windows_Storage_FileProperties_BasicProperties_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Storage_FileProperties_BasicProperties[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','F','i','l','e','P','r','o','p','e','r','t','i','e','s','.','B','a','s','i','c','P','r','o','p','e','r','t','i','e','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_FileProperties_BasicProperties[] = L"Windows.Storage.FileProperties.BasicProperties";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_FileProperties_BasicProperties[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','F','i','l','e','P','r','o','p','e','r','t','i','e','s','.','B','a','s','i','c','P','r','o','p','e','r','t','i','e','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Storage_FileProperties_BasicProperties_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Storage::FileProperties::BasicProperties* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties, 0xc8659aae, 0x4926, 0x52ad, 0x8f,0x60, 0xd8,0x9f,0xe5,0xa8,0xdf,0x5f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c8659aae-4926-52ad-8f60-d89fe5a8df5f")
            IAsyncOperationCompletedHandler<ABI::Windows::Storage::FileProperties::BasicProperties* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Storage::FileProperties::BasicProperties*, ABI::Windows::Storage::FileProperties::IBasicProperties* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties, 0xc8659aae, 0x4926, 0x52ad, 0x8f,0x60, 0xd8,0x9f,0xe5,0xa8,0xdf,0x5f)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::FileProperties::BasicProperties* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties *This,
        __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicPropertiesVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::FileProperties::BasicProperties* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_Release(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::FileProperties::BasicProperties* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties* This,__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_BasicProperties IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties
#define IAsyncOperationCompletedHandler_BasicPropertiesVtbl __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicPropertiesVtbl
#define IAsyncOperationCompletedHandler_BasicProperties __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties
#define IAsyncOperationCompletedHandler_BasicProperties_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_QueryInterface
#define IAsyncOperationCompletedHandler_BasicProperties_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_AddRef
#define IAsyncOperationCompletedHandler_BasicProperties_Release __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_Release
#define IAsyncOperationCompletedHandler_BasicProperties_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Storage::FileProperties::BasicProperties* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties, 0x5186131a, 0x4467, 0x504b, 0x97,0x7a, 0x07,0x85,0xa8,0x23,0x04,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("5186131a-4467-504b-977a-0785a8230485")
            IAsyncOperation<ABI::Windows::Storage::FileProperties::BasicProperties* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Storage::FileProperties::BasicProperties*, ABI::Windows::Storage::FileProperties::IBasicProperties* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties, 0x5186131a, 0x4467, 0x504b, 0x97,0x7a, 0x07,0x85,0xa8,0x23,0x04,0x85)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Storage::FileProperties::BasicProperties* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties *This,
        __x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicPropertiesVtbl;

interface __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties {
    CONST_VTBL __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Storage::FileProperties::BasicProperties* > methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_QueryInterface(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_AddRef(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_Release(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetIids(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetTrustLevel(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Storage::FileProperties::BasicProperties* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_put_Completed(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_get_Completed(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CFileProperties__CBasicProperties **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetResults(__FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties* This,__x_ABI_CWindows_CStorage_CFileProperties_CIBasicProperties **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_BasicProperties IID___FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties
#define IAsyncOperation_BasicPropertiesVtbl __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicPropertiesVtbl
#define IAsyncOperation_BasicProperties __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties
#define IAsyncOperation_BasicProperties_QueryInterface __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_QueryInterface
#define IAsyncOperation_BasicProperties_AddRef __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_AddRef
#define IAsyncOperation_BasicProperties_Release __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_Release
#define IAsyncOperation_BasicProperties_GetIids __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetIids
#define IAsyncOperation_BasicProperties_GetRuntimeClassName __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetRuntimeClassName
#define IAsyncOperation_BasicProperties_GetTrustLevel __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetTrustLevel
#define IAsyncOperation_BasicProperties_put_Completed __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_put_Completed
#define IAsyncOperation_BasicProperties_get_Completed __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_get_Completed
#define IAsyncOperation_BasicProperties_GetResults __FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CStorage__CFileProperties__CBasicProperties_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_storage_fileproperties_h__ */
