Rimuovere tutti i filtri nel grafico
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Il modo più semplice per rimuovere tutti i filtri in un grafico di filtro consiste semplicemente nel rilasciare Filter Graph Manager e crearne uno nuovo. Assicurarsi di rilasciare ogni puntatore che l'applicazione deve avere a qualsiasi interfaccia in Filter Graph Managers, nonché puntatori a oggetti nel grafico, inclusi filtri, pin, orologio di riferimento e così via.
In alternativa, è possibile rimuovere i filtri uno alla volta, usando il metodo 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();
}
In questo esempio viene utilizzato il metodo IFilterGraph::EnumFilters per enumerare i filtri nel grafico. La rimozione di un filtro fa sì che l'oggetto enumeratore diventi non sincronizzato con il grafico. Utilizzare il metodo IEnumFilters::Reset per reimpostare l'enumeratore. In caso contrario, qualsiasi chiamata successiva a IEnumFilters::Next avrà esito negativo.