次の方法で共有


手順 1. プロパティを設定するためのメカニズムを定義する

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/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 を実装します

CCritSec クラス

フィルター プロパティ ページの作成