Реализация интерфейса Directivehow IFileSourceFilter в фильтре на основе CSource - PullRequest
1 голос
/ 01 октября 2011

Я реализую простой фильтр 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;
}

}

1 Ответ

3 голосов
/ 01 октября 2011

Я думаю, вы должны вернуть E_FAIL на данный момент в функции getCurFile.Graphedit спросит фильтр, какой файл загружен, и ожидает получить имя файла, когда GetCurFile вернет S_OK.Но ppszFileName будет указывать на случайную память, если вы не инициализируете ее.

Было бы лучше на самом деле вернуть значение в getCurFile.Выделите память, используя CoTaskMemAlloc для имени файла и mediatype.Затем установите фиктивное имя файла и присвойте медиатайпу значение 0. (но убедитесь, что указатели не равны нулю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...