代码之家  ›  专栏  ›  技术社区  ›  Chen OT

为什么我的自定义接口总是返回不可能的0x80040213/VFW\u E\u NO\u时钟?

  •  0
  • Chen OT  · 技术社区  · 6 年前

    我有一个转换过滤器,它公开了一个自定义接口 IMyInit . 此接口用于在流式处理之前配置一些基本设置。

    DECLARE_INTERFACE_(IMyInit, IUnknown) {
        STDMETHOD HRESULT SetPath(const wchar_t* wcsPath) PURE;
        STDMETHOD HRESULT SetMode(UINT uMode)  PURE;
    };
    

    客户端代码如下:

    CComPtr<IBaseFilter> pMyFilter;
    HRESULT hr = CoCreateInstance(CLSID_MYFILTER, IID_MYFILTER, ..., (void**)&pMyFilter);
    // hr is S_OK
    
    CComPtr<IMyInit> pMyInit;
    hr = pMyFilter->QueryInterface(IID_IMyInit, (void**)&pMyInit);
    // hr is S_OK
    
    hr = pMyInit->SetMode(1);
    // hr is 0x80040213/VFW_E_NO_CLOCK
    

    在我的 CMyFilter::设置模式(UINT uMode) ,只有 E\U指针 , E\u INVALIDARG 用于参数检查,以及 S\u正常 如果 uMode 已设置。无法返回此类错误代码, VFW\U E\U NO\U时钟 ,与变换过滤器相关。

    为什么?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Chen OT    6 年前

    我已经实施了 IMyInit公司 中的接口调度 非删除查询接口 ,看起来

    if(riid == IID_IMyInit) {
        return  GetInterface((IMyInit*)this, ppv);
    }
    

    但是我忘了让我的 CMY过滤器 混凝土等级 继承 IMyInit公司 界面所以两者之间没有联系 IMyInit公司 CMY过滤器 .

    这个 C型铸件 , (IMyInit*)this ,然后将 ppv公司 CMyFilter 是一些基类,可能是直接秀的 CTransformFilter . 指向的未知方法 IMyInit::SetMode(UINT) 可能需要时钟存在。这就是为什么 VFW\U E\U NO\U时钟 将返回。