フィルタのプロパティ ページの表示
プロパティ ページは、ユーザーが設定可能なプロパティをサポートするための 1 つの方法である。ここでは、アプリケーションでフィルタのプロパティ ページを表示する方法を解説する。プロパティ ページの詳細については、Platform SDK のドキュメントを参照すること。
注 : DirectShow が提供するフィルタの多くはプロパティ ページをサポートしているが、そのサポートはデバッグを目的としたもので、アプリケーションでの使用は推奨されない。ほとんどの場合は、同等の機能がフィルタのカスタム インターフェイスで提供されている。アプリケーションは、プロパティ ページをユーザーに公開するのではなく、これらのフィルタをプログラム的に制御する必要がある。
プロパティ ページを持つフィルタは、ISpecifyPropertyPages インターフェイスを公開する。フィルタがプロパティ ページを定義しているかどうかを判断するには、QueryInterface を使ってフィルタにこのインターフェイスの有無を問い合わせる。
フィルタのインスタンスを (CoCreateInstance を呼び出して) 直接生成した場合は、フィルタへのポインタを既に持っている。直接生成していない場合は、IFilterGraph::EnumFilters メソッドを使って、グラフ内のフィルタを列挙できる。詳細については、「フィルタ グラフ内のオブジェクトの列挙」を参照すること。
ISpecifyPropertyPages インターフェイス ポインタを取得したら、ISpecifyPropertyPages::GetPages メソッドを呼び出して、フィルタのプロパティ ページを取得する。このメソッドは、グローバル一意識別子 (GUID) のカウント配列に各プロパティ ページのクラス識別子 (CLSID) を書き込む。カウント配列は CAUUID 構造体で定義される。この構造体は割り当てなければならないが、初期化する必要はない。GetPages メソッドがこの配列を割り当てる。この配列は、CAUUID 構造体の pElems メンバに格納されている。処理が終わったら、必ず CoTaskMemFree 関数を呼び出して GUID 配列を解放すること。
OleCreatePropertyFrame 関数は、モーダル ダイアログ ボックス内にプロパティ ページを表示する簡単な方法を提供する。
IBaseFilter *pFilter;
/* フィルタの IBaseFilter インターフェイスを取得する (省略)。 */
ISpecifyPropertyPages *pProp;
HRESULT hr = pFilter->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pProp);
if (SUCCEEDED(hr))
{
// フィルタの名前と IUnknown ポインタを取得する。
FILTER_INFO FilterInfo;
hr = pFilter->QueryFilterInfo(&FilterInfo);
IUnknown *pFilterUnk;
pFilter->QueryInterface(IID_IUnknown, (void **)&pFilterUnk);
// ページを表示する。
CAUUID caGUID;
pProp->GetPages(&caGUID);
pProp->Release();
OleCreatePropertyFrame(
hWnd, // 親ウィンドウ。
0, 0, // 予約済み。
FilterInfo.achName, // ダイアログ ボックスのキャプション。
1, // オブジェクト数 (フィルタのみ)。
&pFilterUnk, // オブジェクト ポインタの配列。
caGUID.cElems, // プロパティ ページ数。
caGUID.pElems, // プロパティ ページ CLSID の配列。
0, // ロケール識別子。
0, NULL // 予約済み。
);
// クリーン アップ。
pFilterUnk->Release();
FilterInfo.pGraph->Release();
CoTaskMemFree(caGUID.pElems);
}