次の方法で共有


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

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

プロパティ ページは、ユーザーが設定できるプロパティをフィルターでサポートするための 1 つの方法です。 この記事では、アプリケーションでフィルターのプロパティ ページを表示する方法について説明します。 プロパティ ページの詳細については、プラットフォーム SDK のドキュメントを参照してください。

注意

DirectShow で提供されるフィルターの多くはプロパティ ページをサポートしていますが、デバッグ目的を目的としており、アプリケーションでの使用はお勧めしません。 ほとんどの場合、同等の機能はフィルターのカスタム インターフェイスを介して提供されます。 アプリケーションは、プロパティ ページをユーザーに公開するのではなく、プログラムでこれらのフィルターを制御する必要があります。

 

プロパティ ページを含むフィルターは 、ISpecifyPropertyPages インターフェイスを 公開します。 フィルターでプロパティ ページが定義されているかどうかを確認するには、 QueryInterface を使用してこのインターフェイスのフィルターに対してクエリを実行します。

( CoCreateInstance を呼び出して) フィルターのインスタンスを直接作成した場合は、既にフィルターへのポインターがあります。 そうでない場合は、 IFilterGraph::EnumFilters メソッドを使用して、グラフ内のフィルターを列挙できます。 詳細については、「 フィルター グラフでのオブジェクトの列挙」を参照してください。

ISpecifyPropertyPages インターフェイス ポインターを取得したら、ISpecifyPropertyPages::GetPages メソッドを呼び出してフィルターのプロパティ ページを取得します。 このメソッドは、グローバル一意識別子 (GUID) のカウントされた配列に、各プロパティ ページのクラス識別子 (CLSID) を入力します。 カウントされる配列は CAUUID 構造体によって定義されます。これは割り当てる必要がありますが、初期化する必要はありません。 GetPages メソッドは、CAUUID 構造体の pElems メンバーに含まれる配列を割り当てます。 完了したら、 CoTaskMemFree 関数を呼び出して配列を解放します。

OleCreatePropertyFrame 関数を使用すると、モーダル ダイアログ ボックス内のプロパティ ページを簡単に表示できます。

IBaseFilter *pFilter;
/* Obtain the filter's IBaseFilter interface. (Not shown) */
ISpecifyPropertyPages *pProp;
HRESULT hr = pFilter->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pProp);
if (SUCCEEDED(hr)) 
{
    // Get the filter's name and IUnknown pointer.
    FILTER_INFO FilterInfo;
    hr = pFilter->QueryFilterInfo(&FilterInfo); 
    IUnknown *pFilterUnk;
    pFilter->QueryInterface(IID_IUnknown, (void **)&pFilterUnk);

    // Show the page. 
    CAUUID caGUID;
    pProp->GetPages(&caGUID);
    pProp->Release();
    OleCreatePropertyFrame(
        hWnd,                   // Parent window
        0, 0,                   // Reserved
        FilterInfo.achName,     // Caption for the dialog box
        1,                      // Number of objects (just the filter)
        &pFilterUnk,            // Array of object pointers. 
        caGUID.cElems,          // Number of property pages
        caGUID.pElems,          // Array of property page CLSIDs
        0,                      // Locale identifier
        0, NULL                 // Reserved
    );

    // Clean up.
    pFilterUnk->Release();
    FilterInfo.pGraph->Release(); 
    CoTaskMemFree(caGUID.pElems);
}

DirectShow の基本的なタスク