Dela via


Steg 1. Definiera en mekanism för att ange egenskapen

[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

Filtret måste ha stöd för ett sätt för egenskapssidan att kommunicera med den, så att egenskapssidan kan ange och hämta egenskaper i filtret. Möjliga mekanismer omfattar följande:

  • Exponera ett anpassat COM-gränssnitt.
  • Stöd för Automationegenskaper via IDispatch.
  • Exponera gränssnittet IPropertyBag och definiera en uppsättning namngivna egenskaper.

I det här exemplet används ett anpassat COM-gränssnitt med namnet ISaturation. Det här är inte ett verkligt DirectShow-gränssnitt. det definieras endast för det här exemplet. Börja med att deklarera gränssnittet i en rubrikfil, tillsammans med gränssnittsidentifieraren (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;
};

Du kan också definiera gränssnittet med IDL och använda MIDL-kompilatorn för att skapa huvudfilen. Implementera sedan det anpassade gränssnittet i filtret. I det här exemplet används metoderna "Get" och "Set" för filtrets mättnadsvärde. Observera att båda metoderna skyddar medlemsvariabeln m_lSaturation med en kritisk sektion.

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

Naturligtvis skiljer sig informationen om din egen implementering från exemplet som visas här.

Nästa: steg 2. Implementera ISpecifyPropertyPages.

CCritSec-klass

Skapa en egenskapssida för filter