/*** Autogenerated by WIDL 9.20 from include/windows.storage.streams.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_streams_h__
#define __windows_storage_streams_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBuffer __x_ABI_CWindows_CStorage_CStreams_CIBuffer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer ABI::Windows::Storage::Streams::IBuffer
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IBuffer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory ABI::Windows::Storage::Streams::IBufferFactory
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IBufferFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics ABI::Windows::Storage::Streams::IBufferStatics
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IBufferStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriter __x_ABI_CWindows_CStorage_CStreams_CIDataWriter;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter ABI::Windows::Storage::Streams::IDataWriter
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IDataWriter;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory ABI::Windows::Storage::Streams::IDataWriterFactory
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IDataWriterFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIOutputStream __x_ABI_CWindows_CStorage_CStreams_CIOutputStream;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream ABI::Windows::Storage::Streams::IOutputStream
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IOutputStream;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream ABI::Windows::Storage::Streams::IRandomAccessStream
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IRandomAccessStream;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference ABI::Windows::Storage::Streams::IRandomAccessStreamReference
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IRandomAccessStreamReference;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics ABI::Windows::Storage::Streams::IRandomAccessStreamReferenceStatics
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IRandomAccessStreamReferenceStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IRandomAccessStreamWithContentType;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CRandomAccessStream_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CRandomAccessStream_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                class RandomAccessStream;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CRandomAccessStream __x_ABI_CWindows_CStorage_CStreams_CRandomAccessStream;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CStorage_CStreams_CRandomAccessStream_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CInMemoryRandomAccessStream_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CInMemoryRandomAccessStream_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                class InMemoryRandomAccessStream;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CInMemoryRandomAccessStream __x_ABI_CWindows_CStorage_CStreams_CInMemoryRandomAccessStream;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CStorage_CStreams_CInMemoryRandomAccessStream_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CBuffer_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CBuffer_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                class Buffer;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CBuffer __x_ABI_CWindows_CStorage_CStreams_CBuffer;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CStorage_CStreams_CBuffer_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CDataWriter_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CDataWriter_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                class DataWriter;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CDataWriter __x_ABI_CWindows_CStorage_CStreams_CDataWriter;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CStorage_CStreams_CDataWriter_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                class DataWriterStoreOperation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation __x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CRandomAccessStreamReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CRandomAccessStreamReference_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                class RandomAccessStreamReference;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CRandomAccessStreamReference __x_ABI_CWindows_CStorage_CStreams_CRandomAccessStreamReference;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CStorage_CStreams_CRandomAccessStreamReference_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IBuffer* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IBuffer* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <eventtoken.h>
#include <windows.foundation.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CStorage_CIStorageFile_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CIStorageFile_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CIStorageFile __x_ABI_CWindows_CStorage_CIStorageFile;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CIStorageFile ABI::Windows::Storage::IStorageFile
namespace ABI {
    namespace Windows {
        namespace Storage {
            interface IStorageFile;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CStorage_CStreams_CByteOrder __x_ABI_CWindows_CStorage_CStreams_CByteOrder;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBuffer __x_ABI_CWindows_CStorage_CStreams_CIBuffer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer ABI::Windows::Storage::Streams::IBuffer
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IBuffer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory ABI::Windows::Storage::Streams::IBufferFactory
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IBufferFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics ABI::Windows::Storage::Streams::IBufferStatics
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IBufferStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIContentTypeProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIContentTypeProvider_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIContentTypeProvider __x_ABI_CWindows_CStorage_CStreams_CIContentTypeProvider;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIContentTypeProvider ABI::Windows::Storage::Streams::IContentTypeProvider
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IContentTypeProvider;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriter __x_ABI_CWindows_CStorage_CStreams_CIDataWriter;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter ABI::Windows::Storage::Streams::IDataWriter
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IDataWriter;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory ABI::Windows::Storage::Streams::IDataWriterFactory
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IDataWriterFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIInputStream_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIInputStream_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIInputStream __x_ABI_CWindows_CStorage_CStreams_CIInputStream;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIInputStream ABI::Windows::Storage::Streams::IInputStream
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IInputStream;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIInputStreamReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIInputStreamReference_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIInputStreamReference __x_ABI_CWindows_CStorage_CStreams_CIInputStreamReference;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIInputStreamReference ABI::Windows::Storage::Streams::IInputStreamReference
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IInputStreamReference;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIOutputStream __x_ABI_CWindows_CStorage_CStreams_CIOutputStream;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream ABI::Windows::Storage::Streams::IOutputStream
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IOutputStream;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream ABI::Windows::Storage::Streams::IRandomAccessStream
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IRandomAccessStream;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference ABI::Windows::Storage::Streams::IRandomAccessStreamReference
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IRandomAccessStreamReference;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics ABI::Windows::Storage::Streams::IRandomAccessStreamReferenceStatics
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IRandomAccessStreamReferenceStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamStatics __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamStatics ABI::Windows::Storage::Streams::IRandomAccessStreamStatics
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IRandomAccessStreamStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_FWD_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType;
#ifdef __cplusplus
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                interface IRandomAccessStreamWithContentType;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IBuffer* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                enum ByteOrder {
                    ByteOrder_LittleEndian = 0,
                    ByteOrder_BigEndian = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CStorage_CStreams_CByteOrder {
    ByteOrder_LittleEndian = 0,
    ByteOrder_BigEndian = 1
};
#ifdef WIDL_using_Windows_Storage_Streams
#define ByteOrder __x_ABI_CWindows_CStorage_CStreams_CByteOrder
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                enum UnicodeEncoding {
                    UnicodeEncoding_Utf8 = 0,
                    UnicodeEncoding_Utf16LE = 1,
                    UnicodeEncoding_Utf16BE = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding {
    UnicodeEncoding_Utf8 = 0,
    UnicodeEncoding_Utf16LE = 1,
    UnicodeEncoding_Utf16BE = 2
};
#ifdef WIDL_using_Windows_Storage_Streams
#define UnicodeEncoding __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IBuffer interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIBuffer, 0x905a0fe0, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("905a0fe0-bc53-11df-8c49-001e4fc686da")
                IBuffer : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Capacity(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Length(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Length(
                        UINT32 value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIBuffer, 0x905a0fe0, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIBufferVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBuffer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Capacity)(
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_Length)(
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_Length)(
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
        UINT32 value);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIBufferVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIBuffer {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIBufferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBuffer methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Capacity(This,value) (This)->lpVtbl->get_Capacity(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_put_Length(This,value) (This)->lpVtbl->put_Length(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIBuffer_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIBuffer_Release(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBuffer methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Capacity(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,UINT32 *value) {
    return This->lpVtbl->get_Capacity(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Length(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,UINT32 *value) {
    return This->lpVtbl->get_Length(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_put_Length(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,UINT32 value) {
    return This->lpVtbl->put_Length(This,value);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IBuffer IID___x_ABI_CWindows_CStorage_CStreams_CIBuffer
#define IBufferVtbl __x_ABI_CWindows_CStorage_CStreams_CIBufferVtbl
#define IBuffer __x_ABI_CWindows_CStorage_CStreams_CIBuffer
#define IBuffer_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIBuffer_QueryInterface
#define IBuffer_AddRef __x_ABI_CWindows_CStorage_CStreams_CIBuffer_AddRef
#define IBuffer_Release __x_ABI_CWindows_CStorage_CStreams_CIBuffer_Release
#define IBuffer_GetIids __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetIids
#define IBuffer_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetRuntimeClassName
#define IBuffer_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetTrustLevel
#define IBuffer_get_Capacity __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Capacity
#define IBuffer_get_Length __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Length
#define IBuffer_put_Length __x_ABI_CWindows_CStorage_CStreams_CIBuffer_put_Length
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

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

/*****************************************************************************
 * IBufferFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIBufferFactory, 0x71af914d, 0xc10f, 0x484b, 0xbc,0x50, 0x14,0xbc,0x62,0x3b,0x3a,0x27);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("71af914d-c10f-484b-bc50-14bc623b3a27")
                IBufferFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Create(
                        UINT32 capacity,
                        ABI::Windows::Storage::Streams::IBuffer **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory, 0x71af914d, 0xc10f, 0x484b, 0xbc,0x50, 0x14,0xbc,0x62,0x3b,0x3a,0x27)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIBufferFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBufferFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory *This,
        UINT32 capacity,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **value);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIBufferFactoryVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIBufferFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBufferFactory methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Create(This,capacity,value) (This)->lpVtbl->Create(This,capacity,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Release(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBufferFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Create(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,UINT32 capacity,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **value) {
    return This->lpVtbl->Create(This,capacity,value);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IBufferFactory IID___x_ABI_CWindows_CStorage_CStreams_CIBufferFactory
#define IBufferFactoryVtbl __x_ABI_CWindows_CStorage_CStreams_CIBufferFactoryVtbl
#define IBufferFactory __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory
#define IBufferFactory_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_QueryInterface
#define IBufferFactory_AddRef __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_AddRef
#define IBufferFactory_Release __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Release
#define IBufferFactory_GetIids __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetIids
#define IBufferFactory_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetRuntimeClassName
#define IBufferFactory_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetTrustLevel
#define IBufferFactory_Create __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Create
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

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

/*****************************************************************************
 * IBufferStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIBufferStatics, 0xe901e65b, 0xd716, 0x475a, 0xa9,0x0a, 0xaf,0x72,0x29,0xb1,0xe7,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("e901e65b-d716-475a-a90a-af7229b1e741")
                IBufferStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateCopyFromMemoryBuffer(
                        ABI::Windows::Foundation::IMemoryBuffer *input,
                        ABI::Windows::Storage::Streams::IBuffer **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateMemoryBufferOverIBuffer(
                        ABI::Windows::Storage::Streams::IBuffer *input,
                        ABI::Windows::Foundation::IMemoryBuffer **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIBufferStatics, 0xe901e65b, 0xd716, 0x475a, 0xa9,0x0a, 0xaf,0x72,0x29,0xb1,0xe7,0x41)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIBufferStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBufferStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateCopyFromMemoryBuffer)(
        __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics *This,
        __x_ABI_CWindows_CFoundation_CIMemoryBuffer *input,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **value);

    HRESULT (STDMETHODCALLTYPE *CreateMemoryBufferOverIBuffer)(
        __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *input,
        __x_ABI_CWindows_CFoundation_CIMemoryBuffer **value);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIBufferStaticsVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIBufferStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBufferStatics methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_CreateCopyFromMemoryBuffer(This,input,value) (This)->lpVtbl->CreateCopyFromMemoryBuffer(This,input,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_CreateMemoryBufferOverIBuffer(This,input,value) (This)->lpVtbl->CreateMemoryBufferOverIBuffer(This,input,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIBufferStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIBufferStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_Release(__x_ABI_CWindows_CStorage_CStreams_CIBufferStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIBufferStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIBufferStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIBufferStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBufferStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_CreateCopyFromMemoryBuffer(__x_ABI_CWindows_CStorage_CStreams_CIBufferStatics* This,__x_ABI_CWindows_CFoundation_CIMemoryBuffer *input,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **value) {
    return This->lpVtbl->CreateCopyFromMemoryBuffer(This,input,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_CreateMemoryBufferOverIBuffer(__x_ABI_CWindows_CStorage_CStreams_CIBufferStatics* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *input,__x_ABI_CWindows_CFoundation_CIMemoryBuffer **value) {
    return This->lpVtbl->CreateMemoryBufferOverIBuffer(This,input,value);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IBufferStatics IID___x_ABI_CWindows_CStorage_CStreams_CIBufferStatics
#define IBufferStaticsVtbl __x_ABI_CWindows_CStorage_CStreams_CIBufferStaticsVtbl
#define IBufferStatics __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics
#define IBufferStatics_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_QueryInterface
#define IBufferStatics_AddRef __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_AddRef
#define IBufferStatics_Release __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_Release
#define IBufferStatics_GetIids __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_GetIids
#define IBufferStatics_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_GetRuntimeClassName
#define IBufferStatics_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_GetTrustLevel
#define IBufferStatics_CreateCopyFromMemoryBuffer __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_CreateCopyFromMemoryBuffer
#define IBufferStatics_CreateMemoryBufferOverIBuffer __x_ABI_CWindows_CStorage_CStreams_CIBufferStatics_CreateMemoryBufferOverIBuffer
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

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

/*****************************************************************************
 * IDataWriter interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIDataWriter, 0x64b89265, 0xd341, 0x4922, 0xb3,0x8a, 0xdd,0x4a,0xf8,0x80,0x8c,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("64b89265-d341-4922-b38a-dd4af8808c4e")
                IDataWriter : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_UnstoredBufferLength(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_UnicodeEncoding(
                        ABI::Windows::Storage::Streams::UnicodeEncoding *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_UnicodeEncoding(
                        ABI::Windows::Storage::Streams::UnicodeEncoding value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ByteOrder(
                        ABI::Windows::Storage::Streams::ByteOrder *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ByteOrder(
                        ABI::Windows::Storage::Streams::ByteOrder value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteByte(
                        BYTE value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteBytes(
                        UINT32 value_size,
                        BYTE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteBuffer(
                        ABI::Windows::Storage::Streams::IBuffer *buffer) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteBufferRange(
                        ABI::Windows::Storage::Streams::IBuffer *buffer,
                        UINT32 start,
                        UINT32 count) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteBoolean(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteGuid(
                        GUID value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteInt16(
                        INT16 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteInt32(
                        INT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteInt64(
                        INT64 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteUInt16(
                        UINT16 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteUInt32(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteUInt64(
                        UINT64 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteSingle(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteDouble(
                        DOUBLE value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteDateTime(
                        ABI::Windows::Foundation::DateTime value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteTimeSpan(
                        ABI::Windows::Foundation::TimeSpan value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WriteString(
                        HSTRING value,
                        UINT32 *code_unit_count) = 0;

                    virtual HRESULT STDMETHODCALLTYPE MeasureString(
                        HSTRING value,
                        UINT32 *code_unit_count) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StoreAsync(
                        ABI::Windows::Foundation::IAsyncOperation<UINT32 > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FlushAsync(
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE DetachBuffer(
                        ABI::Windows::Storage::Streams::IBuffer **buffer) = 0;

                    virtual HRESULT STDMETHODCALLTYPE DetachStream(
                        ABI::Windows::Storage::Streams::IOutputStream **output_stream) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter, 0x64b89265, 0xd341, 0x4922, 0xb3,0x8a, 0xdd,0x4a,0xf8,0x80,0x8c,0x4e)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIDataWriterVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDataWriter methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UnstoredBufferLength)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_UnicodeEncoding)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding *value);

    HRESULT (STDMETHODCALLTYPE *put_UnicodeEncoding)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding value);

    HRESULT (STDMETHODCALLTYPE *get_ByteOrder)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CStorage_CStreams_CByteOrder *value);

    HRESULT (STDMETHODCALLTYPE *put_ByteOrder)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CStorage_CStreams_CByteOrder value);

    HRESULT (STDMETHODCALLTYPE *WriteByte)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        BYTE value);

    HRESULT (STDMETHODCALLTYPE *WriteBytes)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        UINT32 value_size,
        BYTE *value);

    HRESULT (STDMETHODCALLTYPE *WriteBuffer)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer);

    HRESULT (STDMETHODCALLTYPE *WriteBufferRange)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,
        UINT32 start,
        UINT32 count);

    HRESULT (STDMETHODCALLTYPE *WriteBoolean)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *WriteGuid)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        GUID value);

    HRESULT (STDMETHODCALLTYPE *WriteInt16)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        INT16 value);

    HRESULT (STDMETHODCALLTYPE *WriteInt32)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        INT32 value);

    HRESULT (STDMETHODCALLTYPE *WriteInt64)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        INT64 value);

    HRESULT (STDMETHODCALLTYPE *WriteUInt16)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        UINT16 value);

    HRESULT (STDMETHODCALLTYPE *WriteUInt32)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *WriteUInt64)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        UINT64 value);

    HRESULT (STDMETHODCALLTYPE *WriteSingle)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *WriteDouble)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        DOUBLE value);

    HRESULT (STDMETHODCALLTYPE *WriteDateTime)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CFoundation_CDateTime value);

    HRESULT (STDMETHODCALLTYPE *WriteTimeSpan)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value);

    HRESULT (STDMETHODCALLTYPE *WriteString)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        HSTRING value,
        UINT32 *code_unit_count);

    HRESULT (STDMETHODCALLTYPE *MeasureString)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        HSTRING value,
        UINT32 *code_unit_count);

    HRESULT (STDMETHODCALLTYPE *StoreAsync)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __FIAsyncOperation_1_UINT32 **operation);

    HRESULT (STDMETHODCALLTYPE *FlushAsync)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __FIAsyncOperation_1_boolean **operation);

    HRESULT (STDMETHODCALLTYPE *DetachBuffer)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **buffer);

    HRESULT (STDMETHODCALLTYPE *DetachStream)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream **output_stream);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIDataWriterVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriter {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIDataWriterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataWriter methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnstoredBufferLength(This,value) (This)->lpVtbl->get_UnstoredBufferLength(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnicodeEncoding(This,value) (This)->lpVtbl->get_UnicodeEncoding(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_UnicodeEncoding(This,value) (This)->lpVtbl->put_UnicodeEncoding(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_ByteOrder(This,value) (This)->lpVtbl->get_ByteOrder(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_ByteOrder(This,value) (This)->lpVtbl->put_ByteOrder(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteByte(This,value) (This)->lpVtbl->WriteByte(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBytes(This,value_size,value) (This)->lpVtbl->WriteBytes(This,value_size,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBuffer(This,buffer) (This)->lpVtbl->WriteBuffer(This,buffer)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBufferRange(This,buffer,start,count) (This)->lpVtbl->WriteBufferRange(This,buffer,start,count)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBoolean(This,value) (This)->lpVtbl->WriteBoolean(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteGuid(This,value) (This)->lpVtbl->WriteGuid(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt16(This,value) (This)->lpVtbl->WriteInt16(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt32(This,value) (This)->lpVtbl->WriteInt32(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt64(This,value) (This)->lpVtbl->WriteInt64(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt16(This,value) (This)->lpVtbl->WriteUInt16(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt32(This,value) (This)->lpVtbl->WriteUInt32(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt64(This,value) (This)->lpVtbl->WriteUInt64(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteSingle(This,value) (This)->lpVtbl->WriteSingle(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDouble(This,value) (This)->lpVtbl->WriteDouble(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDateTime(This,value) (This)->lpVtbl->WriteDateTime(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteTimeSpan(This,value) (This)->lpVtbl->WriteTimeSpan(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteString(This,value,code_unit_count) (This)->lpVtbl->WriteString(This,value,code_unit_count)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_MeasureString(This,value,code_unit_count) (This)->lpVtbl->MeasureString(This,value,code_unit_count)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_StoreAsync(This,operation) (This)->lpVtbl->StoreAsync(This,operation)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FlushAsync(This,operation) (This)->lpVtbl->FlushAsync(This,operation)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachBuffer(This,buffer) (This)->lpVtbl->DetachBuffer(This,buffer)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachStream(This,output_stream) (This)->lpVtbl->DetachStream(This,output_stream)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_Release(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataWriter methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnstoredBufferLength(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT32 *value) {
    return This->lpVtbl->get_UnstoredBufferLength(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnicodeEncoding(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding *value) {
    return This->lpVtbl->get_UnicodeEncoding(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_UnicodeEncoding(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding value) {
    return This->lpVtbl->put_UnicodeEncoding(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_ByteOrder(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CByteOrder *value) {
    return This->lpVtbl->get_ByteOrder(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_ByteOrder(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CByteOrder value) {
    return This->lpVtbl->put_ByteOrder(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteByte(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,BYTE value) {
    return This->lpVtbl->WriteByte(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBytes(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT32 value_size,BYTE *value) {
    return This->lpVtbl->WriteBytes(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBuffer(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer) {
    return This->lpVtbl->WriteBuffer(This,buffer);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBufferRange(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,UINT32 start,UINT32 count) {
    return This->lpVtbl->WriteBufferRange(This,buffer,start,count);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBoolean(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,boolean value) {
    return This->lpVtbl->WriteBoolean(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteGuid(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,GUID value) {
    return This->lpVtbl->WriteGuid(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt16(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,INT16 value) {
    return This->lpVtbl->WriteInt16(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt32(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,INT32 value) {
    return This->lpVtbl->WriteInt32(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt64(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,INT64 value) {
    return This->lpVtbl->WriteInt64(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt16(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT16 value) {
    return This->lpVtbl->WriteUInt16(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt32(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT32 value) {
    return This->lpVtbl->WriteUInt32(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt64(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT64 value) {
    return This->lpVtbl->WriteUInt64(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteSingle(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,FLOAT value) {
    return This->lpVtbl->WriteSingle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDouble(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,DOUBLE value) {
    return This->lpVtbl->WriteDouble(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDateTime(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CFoundation_CDateTime value) {
    return This->lpVtbl->WriteDateTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteTimeSpan(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
    return This->lpVtbl->WriteTimeSpan(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteString(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,HSTRING value,UINT32 *code_unit_count) {
    return This->lpVtbl->WriteString(This,value,code_unit_count);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_MeasureString(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,HSTRING value,UINT32 *code_unit_count) {
    return This->lpVtbl->MeasureString(This,value,code_unit_count);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_StoreAsync(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__FIAsyncOperation_1_UINT32 **operation) {
    return This->lpVtbl->StoreAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FlushAsync(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->FlushAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachBuffer(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **buffer) {
    return This->lpVtbl->DetachBuffer(This,buffer);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachStream(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CIOutputStream **output_stream) {
    return This->lpVtbl->DetachStream(This,output_stream);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IDataWriter IID___x_ABI_CWindows_CStorage_CStreams_CIDataWriter
#define IDataWriterVtbl __x_ABI_CWindows_CStorage_CStreams_CIDataWriterVtbl
#define IDataWriter __x_ABI_CWindows_CStorage_CStreams_CIDataWriter
#define IDataWriter_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_QueryInterface
#define IDataWriter_AddRef __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_AddRef
#define IDataWriter_Release __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_Release
#define IDataWriter_GetIids __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetIids
#define IDataWriter_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetRuntimeClassName
#define IDataWriter_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetTrustLevel
#define IDataWriter_get_UnstoredBufferLength __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnstoredBufferLength
#define IDataWriter_get_UnicodeEncoding __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnicodeEncoding
#define IDataWriter_put_UnicodeEncoding __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_UnicodeEncoding
#define IDataWriter_get_ByteOrder __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_ByteOrder
#define IDataWriter_put_ByteOrder __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_ByteOrder
#define IDataWriter_WriteByte __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteByte
#define IDataWriter_WriteBytes __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBytes
#define IDataWriter_WriteBuffer __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBuffer
#define IDataWriter_WriteBufferRange __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBufferRange
#define IDataWriter_WriteBoolean __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBoolean
#define IDataWriter_WriteGuid __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteGuid
#define IDataWriter_WriteInt16 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt16
#define IDataWriter_WriteInt32 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt32
#define IDataWriter_WriteInt64 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt64
#define IDataWriter_WriteUInt16 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt16
#define IDataWriter_WriteUInt32 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt32
#define IDataWriter_WriteUInt64 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt64
#define IDataWriter_WriteSingle __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteSingle
#define IDataWriter_WriteDouble __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDouble
#define IDataWriter_WriteDateTime __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDateTime
#define IDataWriter_WriteTimeSpan __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteTimeSpan
#define IDataWriter_WriteString __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteString
#define IDataWriter_MeasureString __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_MeasureString
#define IDataWriter_StoreAsync __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_StoreAsync
#define IDataWriter_FlushAsync __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FlushAsync
#define IDataWriter_DetachBuffer __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachBuffer
#define IDataWriter_DetachStream __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachStream
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

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

/*****************************************************************************
 * IDataWriterFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory, 0x338c67c2, 0x8b84, 0x4c2b, 0x9c,0x50, 0x7b,0x87,0x67,0x84,0x7a,0x1f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("338c67c2-8b84-4c2b-9c50-7b8767847a1f")
                IDataWriterFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateDataWriter(
                        ABI::Windows::Storage::Streams::IOutputStream *output_stream,
                        ABI::Windows::Storage::Streams::IDataWriter **data_writer) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory, 0x338c67c2, 0x8b84, 0x4c2b, 0x9c,0x50, 0x7b,0x87,0x67,0x84,0x7a,0x1f)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDataWriterFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateDataWriter)(
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory *This,
        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *output_stream,
        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter **data_writer);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactoryVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataWriterFactory methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_CreateDataWriter(This,output_stream,data_writer) (This)->lpVtbl->CreateDataWriter(This,output_stream,data_writer)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_Release(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataWriterFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_CreateDataWriter(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,__x_ABI_CWindows_CStorage_CStreams_CIOutputStream *output_stream,__x_ABI_CWindows_CStorage_CStreams_CIDataWriter **data_writer) {
    return This->lpVtbl->CreateDataWriter(This,output_stream,data_writer);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IDataWriterFactory IID___x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory
#define IDataWriterFactoryVtbl __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactoryVtbl
#define IDataWriterFactory __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory
#define IDataWriterFactory_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_QueryInterface
#define IDataWriterFactory_AddRef __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_AddRef
#define IDataWriterFactory_Release __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_Release
#define IDataWriterFactory_GetIids __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetIids
#define IDataWriterFactory_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetRuntimeClassName
#define IDataWriterFactory_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetTrustLevel
#define IDataWriterFactory_CreateDataWriter __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_CreateDataWriter
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

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

/*****************************************************************************
 * IOutputStream interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIOutputStream, 0x905a0fe6, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("905a0fe6-bc53-11df-8c49-001e4fc686da")
                IOutputStream : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE WriteAsync(
                        ABI::Windows::Storage::Streams::IBuffer *buffer,
                        ABI::Windows::Foundation::IAsyncOperationWithProgress<UINT32,UINT32 > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FlushAsync(
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream, 0x905a0fe6, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIOutputStreamVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IOutputStream methods ***/
    HRESULT (STDMETHODCALLTYPE *WriteAsync)(
        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,
        __FIAsyncOperationWithProgress_2_UINT32_UINT32 **operation);

    HRESULT (STDMETHODCALLTYPE *FlushAsync)(
        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This,
        __FIAsyncOperation_1_boolean **operation);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIOutputStreamVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIOutputStream {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIOutputStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IOutputStream methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_WriteAsync(This,buffer,operation) (This)->lpVtbl->WriteAsync(This,buffer,operation)
#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FlushAsync(This,operation) (This)->lpVtbl->FlushAsync(This,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_Release(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IOutputStream methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_WriteAsync(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,__FIAsyncOperationWithProgress_2_UINT32_UINT32 **operation) {
    return This->lpVtbl->WriteAsync(This,buffer,operation);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FlushAsync(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->FlushAsync(This,operation);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IOutputStream IID___x_ABI_CWindows_CStorage_CStreams_CIOutputStream
#define IOutputStreamVtbl __x_ABI_CWindows_CStorage_CStreams_CIOutputStreamVtbl
#define IOutputStream __x_ABI_CWindows_CStorage_CStreams_CIOutputStream
#define IOutputStream_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_QueryInterface
#define IOutputStream_AddRef __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_AddRef
#define IOutputStream_Release __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_Release
#define IOutputStream_GetIids __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetIids
#define IOutputStream_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetRuntimeClassName
#define IOutputStream_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetTrustLevel
#define IOutputStream_WriteAsync __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_WriteAsync
#define IOutputStream_FlushAsync __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FlushAsync
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

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

/*****************************************************************************
 * IRandomAccessStream interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream, 0x905a0fe1, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("905a0fe1-bc53-11df-8c49-001e4fc686da")
                IRandomAccessStream : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Size(
                        UINT64 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Size(
                        UINT64 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetInputStreamAt(
                        UINT64 position,
                        ABI::Windows::Storage::Streams::IInputStream **stream) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetOutputStreamAt(
                        UINT64 position,
                        ABI::Windows::Storage::Streams::IOutputStream **stream) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Position(
                        UINT64 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Seek(
                        UINT64 position) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CloneStream(
                        ABI::Windows::Storage::Streams::IRandomAccessStream **stream) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CanRead(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CanWrite(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream, 0x905a0fe1, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRandomAccessStream methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *This,
        UINT64 *value);

    HRESULT (STDMETHODCALLTYPE *put_Size)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *This,
        UINT64 value);

    HRESULT (STDMETHODCALLTYPE *GetInputStreamAt)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *This,
        UINT64 position,
        __x_ABI_CWindows_CStorage_CStreams_CIInputStream **stream);

    HRESULT (STDMETHODCALLTYPE *GetOutputStreamAt)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *This,
        UINT64 position,
        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream **stream);

    HRESULT (STDMETHODCALLTYPE *get_Position)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *This,
        UINT64 *value);

    HRESULT (STDMETHODCALLTYPE *Seek)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *This,
        UINT64 position);

    HRESULT (STDMETHODCALLTYPE *CloneStream)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **stream);

    HRESULT (STDMETHODCALLTYPE *get_CanRead)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_CanWrite)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRandomAccessStream methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_put_Size(This,value) (This)->lpVtbl->put_Size(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetInputStreamAt(This,position,stream) (This)->lpVtbl->GetInputStreamAt(This,position,stream)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetOutputStreamAt(This,position,stream) (This)->lpVtbl->GetOutputStreamAt(This,position,stream)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_Position(This,value) (This)->lpVtbl->get_Position(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_Seek(This,position) (This)->lpVtbl->Seek(This,position)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_CloneStream(This,stream) (This)->lpVtbl->CloneStream(This,stream)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_CanRead(This,value) (This)->lpVtbl->get_CanRead(This,value)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_CanWrite(This,value) (This)->lpVtbl->get_CanWrite(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_Release(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRandomAccessStream methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_Size(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,UINT64 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_put_Size(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,UINT64 value) {
    return This->lpVtbl->put_Size(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetInputStreamAt(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,UINT64 position,__x_ABI_CWindows_CStorage_CStreams_CIInputStream **stream) {
    return This->lpVtbl->GetInputStreamAt(This,position,stream);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetOutputStreamAt(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,UINT64 position,__x_ABI_CWindows_CStorage_CStreams_CIOutputStream **stream) {
    return This->lpVtbl->GetOutputStreamAt(This,position,stream);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_Position(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,UINT64 *value) {
    return This->lpVtbl->get_Position(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_Seek(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,UINT64 position) {
    return This->lpVtbl->Seek(This,position);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_CloneStream(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **stream) {
    return This->lpVtbl->CloneStream(This,stream);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_CanRead(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,boolean *value) {
    return This->lpVtbl->get_CanRead(This,value);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_CanWrite(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream* This,boolean *value) {
    return This->lpVtbl->get_CanWrite(This,value);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IRandomAccessStream IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream
#define IRandomAccessStreamVtbl __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamVtbl
#define IRandomAccessStream __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream
#define IRandomAccessStream_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_QueryInterface
#define IRandomAccessStream_AddRef __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_AddRef
#define IRandomAccessStream_Release __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_Release
#define IRandomAccessStream_GetIids __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetIids
#define IRandomAccessStream_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetRuntimeClassName
#define IRandomAccessStream_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetTrustLevel
#define IRandomAccessStream_get_Size __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_Size
#define IRandomAccessStream_put_Size __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_put_Size
#define IRandomAccessStream_GetInputStreamAt __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetInputStreamAt
#define IRandomAccessStream_GetOutputStreamAt __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_GetOutputStreamAt
#define IRandomAccessStream_get_Position __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_Position
#define IRandomAccessStream_Seek __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_Seek
#define IRandomAccessStream_CloneStream __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_CloneStream
#define IRandomAccessStream_get_CanRead __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_CanRead
#define IRandomAccessStream_get_CanWrite __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_get_CanWrite
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

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

/*****************************************************************************
 * IRandomAccessStreamReference interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference, 0x33ee3134, 0x1dd6, 0x4e3a, 0x80,0x67, 0xd1,0xc1,0x62,0xe8,0x64,0x2b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("33ee3134-1dd6-4e3a-8067-d1c162e8642b")
                IRandomAccessStreamReference : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE OpenReadAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference, 0x33ee3134, 0x1dd6, 0x4e3a, 0x80,0x67, 0xd1,0xc1,0x62,0xe8,0x64,0x2b)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRandomAccessStreamReference methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenReadAsync)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *This,
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType **operation);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRandomAccessStreamReference methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_OpenReadAsync(This,operation) (This)->lpVtbl->OpenReadAsync(This,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_Release(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRandomAccessStreamReference methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_OpenReadAsync(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType **operation) {
    return This->lpVtbl->OpenReadAsync(This,operation);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IRandomAccessStreamReference IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference
#define IRandomAccessStreamReferenceVtbl __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceVtbl
#define IRandomAccessStreamReference __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference
#define IRandomAccessStreamReference_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_QueryInterface
#define IRandomAccessStreamReference_AddRef __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_AddRef
#define IRandomAccessStreamReference_Release __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_Release
#define IRandomAccessStreamReference_GetIids __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetIids
#define IRandomAccessStreamReference_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetRuntimeClassName
#define IRandomAccessStreamReference_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetTrustLevel
#define IRandomAccessStreamReference_OpenReadAsync __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_OpenReadAsync
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

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

/*****************************************************************************
 * IRandomAccessStreamReferenceStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics, 0x857309dc, 0x3fbf, 0x4e7d, 0x98,0x6f, 0xef,0x3b,0x1a,0x07,0xa9,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("857309dc-3fbf-4e7d-986f-ef3b1a07a964")
                IRandomAccessStreamReferenceStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateFromFile(
                        ABI::Windows::Storage::IStorageFile *file,
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **stream_reference) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateFromUri(
                        ABI::Windows::Foundation::IUriRuntimeClass *uri,
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **stream_reference) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateFromStream(
                        ABI::Windows::Storage::Streams::IRandomAccessStream *stream,
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **stream_reference) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics, 0x857309dc, 0x3fbf, 0x4e7d, 0x98,0x6f, 0xef,0x3b,0x1a,0x07,0xa9,0x64)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRandomAccessStreamReferenceStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateFromFile)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
        __x_ABI_CWindows_CStorage_CIStorageFile *file,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference);

    HRESULT (STDMETHODCALLTYPE *CreateFromUri)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference);

    HRESULT (STDMETHODCALLTYPE *CreateFromStream)(
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *stream,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference);

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStaticsVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRandomAccessStreamReferenceStatics methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromFile(This,file,stream_reference) (This)->lpVtbl->CreateFromFile(This,file,stream_reference)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromUri(This,uri,stream_reference) (This)->lpVtbl->CreateFromUri(This,uri,stream_reference)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromStream(This,stream,stream_reference) (This)->lpVtbl->CreateFromStream(This,stream,stream_reference)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_Release(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRandomAccessStreamReferenceStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromFile(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference) {
    return This->lpVtbl->CreateFromFile(This,file,stream_reference);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromUri(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference) {
    return This->lpVtbl->CreateFromUri(This,uri,stream_reference);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromStream(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *stream,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference) {
    return This->lpVtbl->CreateFromStream(This,stream,stream_reference);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IRandomAccessStreamReferenceStatics IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics
#define IRandomAccessStreamReferenceStaticsVtbl __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStaticsVtbl
#define IRandomAccessStreamReferenceStatics __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics
#define IRandomAccessStreamReferenceStatics_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_QueryInterface
#define IRandomAccessStreamReferenceStatics_AddRef __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_AddRef
#define IRandomAccessStreamReferenceStatics_Release __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_Release
#define IRandomAccessStreamReferenceStatics_GetIids __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetIids
#define IRandomAccessStreamReferenceStatics_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetRuntimeClassName
#define IRandomAccessStreamReferenceStatics_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetTrustLevel
#define IRandomAccessStreamReferenceStatics_CreateFromFile __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromFile
#define IRandomAccessStreamReferenceStatics_CreateFromUri __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromUri
#define IRandomAccessStreamReferenceStatics_CreateFromStream __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromStream
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

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

/*****************************************************************************
 * IRandomAccessStreamWithContentType interface
 */
#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType, 0xcc254827, 0x4b3d, 0x438f, 0x92,0x32, 0x10,0xc7,0x6b,0xc7,0xe0,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Storage {
            namespace Streams {
                MIDL_INTERFACE("cc254827-4b3d-438f-9232-10c76bc7e038")
                IRandomAccessStreamWithContentType : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType, 0xcc254827, 0x4b3d, 0x438f, 0x92,0x32, 0x10,0xc7,0x6b,0xc7,0xe0,0x38)
#endif
#else
typedef struct __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentTypeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentTypeVtbl;

interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType {
    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_Release(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Storage_Streams
#define IID_IRandomAccessStreamWithContentType IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType
#define IRandomAccessStreamWithContentTypeVtbl __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentTypeVtbl
#define IRandomAccessStreamWithContentType __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType
#define IRandomAccessStreamWithContentType_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_QueryInterface
#define IRandomAccessStreamWithContentType_AddRef __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_AddRef
#define IRandomAccessStreamWithContentType_Release __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_Release
#define IRandomAccessStreamWithContentType_GetIids __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_GetIids
#define IRandomAccessStreamWithContentType_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_GetRuntimeClassName
#define IRandomAccessStreamWithContentType_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_GetTrustLevel
#endif /* WIDL_using_Windows_Storage_Streams */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__ */

/*
 * Class Windows.Storage.Streams.RandomAccessStream
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Storage_Streams_RandomAccessStream_DEFINED
#define RUNTIMECLASS_Windows_Storage_Streams_RandomAccessStream_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Storage_Streams_RandomAccessStream[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','R','a','n','d','o','m','A','c','c','e','s','s','S','t','r','e','a','m',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_RandomAccessStream[] = L"Windows.Storage.Streams.RandomAccessStream";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_RandomAccessStream[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','R','a','n','d','o','m','A','c','c','e','s','s','S','t','r','e','a','m',0};
#endif
#endif /* RUNTIMECLASS_Windows_Storage_Streams_RandomAccessStream_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Storage.Streams.InMemoryRandomAccessStream
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Storage_Streams_InMemoryRandomAccessStream_DEFINED
#define RUNTIMECLASS_Windows_Storage_Streams_InMemoryRandomAccessStream_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Storage_Streams_InMemoryRandomAccessStream[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','I','n','M','e','m','o','r','y','R','a','n','d','o','m','A','c','c','e','s','s','S','t','r','e','a','m',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_InMemoryRandomAccessStream[] = L"Windows.Storage.Streams.InMemoryRandomAccessStream";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_InMemoryRandomAccessStream[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','I','n','M','e','m','o','r','y','R','a','n','d','o','m','A','c','c','e','s','s','S','t','r','e','a','m',0};
#endif
#endif /* RUNTIMECLASS_Windows_Storage_Streams_InMemoryRandomAccessStream_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Storage.Streams.Buffer
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Storage_Streams_Buffer_DEFINED
#define RUNTIMECLASS_Windows_Storage_Streams_Buffer_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Storage_Streams_Buffer[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','B','u','f','f','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_Buffer[] = L"Windows.Storage.Streams.Buffer";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_Buffer[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','B','u','f','f','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Storage_Streams_Buffer_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Storage.Streams.DataWriter
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Storage_Streams_DataWriter_DEFINED
#define RUNTIMECLASS_Windows_Storage_Streams_DataWriter_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Storage_Streams_DataWriter[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','D','a','t','a','W','r','i','t','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_DataWriter[] = L"Windows.Storage.Streams.DataWriter";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_DataWriter[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','D','a','t','a','W','r','i','t','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Storage_Streams_DataWriter_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Storage.Streams.DataWriterStoreOperation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Storage_Streams_DataWriterStoreOperation_DEFINED
#define RUNTIMECLASS_Windows_Storage_Streams_DataWriterStoreOperation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Storage_Streams_DataWriterStoreOperation[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','D','a','t','a','W','r','i','t','e','r','S','t','o','r','e','O','p','e','r','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_DataWriterStoreOperation[] = L"Windows.Storage.Streams.DataWriterStoreOperation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_DataWriterStoreOperation[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','D','a','t','a','W','r','i','t','e','r','S','t','o','r','e','O','p','e','r','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Storage_Streams_DataWriterStoreOperation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Storage.Streams.RandomAccessStreamReference
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Storage_Streams_RandomAccessStreamReference_DEFINED
#define RUNTIMECLASS_Windows_Storage_Streams_RandomAccessStreamReference_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Storage_Streams_RandomAccessStreamReference[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','R','a','n','d','o','m','A','c','c','e','s','s','S','t','r','e','a','m','R','e','f','e','r','e','n','c','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_RandomAccessStreamReference[] = L"Windows.Storage.Streams.RandomAccessStreamReference";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_RandomAccessStreamReference[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','R','a','n','d','o','m','A','c','c','e','s','s','S','t','r','e','a','m','R','e','f','e','r','e','n','c','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Storage_Streams_RandomAccessStreamReference_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Storage::Streams::IRandomAccessStream* > interface
 */
#ifndef ____FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0xba666a00, 0x1555, 0x5df4, 0x81,0xa5, 0x07,0xd2,0x3f,0x7f,0xfc,0xeb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("ba666a00-1555-5df4-81a5-07d23f7ffceb")
                IIterable<ABI::Windows::Storage::Streams::IRandomAccessStream* > : IIterable_impl<ABI::Windows::Storage::Streams::IRandomAccessStream* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0xba666a00, 0x1555, 0x5df4, 0x81,0xa5, 0x07,0xd2,0x3f,0x7f,0xfc,0xeb)
#endif
#else
typedef struct __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream **value);

    END_INTERFACE
} __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl;

interface __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream {
    CONST_VTBL __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
#define __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(__FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(__FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(__FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(__FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(__FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(__FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_First(__FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_IRandomAccessStream IID___FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IIterable_IRandomAccessStreamVtbl __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl
#define IIterable_IRandomAccessStream __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IIterable_IRandomAccessStream_QueryInterface __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface
#define IIterable_IRandomAccessStream_AddRef __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef
#define IIterable_IRandomAccessStream_Release __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release
#define IIterable_IRandomAccessStream_GetIids __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids
#define IIterable_IRandomAccessStream_GetRuntimeClassName __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName
#define IIterable_IRandomAccessStream_GetTrustLevel __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel
#define IIterable_IRandomAccessStream_First __FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Storage::Streams::IRandomAccessStream* > interface
 */
#ifndef ____FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0xc875446a, 0x587f, 0x58da, 0x89,0x7e, 0x3b,0xbe,0x5e,0xc7,0xc3,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("c875446a-587f-58da-897e-3bbe5ec7c30b")
                IIterator<ABI::Windows::Storage::Streams::IRandomAccessStream* > : IIterator_impl<ABI::Windows::Storage::Streams::IRandomAccessStream* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0xc875446a, 0x587f, 0x58da, 0x89,0x7e, 0x3b,0xbe,0x5e,0xc7,0xc3,0x0b)
#endif
#else
typedef struct __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        UINT32 items_size,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl;

interface __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream {
    CONST_VTBL __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Current(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_HasCurrent(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_MoveNext(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetMany(__FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 items_size,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_IRandomAccessStream IID___FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IIterator_IRandomAccessStreamVtbl __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl
#define IIterator_IRandomAccessStream __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IIterator_IRandomAccessStream_QueryInterface __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface
#define IIterator_IRandomAccessStream_AddRef __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef
#define IIterator_IRandomAccessStream_Release __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release
#define IIterator_IRandomAccessStream_GetIids __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids
#define IIterator_IRandomAccessStream_GetRuntimeClassName __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName
#define IIterator_IRandomAccessStream_GetTrustLevel __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel
#define IIterator_IRandomAccessStream_get_Current __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Current
#define IIterator_IRandomAccessStream_get_HasCurrent __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_HasCurrent
#define IIterator_IRandomAccessStream_MoveNext __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_MoveNext
#define IIterator_IRandomAccessStream_GetMany __FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Storage::Streams::IRandomAccessStream* > interface
 */
#ifndef ____FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0x92cd0a46, 0x2266, 0x5cd6, 0x92,0x93, 0xe1,0x11,0x29,0x9f,0x27,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("92cd0a46-2266-5cd6-9293-e111299f2793")
                IVectorView<ABI::Windows::Storage::Streams::IRandomAccessStream* > : IVectorView_impl<ABI::Windows::Storage::Streams::IRandomAccessStream* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0x92cd0a46, 0x2266, 0x5cd6, 0x92,0x93, 0xe1,0x11,0x29,0x9f,0x27,0x93)
#endif
#else
typedef struct __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        UINT32 index,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl;

interface __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream {
    CONST_VTBL __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetAt(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 index,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Size(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_IndexOf(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetMany(__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_IRandomAccessStream IID___FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IVectorView_IRandomAccessStreamVtbl __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl
#define IVectorView_IRandomAccessStream __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IVectorView_IRandomAccessStream_QueryInterface __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface
#define IVectorView_IRandomAccessStream_AddRef __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef
#define IVectorView_IRandomAccessStream_Release __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release
#define IVectorView_IRandomAccessStream_GetIids __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids
#define IVectorView_IRandomAccessStream_GetRuntimeClassName __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName
#define IVectorView_IRandomAccessStream_GetTrustLevel __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel
#define IVectorView_IRandomAccessStream_GetAt __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetAt
#define IVectorView_IRandomAccessStream_get_Size __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Size
#define IVectorView_IRandomAccessStream_IndexOf __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_IndexOf
#define IVectorView_IRandomAccessStream_GetMany __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::Storage::Streams::IRandomAccessStream* > interface
 */
#ifndef ____FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0x2736b66b, 0xdaa3, 0x5e0c, 0x98,0x42, 0x6a,0x0f,0x44,0xb5,0x44,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("2736b66b-daa3-5e0c-9842-6a0f44b5440b")
                IVector<ABI::Windows::Storage::Streams::IRandomAccessStream* > : IVector_impl<ABI::Windows::Storage::Streams::IRandomAccessStream* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0x2736b66b, 0xdaa3, 0x5e0c, 0x98,0x42, 0x6a,0x0f,0x44,0xb5,0x44,0x0b)
#endif
#else
typedef struct __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        UINT32 index,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **value);

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

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        UINT32 index,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        UINT32 index,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *value);

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

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        UINT32 count,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **items);

    END_INTERFACE
} __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl;

interface __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream {
    CONST_VTBL __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetAt(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 index,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Size(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetView(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__FIVectorView_1_Windows__CStorage__CStreams__CIRandomAccessStream **value) {
    return This->lpVtbl->GetView(This,value);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_IndexOf(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_SetAt(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 index,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_InsertAt(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 index,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_RemoveAt(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_Append(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *value) {
    return This->lpVtbl->Append(This,value);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_RemoveAtEnd(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_Clear(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetMany(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static inline HRESULT __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_ReplaceAll(__FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,UINT32 count,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_IRandomAccessStream IID___FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IVector_IRandomAccessStreamVtbl __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl
#define IVector_IRandomAccessStream __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IVector_IRandomAccessStream_QueryInterface __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface
#define IVector_IRandomAccessStream_AddRef __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef
#define IVector_IRandomAccessStream_Release __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release
#define IVector_IRandomAccessStream_GetIids __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids
#define IVector_IRandomAccessStream_GetRuntimeClassName __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName
#define IVector_IRandomAccessStream_GetTrustLevel __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel
#define IVector_IRandomAccessStream_GetAt __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetAt
#define IVector_IRandomAccessStream_get_Size __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Size
#define IVector_IRandomAccessStream_GetView __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetView
#define IVector_IRandomAccessStream_IndexOf __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_IndexOf
#define IVector_IRandomAccessStream_SetAt __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_SetAt
#define IVector_IRandomAccessStream_InsertAt __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_InsertAt
#define IVector_IRandomAccessStream_RemoveAt __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_RemoveAt
#define IVector_IRandomAccessStream_Append __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_Append
#define IVector_IRandomAccessStream_RemoveAtEnd __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_RemoveAtEnd
#define IVector_IRandomAccessStream_Clear __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_Clear
#define IVector_IRandomAccessStream_GetMany __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetMany
#define IVector_IRandomAccessStream_ReplaceAll __FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IBuffer* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer, 0x51c3d2fd, 0xb8a1, 0x5620, 0xb7,0x46, 0x7e,0xe6,0xd5,0x33,0xac,0xa3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("51c3d2fd-b8a1-5620-b746-7ee6d533aca3")
            IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IBuffer* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Storage::Streams::IBuffer* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer, 0x51c3d2fd, 0xb8a1, 0x5620, 0xb7,0x46, 0x7e,0xe6,0xd5,0x33,0xac,0xa3)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBufferVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IBuffer* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer *This,
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBufferVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBufferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IBuffer* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_Release(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IBuffer* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IBuffer IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer
#define IAsyncOperationCompletedHandler_IBufferVtbl __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBufferVtbl
#define IAsyncOperationCompletedHandler_IBuffer __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer
#define IAsyncOperationCompletedHandler_IBuffer_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_QueryInterface
#define IAsyncOperationCompletedHandler_IBuffer_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_AddRef
#define IAsyncOperationCompletedHandler_IBuffer_Release __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_Release
#define IAsyncOperationCompletedHandler_IBuffer_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream, 0xbcb37f4f, 0x3af4, 0x561c, 0xa9,0xe3, 0xee,0xf1,0x73,0x84,0x94,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("bcb37f4f-3af4-561c-a9e3-eef1738494d7")
            IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Storage::Streams::IOutputStream* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream, 0xbcb37f4f, 0x3af4, 0x561c, 0xa9,0xe3, 0xee,0xf1,0x73,0x84,0x94,0xd7)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStreamVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream *This,
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStreamVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Release(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IOutputStream IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream
#define IAsyncOperationCompletedHandler_IOutputStreamVtbl __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStreamVtbl
#define IAsyncOperationCompletedHandler_IOutputStream __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream
#define IAsyncOperationCompletedHandler_IOutputStream_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface
#define IAsyncOperationCompletedHandler_IOutputStream_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_AddRef
#define IAsyncOperationCompletedHandler_IOutputStream_Release __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Release
#define IAsyncOperationCompletedHandler_IOutputStream_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStream* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0x398c4183, 0x793d, 0x5b00, 0x81,0x9b, 0x4a,0xef,0x92,0x48,0x5e,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("398c4183-793d-5b00-819b-4aef92485e94")
            IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStream* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Storage::Streams::IRandomAccessStream* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0x398c4183, 0x793d, 0x5b00, 0x81,0x9b, 0x4a,0xef,0x92,0x48,0x5e,0x94)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IRandomAccessStream IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IAsyncOperationCompletedHandler_IRandomAccessStreamVtbl __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl
#define IAsyncOperationCompletedHandler_IRandomAccessStream __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IAsyncOperationCompletedHandler_IRandomAccessStream_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface
#define IAsyncOperationCompletedHandler_IRandomAccessStream_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef
#define IAsyncOperationCompletedHandler_IRandomAccessStream_Release __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release
#define IAsyncOperationCompletedHandler_IRandomAccessStream_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference, 0x60847289, 0xea0b, 0x5df6, 0x89,0xdf, 0xf2,0xc6,0x2c,0xba,0x96,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("60847289-ea0b-5df6-89df-f2c62cba9693")
            IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference, 0x60847289, 0xea0b, 0x5df6, 0x89,0xdf, 0xf2,0xc6,0x2c,0xba,0x96,0x93)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IRandomAccessStreamReference IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference
#define IAsyncOperationCompletedHandler_IRandomAccessStreamReferenceVtbl __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl
#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference
#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface
#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef
#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference_Release __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release
#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType, 0x3dddecf4, 0x1d39, 0x58e8, 0x83,0xb1, 0xdb,0xed,0x54,0x1c,0x7f,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("3dddecf4-1d39-58e8-83b1-dbed541c7f35")
            IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType, 0x3dddecf4, 0x1d39, 0x58e8, 0x83,0xb1, 0xdb,0xed,0x54,0x1c,0x7f,0x35)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType
#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentTypeVtbl __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl
#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType
#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface
#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef
#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType_Release __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release
#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Storage::Streams::IBuffer* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer, 0x3bee8834, 0xb9a7, 0x5a80, 0xa7,0x46, 0x5e,0xf0,0x97,0x22,0x78,0x78);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("3bee8834-b9a7-5a80-a746-5ef097227878")
            IAsyncOperation<ABI::Windows::Storage::Streams::IBuffer* > : IAsyncOperation_impl<ABI::Windows::Storage::Streams::IBuffer* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer, 0x3bee8834, 0xb9a7, 0x5a80, 0xa7,0x46, 0x5e,0xf0,0x97,0x22,0x78,0x78)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBufferVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Storage::Streams::IBuffer* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBufferVtbl;

interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer {
    CONST_VTBL __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBufferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IBuffer* > methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_QueryInterface(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_AddRef(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_Release(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetIids(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetTrustLevel(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IBuffer* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_put_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_get_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetResults(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IBuffer IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer
#define IAsyncOperation_IBufferVtbl __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBufferVtbl
#define IAsyncOperation_IBuffer __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer
#define IAsyncOperation_IBuffer_QueryInterface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_QueryInterface
#define IAsyncOperation_IBuffer_AddRef __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_AddRef
#define IAsyncOperation_IBuffer_Release __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_Release
#define IAsyncOperation_IBuffer_GetIids __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetIids
#define IAsyncOperation_IBuffer_GetRuntimeClassName __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetRuntimeClassName
#define IAsyncOperation_IBuffer_GetTrustLevel __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetTrustLevel
#define IAsyncOperation_IBuffer_put_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_put_Completed
#define IAsyncOperation_IBuffer_get_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_get_Completed
#define IAsyncOperation_IBuffer_GetResults __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream, 0xe8736833, 0xd013, 0x5361, 0x97,0x7d, 0xc5,0xe9,0x99,0x34,0x68,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("e8736833-d013-5361-977d-c5e99934680e")
            IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > : IAsyncOperation_impl<ABI::Windows::Storage::Streams::IOutputStream* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream, 0xe8736833, 0xd013, 0x5361, 0x97,0x7d, 0xc5,0xe9,0x99,0x34,0x68,0x0e)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStreamVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStreamVtbl;

interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream {
    CONST_VTBL __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_AddRef(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_Release(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetIids(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetTrustLevel(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_put_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_get_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetResults(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,__x_ABI_CWindows_CStorage_CStreams_CIOutputStream **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IOutputStream IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream
#define IAsyncOperation_IOutputStreamVtbl __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStreamVtbl
#define IAsyncOperation_IOutputStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream
#define IAsyncOperation_IOutputStream_QueryInterface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface
#define IAsyncOperation_IOutputStream_AddRef __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_AddRef
#define IAsyncOperation_IOutputStream_Release __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_Release
#define IAsyncOperation_IOutputStream_GetIids __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetIids
#define IAsyncOperation_IOutputStream_GetRuntimeClassName __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetRuntimeClassName
#define IAsyncOperation_IOutputStream_GetTrustLevel __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetTrustLevel
#define IAsyncOperation_IOutputStream_put_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_put_Completed
#define IAsyncOperation_IOutputStream_get_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_get_Completed
#define IAsyncOperation_IOutputStream_GetResults __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0x430ecece, 0x1418, 0x5d19, 0x81,0xb2, 0x5d,0xdb,0x38,0x16,0x03,0xcc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("430ecece-1418-5d19-81b2-5ddb381603cc")
            IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream* > : IAsyncOperation_impl<ABI::Windows::Storage::Streams::IRandomAccessStream* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream, 0x430ecece, 0x1418, 0x5d19, 0x81,0xb2, 0x5d,0xdb,0x38,0x16,0x03,0xcc)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl;

interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream {
    CONST_VTBL __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_put_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetResults(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IRandomAccessStream IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IAsyncOperation_IRandomAccessStreamVtbl __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamVtbl
#define IAsyncOperation_IRandomAccessStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream
#define IAsyncOperation_IRandomAccessStream_QueryInterface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_QueryInterface
#define IAsyncOperation_IRandomAccessStream_AddRef __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_AddRef
#define IAsyncOperation_IRandomAccessStream_Release __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_Release
#define IAsyncOperation_IRandomAccessStream_GetIids __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetIids
#define IAsyncOperation_IRandomAccessStream_GetRuntimeClassName __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetRuntimeClassName
#define IAsyncOperation_IRandomAccessStream_GetTrustLevel __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetTrustLevel
#define IAsyncOperation_IRandomAccessStream_put_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_put_Completed
#define IAsyncOperation_IRandomAccessStream_get_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_get_Completed
#define IAsyncOperation_IRandomAccessStream_GetResults __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference, 0x65178d50, 0xe6a2, 0x5d16, 0xb2,0x44, 0x65,0xe9,0x72,0x5e,0x5a,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("65178d50-e6a2-5d16-b244-65e9725e5a0c")
            IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > : IAsyncOperation_impl<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference, 0x65178d50, 0xe6a2, 0x5d16, 0xb2,0x44, 0x65,0xe9,0x72,0x5e,0x5a,0x0c)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl;

interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference {
    CONST_VTBL __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetIids(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetTrustLevel(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_put_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_get_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetResults(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IRandomAccessStreamReference IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference
#define IAsyncOperation_IRandomAccessStreamReferenceVtbl __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl
#define IAsyncOperation_IRandomAccessStreamReference __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference
#define IAsyncOperation_IRandomAccessStreamReference_QueryInterface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface
#define IAsyncOperation_IRandomAccessStreamReference_AddRef __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef
#define IAsyncOperation_IRandomAccessStreamReference_Release __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release
#define IAsyncOperation_IRandomAccessStreamReference_GetIids __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetIids
#define IAsyncOperation_IRandomAccessStreamReference_GetRuntimeClassName __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetRuntimeClassName
#define IAsyncOperation_IRandomAccessStreamReference_GetTrustLevel __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetTrustLevel
#define IAsyncOperation_IRandomAccessStreamReference_put_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_put_Completed
#define IAsyncOperation_IRandomAccessStreamReference_get_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_get_Completed
#define IAsyncOperation_IRandomAccessStreamReference_GetResults __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType, 0xc4a57c5e, 0x32b0, 0x55b3, 0xad,0x13, 0xce,0x1c,0x23,0x04,0x1e,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c4a57c5e-32b0-55b3-ad13-ce1c23041ed6")
            IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > : IAsyncOperation_impl<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType, 0xc4a57c5e, 0x32b0, 0x55b3, 0xad,0x13, 0xce,0x1c,0x23,0x04,0x1e,0xd6)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl;

interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType {
    CONST_VTBL __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetIids(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetTrustLevel(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_put_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_get_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetResults(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IRandomAccessStreamWithContentType IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType
#define IAsyncOperation_IRandomAccessStreamWithContentTypeVtbl __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl
#define IAsyncOperation_IRandomAccessStreamWithContentType __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType
#define IAsyncOperation_IRandomAccessStreamWithContentType_QueryInterface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface
#define IAsyncOperation_IRandomAccessStreamWithContentType_AddRef __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef
#define IAsyncOperation_IRandomAccessStreamWithContentType_Release __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release
#define IAsyncOperation_IRandomAccessStreamWithContentType_GetIids __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetIids
#define IAsyncOperation_IRandomAccessStreamWithContentType_GetRuntimeClassName __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetRuntimeClassName
#define IAsyncOperation_IRandomAccessStreamWithContentType_GetTrustLevel __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetTrustLevel
#define IAsyncOperation_IRandomAccessStreamWithContentType_put_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_put_Completed
#define IAsyncOperation_IRandomAccessStreamWithContentType_get_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_get_Completed
#define IAsyncOperation_IRandomAccessStreamWithContentType_GetResults __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_storage_streams_h__ */
