Compartir a través de


Paso 1. Definir un mecanismo para establecer la propiedad

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

El filtro debe admitir una manera de que la página de propiedades se comunique con ella, de modo que la página de propiedades pueda establecer y recuperar propiedades en el filtro. Entre los mecanismos posibles se incluyen los siguientes:

  • Exponga una interfaz COM personalizada.
  • Admita las propiedades de Automation a través de IDispatch.
  • Exponga la interfaz IPropertyBag y defina un conjunto de propiedades con nombre.

En este ejemplo se usa una interfaz COM personalizada, denominada ISaturation. No es una interfaz DirectShow real; solo se define para este ejemplo. Comience declarando la interfaz en un archivo de encabezado, junto con el identificador de interfaz (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;
};

También puede definir la interfaz con IDL y usar el compilador MIDL para crear el archivo de encabezado. A continuación, implemente la interfaz personalizada en el filtro. En este ejemplo se usan métodos "Get" y "Set" para el valor de saturación del filtro. Observe que ambos métodos protegen el miembro m_lSaturation con una sección crítica.

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

Por supuesto, los detalles de su propia implementación variarán del ejemplo que se muestra aquí.

Siguiente: Paso 2. Implemente ISpecifyPropertyPages.

CCritSec (clase)

Crear una página de propiedades de filtro