CLSID によるフィルタの追加

次の関数は、特定のクラス識別子 (CLSID) を持つフィルタを作成し、フィルタ グラフに追加する。

HRESULT AddFilterByCLSID(
    IGraphBuilder *pGraph,  // フィルタ グラフ マネージャへのポインタ。
    const GUID& clsid,      // 作成するフィルタの CLSID。
    LPCWSTR wszName,        // フィルタの名前。
    IBaseFilter **ppF)      // フィルタへのポインタを受け取る。
{
    if (!pGraph || ! ppF) return E_POINTER;
    *ppF = 0;
    IBaseFilter *pF = 0;
    HRESULT hr = CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER,
        IID_IBaseFilter, reinterpret_cast<void**>(&pF));
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pF, wszName);
        if (SUCCEEDED(hr))
            *ppF = pF;
        else
            pF->Release();
    }
    return hr;
}

関数は CoCreateInstance を呼び出してフィルタを作成し、次に IFilterGraph::AddFilter を呼び出してグラフにフィルタを追加する。次のコードでは、この関数を使ってグラフに AVI Mux フィルタを追加する。

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

一部のフィルタは CoCreateInstance では作成できない点に注意すること。他のソフトウェア コンポーネントを管理するフィルタの場合に多い。たとえば、AVI コンプレッサ フィルタはビデオ CODEC のラッパーであり、WDM ビデオ キャプチャ フィルタは WDM キャプチャ ドライバのラッパーである。これらのフィルタは、System Device Enumerator またはフィルタ マッパーを使って作成する必要がある。詳細については、「デバイスとフィルタの列挙」を参照すること。