Я реализую простой фильтр Directshow, который получен из фильтра CSource.Работает нормально.То, что я хочу, это добавить фильтр 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 в grapg, редактирую, он спрашивает меня о местоположении файла ... Я даю случайный файл [ для тестовых блоков 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;
}
}