Ajouter un filtre par CLSID

La fonction suivante crée un filtre avec un identificateur de classe (CLSID) spécifié et l’ajoute au graphique de filtre :

// 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;
}

Notes

Cet exemple utilise la fonction SafeRelease pour libérer le pointeur IBaseFilter .

La fonction appelle CoCreateInstance pour créer le filtre, puis appelle IFilterGraph :: AddFilter pour ajouter le filtre au graphique. L’exemple de code suivant utilise cette fonction pour ajouter le filtre multiplex MUX au graphique :

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

Notez que certains filtres ne peuvent pas être créés avec CoCreateInstance. C’est souvent le cas avec les filtres qui gèrent d’autres composants logiciels. Par exemple, le filtre de compresseur AVI est un wrapper pour les codecs vidéo et le filtre de capture vidéo WDM est un wrapper pour les pilotes de capture WDM. Ces filtres doivent être créés à l’aide de l' énumérateur du périphérique système ou du Mappeur de filtre. Pour plus d’informations, consultez énumération des appareils et des filtres.

Techniques d' Graph-Building générales