共用方式為


根據 CLSID 添加篩選器

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine和媒體基金會中的 音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

下列函式會建立具有指定類別標識碼 (CLSID) 的篩選,並將它新增至篩選圖形:

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

注意

此範例會使用 SafeRelease 函式來釋放 IBaseFilter 指標。

 

函式會呼叫 CoCreateInstance 來建立篩選,然後呼叫 IFilterGraph::AddFilter 將篩選新增至圖形。 下列程式代碼範例會使用此函式將 AVI Mux 篩選新增至圖形:

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

請注意,某些篩選無法使用 CoCreateInstance來建立。 這通常是負責管理其他軟體元件的篩選器的情況。 例如,AVI 壓縮機 篩選器是視訊編解碼器的包裝函式,而 WDM 視訊擷取 篩選器是 WDM 擷取驅動程式的包裝函式。 這些篩選必須使用 系統裝置列舉值篩選對應程式來建立。 如需詳細資訊,請參閱 列舉裝置和篩選

一般 Graph-Building 技術