为什么我的自定义界面总是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 接口。所以 IMyInit 和 CMyFilter.
之间没有联系
C 风格转换、(IMyInit*)this
,然后将 ppv 转换为 CMyFilter
的一些基class,可能是直秀的CTransformFilter
。 IMyInit::SetMode(UINT)
指向的未知方法可能需要时钟存在。这就是为什么 VFW_E_NO_CLOCK 会 return.
我有一个公开自定义界面的转换过滤器 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 接口。所以 IMyInit 和 CMyFilter.
之间没有联系C 风格转换、(IMyInit*)this
,然后将 ppv 转换为 CMyFilter
的一些基class,可能是直秀的CTransformFilter
。 IMyInit::SetMode(UINT)
指向的未知方法可能需要时钟存在。这就是为什么 VFW_E_NO_CLOCK 会 return.