Удаление всех фильтров в графе
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Самый простой способ удалить все фильтры в графе фильтров — просто освободить диспетчер графов фильтров и создать новый. Не забудьте освободить каждый указатель, который приложение имеет к любым интерфейсам в диспетчерах графов фильтров, а также указатели на объекты в графе, включая фильтры, закрепления, часы ссылки и т. д.
Кроме того, можно удалить фильтры по одному за раз с помощью метода IFilterGraph::RemoveFilter:
// Stop the graph.
pControl->Stop();
// Enumerate the filters in the graph.
IEnumFilters *pEnum = NULL;
HRESULT hr = pGraph->EnumFilters(&pEnum);
if (SUCCEEDED(hr))
{
IBaseFilter *pFilter = NULL;
while (S_OK == pEnum->Next(1, &pFilter, NULL))
{
// Remove the filter.
pGraph->RemoveFilter(pFilter);
// Reset the enumerator.
pEnum->Reset();
pFilter->Release();
}
pEnum->Release();
}
В этом примере используется метод IFilterGraph::EnumFilters для перечисления фильтров в графе. Удаление фильтра приводит к тому, что объект перечислителя перестает синхронизироваться с графом. Используйте метод IEnumFilters::Reset для сброса перечислителя. В противном случае любой последующий вызов IEnumFilters::Next завершится ошибкой.