为什么我的自定义界面总是return不可能0x80040213/VFW_E_NO_CLOCK?

Why does my custom interface always return impossible 0x80040213/VFW_E_NO_CLOCK?

我有一个公开自定义界面的转换过滤器 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::SetMode(UINT uMode)里面只有E_POINTER, E_INVALIDARG 用于参数检查,S_OK 如果设置了 uMode。不可能return这样的错误代码,VFW_E_NO_CLOCK,与转换过滤器有关。

为什么?

我已经在 NonDelegatingQueryInterface 中实现了 IMyInit 接口调度,看起来像

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

但是!我忘了让我的 CMyFilter 具体 class inherit 来自 IMyInit 接口。所以 IMyInitCMyFilter.

之间没有联系

C 风格转换(IMyInit*)this,然后将 ppv 转换为 CMyFilter 的一些基class,可能是直秀的CTransformFilterIMyInit::SetMode(UINT) 指向的未知方法可能需要时钟存在。这就是为什么 VFW_E_NO_CLOCK 会 return.