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 またはフィルタ マッパーを使って作成する必要がある。詳細については、「デバイスとフィルタの列挙」を参照すること。