手順 1. プロパティを設定するためのメカニズムを定義する
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
フィルターは、プロパティ ページがフィルターのプロパティを設定および取得できるように、プロパティ ページと通信する方法をサポートする必要があります。 考えられるメカニズムは次のとおりです。
- カスタム COM インターフェイスを公開します。
- IDispatch を使用して Automation プロパティをサポートします。
- IPropertyBag インターフェイスを公開し、名前付きプロパティのセットを定義します。
この例では、ISaturation という名前のカスタム COM インターフェイスを使用します。 これは実際の DirectShow インターフェイスではありません。この例に対してのみ定義されています。 まず、インターフェイス識別子 (IID) と共に、ヘッダー ファイルで インターフェイスを宣言します。
// Always create new GUIDs! Never copy a GUID from an example.
DEFINE_GUID(IID_ISaturation, 0x19412d6e, 0x6401,
0x475c, 0xb0, 0x48, 0x7a, 0xd2, 0x96, 0xe1, 0x6a, 0x19);
interface ISaturation : public IUnknown
{
STDMETHOD(GetSaturation)(long *plSat) = 0;
STDMETHOD(SetSaturation)(long lSat) = 0;
};
IDL を使用して インターフェイスを定義し、MIDL コンパイラを使用してヘッダー ファイルを作成することもできます。 次に、フィルターにカスタム インターフェイスを実装します。 この例では、フィルターの飽和値に "Get" メソッドと "Set" メソッドを使用します。 どちらのメソッドも、クリティカル セクションを使用してm_lSaturation メンバーを保護していることに注意してください。
class CGrayFilter : public ISaturation, /* Other inherited classes. */
{
private:
CCritSec m_csShared; // Protects shared data.
long m_lSaturation; // Saturation level.
public:
STDMETHODIMP GetSaturation(long *plSat)
{
if (!plSat) return E_POINTER;
CAutoLock lock(&m_csShared);
*plSat = m_lSaturation;
return S_OK;
}
STDMETHODIMP SetSaturation(long lSat)
{
CAutoLock lock(&m_csShared);
if (lSat < SATURATION_MIN || lSat > SATURATION_MAX)
{
return E_INVALIDARG;
}
m_lSaturation = lSat;
return S_OK;
}
};
もちろん、独自の実装の詳細は、次に示す例とは異なります。
次へ: 手順 2.ISpecifyPropertyPages を実装します。
関連トピック