Passaggio 1. Definire un meccanismo per l'impostazione della proprietà
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Il filtro deve supportare un modo per comunicare con la pagina delle proprietà, in modo che la pagina delle proprietà possa impostare e recuperare le proprietà nel filtro. I possibili meccanismi includono quanto segue:
- Esporre un'interfaccia COM personalizzata.
- Supportare le proprietà di Automazione tramite IDispatch.
- Esporre l'interfaccia IPropertyBag e definire un set di proprietà denominate.
In questo esempio viene usata un'interfaccia COM personalizzata, denominata ISaturation. Non si tratta di un'interfaccia DirectShow effettiva; è definito solo per questo esempio. Iniziare dichiarando l'interfaccia in un file di intestazione, insieme all'identificatore dell'interfaccia (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;
};
È anche possibile definire l'interfaccia con IDL e usare il compilatore MIDL per creare il file di intestazione. Implementare quindi l'interfaccia personalizzata nel filtro. In questo esempio vengono usati metodi "Get" e "Set" per il valore di saturazione del filtro. Si noti che entrambi i metodi proteggono il membro m_lSaturation con una sezione critica.
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;
}
};
Naturalmente, i dettagli dell'implementazione personalizzata differiscono dall'esempio illustrato qui.
Avanti: Passaggio 2. Implementare ISpecifyPropertyPages.
Argomenti correlati