自定义IBuffer实现调用DataReader::FromBuffer抛hresult_no_interface如何解决
自定义IBuffer实现调用FromBuffer抛出异常的修复方案
异常的根因是 winrt::Windows::Storage::Streams::DataReader::FromBuffer 内部除了查询IBuffer接口外,还会强制查询IBufferByteAccess COM接口来获取缓冲区的原始内存指针,你的现有实现仅声明了对IBuffer的继承,缺少这个接口的实现,因此接口查询失败抛出winrt::hresult_no_interface异常。
需要修改的具体内容如下:
- 修改
MappedFileBuffer的继承列表,新增IBufferByteAccess接口声明
- 修改
- 实现
IBufferByteAccess要求的Buffer方法,返回内部持有的内存指针
- 实现
- 补全类声明末尾的分号(现有代码遗漏会导致编译错误)
修改后的完整类实现参考:
#include <winrt/Windows.Storage.Streams.h> namespace Lib { struct MappedFileBuffer : winrt::implements<MappedFileBuffer, winrt::Windows::Storage::Streams::IBuffer, winrt::Windows::Storage::Streams::IBufferByteAccess> { // 原有自定义方法 void Seek(uint32_t); void Length(uint32_t); uint8_t* data() const; uint32_t Length() const; uint32_t Capacity() const; // IBufferByteAccess 接口要求实现的方法 HRESULT __stdcall Buffer(uint8_t** value) noexcept override { *value = const_cast<uint8_t*>(data()); return S_OK; } MappedFileBuffer(std::wstring_view filepath); ~MappedFileBuffer(); }; }
修改完成后你的原有使用代码不需要做任何调整,即可正常运行。
内容的提问来源于stack exchange,提问作者UnclePooh
相关产品推荐
相关产品推荐

