首页 > 解决方案 > IMFSourceResolver::CreateObjectFromByteStream 返回 E_NOTIMPL

问题描述

我尝试从 Microsoft 修改受保护的播放器示例。

我实现了一个提供给 IMFSourceResolver 的自定义 IMFByteStream,但是当我将它提供给“他”时,结果是 E_NOTIMPL,这个功能没有实现吗?!?

标签: c++ms-media-foundation

解决方案


事实证明,自从我快速实现了 IMFByteStream,我留下了很多方法......你猜对了......没有实现,我没想到它们会被调用,因此解析器返回未实现。

一旦我开始记录所有方法调用,我就开始弄清楚源解析器实际需要什么,并开始提供一个实现。

更重要的是,起初我对 QueryInterface 做了一个非常粗略的实现,它需要一个好的实现,否则解析器会调用错误的方法。一旦我实现了正确的查询接口,它实际上开始理解在我的组件中调用了哪些方法(起初,看到我赋予它读取功能并且它尝试做的第一件事是在我的流上写入,这很奇怪,我不打算实施)。

HRESULT FileByteStream::QueryInterface(REFIID iid, void** ppv) {
    if (!ppv) {
        return E_POINTER;
    }
    if (iid == IID_IUnknown) {
        *ppv = static_cast<IUnknown*>(this);
    } else if (iid == IID_IMFByteStream) {
        *ppv = static_cast<IMFByteStream*>(this);
    } else {
        *ppv = NULL;
        return E_NOINTERFACE;
    }
    AddRef();
    return S_OK;
}

推荐阅读