次の方法で共有


CLSID によるフィルターの追加

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 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手法