You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义IBuffer实现调用DataReader::FromBuffer抛hresult_no_interface如何解决

自定义IBuffer实现调用FromBuffer抛出异常的修复方案

异常的根因是 winrt::Windows::Storage::Streams::DataReader::FromBuffer 内部除了查询IBuffer接口外,还会强制查询IBufferByteAccess COM接口来获取缓冲区的原始内存指针,你的现有实现仅声明了对IBuffer的继承,缺少这个接口的实现,因此接口查询失败抛出winrt::hresult_no_interface异常。

需要修改的具体内容如下:

    1. 修改MappedFileBuffer的继承列表,新增IBufferByteAccess接口声明
    1. 实现IBufferByteAccess要求的Buffer方法,返回内部持有的内存指针
    1. 补全类声明末尾的分号(现有代码遗漏会导致编译错误)

修改后的完整类实现参考:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:45:04