フィルタのプロパティ ページの表示

プロパティ ページは、ユーザーが設定可能なプロパティをサポートするための 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);
}