我实现了从CSource过滤器派生的简单的Directshow过滤器。它工作正常。 我想要的是添加过滤器IFileSourceFilter。所以我为此做的是:
我使用两种方法实现FileSourceFilter接口:
HRESULT Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt)
HRESULT GetCurFile(LPOLESTR * ppszFileName, AM_MEDIA_TYPE *pmt)
目前[仅供测试目的]他们什么都不做
// Required by IFileSourceFilter
STDMETHODIMP Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt)
{
// do nothing for now...Just for test
return S_OK;
}
STDMETHODIMP GetCurFile(LPOLESTR * ppszFileName, AM_MEDIA_TYPE *pmt)
{
// do nothing for now...Just for test
return S_OK;
}
并且还将IFileSourceFilter接口添加到源过滤器的NonDelegatingQueryInterface方法中。
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
if (riid == IID_IFileSourceFilter)
{
return GetInterface((IFileSourceFilter *)this, ppv);
}
else
{
return CSource::NonDelegatingQueryInterface(riid, ppv);
}
}
当我将我的SourceFilter插入grapgEdit时,它很好地问我文件位置...我给出了一个随机文件[ for test porposes IFileSourceFilter interfcae暂时不做任何事情)...
然后我的SourceFilter在grah编辑工具中突然崩溃...... 。
可能是错的?在实现IFileSourceFilter接口时我是否遗漏了什么? 任何可能导致此问题的建议?
祝福
我的SourceFilter结构:
class MySourceFilter : public CSource,public IFileSourceFilter
{
public:
....
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
if (riid == IID_IFileSourceFilter)
{
return GetInterface((IFileSourceFilter *)this, ppv);
}
else
{
return CSource::NonDelegatingQueryInterface(riid, ppv);
}
}
// Required by IFileSourceFilter
STDMETHODIMP Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt)
{
// do nothing for now...Just for test
return S_OK;
}
STDMETHODIMP GetCurFile(LPOLESTR * ppszFileName, AM_MEDIA_TYPE *pmt)
{
// do nothing for now...Just for test
return S_OK;
}
}
答案 0 :(得分:3)
我认为您现在应该在E_FAIL
函数中返回getCurFile
。 Graphedit将询问过滤器哪个文件已加载,并且当GetCurFile返回S_OK时,期望接收文件名。但是ppszFileName将指向随机内存,如果你没有初始化它。
最好在getCurFile
中实际返回一个值。使用CoTaskMemAlloc为文件名和媒体类型分配内存。然后设置一个虚拟文件名,并将mediatype memset设置为0.(但检查指针是否为空)。