フィルターのプロパティ ページの表示
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/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);
}
関連トピック