Schritt 1: Definieren eines Mechanismus zum Festlegen der Eigenschaft

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Der Filter muss eine Möglichkeit unterstützen, damit die Eigenschaftenseite mit ihr kommunizieren kann, damit die Eigenschaftenseite Eigenschaften für den Filter festlegen und abrufen kann. Folgende Mechanismen sind möglich:

  • Machen Sie eine benutzerdefinierte COM-Schnittstelle verfügbar.
  • Unterstützen Sie Automatisierungseigenschaften über IDispatch.
  • Machen Sie die IPropertyBag-Schnittstelle verfügbar, und definieren Sie einen Satz benannter Eigenschaften.

In diesem Beispiel wird eine benutzerdefinierte COM-Schnittstelle namens ISaturation verwendet. Dies ist keine tatsächliche DirectShow-Schnittstelle. Es wird nur für dieses Beispiel definiert. Beginnen Sie mit dem Deklarieren der Schnittstelle in einer Headerdatei zusammen mit dem Schnittstellenbezeichner (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;
};

Sie können auch die Schnittstelle mit IDL definieren und den MIDL-Compiler verwenden, um die Headerdatei zu erstellen. Implementieren Sie als Nächstes die benutzerdefinierte Schnittstelle im Filter. In diesem Beispiel werden die Methoden "Get" und "Set" für den Sättigungswert des Filters verwendet. Beachten Sie, dass beide Methoden das m_lSaturation-Member mit einem kritischen Abschnitt schützen.

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;
    }
};

Natürlich unterscheiden sich die Details Ihrer eigenen Implementierung von dem hier gezeigten Beispiel.

Nächster Schritt: Schritt 2. Implementieren sie ISpecifyPropertyPages.

CCritSec-Klasse

Erstellen einer Filtereigenschaftenseite