Adicionar um filtro por CLSID

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

A função a seguir cria um filtro com um CLSID (identificador de classe) especificado e o adiciona ao grafo de 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;
}

Observação

Este exemplo usa a função SafeRelease para liberar o ponteiro IBaseFilter .

 

A função chama CoCreateInstance para criar o filtro e, em seguida, chama IFilterGraph::AddFilter para adicionar o filtro ao grafo. O exemplo de código a seguir usa essa função para adicionar o filtro AVI Mux ao grafo:

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

Observe que alguns filtros não podem ser criados com CoCreateInstance. Geralmente, esse é o caso de filtros que gerenciam outros componentes de software. Por exemplo, o filtro AVI Compressor é um wrapper para codecs de vídeo e o filtro captura de vídeo WDM é um wrapper para drivers de captura WDM. Esses filtros devem ser criados usando o Enumerador de Dispositivo do Sistema ou o Mapeador de Filtro. Para obter mais informações, consulte Enumerando dispositivos e filtros.

Técnicas gerais de Graph-Building