Condividi tramite


Aggiungere un filtro per CLSID

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine 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, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

La funzione seguente crea un filtro con un identificatore di classe specificato (CLSID) e lo aggiunge al grafico del filtro:

// Create a filter by CLSID and add it to the graph.

HRESULT AddFilterByCLSID(
    IGraphBuilder *pGraph,      // Pointer to the Filter Graph Manager.
    REFGUID clsid,              // CLSID of the filter to create.
    IBaseFilter **ppF,          // Receives a pointer to the filter.
    LPCWSTR wszName             // A name for the filter (can be NULL).
    )
{
    *ppF = 0;

    IBaseFilter *pFilter = NULL;
    
    HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&pFilter));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pGraph->AddFilter(pFilter, wszName);
    if (FAILED(hr))
    {
        goto done;
    }

    *ppF = pFilter;
    (*ppF)->AddRef();

done:
    SafeRelease(&pFilter);
    return hr;
}

Nota

In questo esempio viene usata la funzione SafeRelease per rilasciare il puntatore IBaseFilter .

 

La funzione chiama CoCreateInstance per creare il filtro e quindi chiama IFilterGraph::AddFilter per aggiungere il filtro al grafico. Nell'esempio di codice seguente viene usata questa funzione per aggiungere il filtro AVI Mux al grafico:

IBaseFilter *pMux;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux, NULL); 
if (SUCCEEDED(hr))
{
    /* ... */
   pMux->Release();
}

Si noti che non è possibile creare alcuni filtri con CoCreateInstance. Questo è spesso il caso di filtri che gestiscono altri componenti software. Ad esempio, il filtro AVI Compressor è un wrapper per i codec video e il filtro Di acquisizione video WDM è un wrapper per i driver di acquisizione WDM. Questi filtri devono essere creati usando l'enumeratore dispositivo di sistema o il filtro mapper. Per altre informazioni, vedere Enumerazione di dispositivi e filtri.

Tecniche generali di Graph-Building