Suggerimenti per la risoluzione dei problemi
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine 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, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Questi suggerimenti seguenti consentono di evitare deadlock o arresti anomali nell'applicazione DirectShow.
Oggetti globali
Un oggetto C++ globale non deve creare oggetti DirectShow nel metodo del costruttore o rilasciarli nel metodo di distruttore. In questo modo l'applicazione può bloccarsi per un periodo illimitato, per il motivo seguente:
I thread non possono uscire all'interno della funzione del punto di ingresso di una DLL. Kernel 32 contiene un blocco di processo globale durante la funzione del punto di ingresso e il blocco impedisce l'uscita del thread. Poiché alcuni oggetti DirectShow sono proprietari di thread, possono bloccare se rilasciati all'interno di una funzione del punto di ingresso dll. Se un'applicazione ha un oggetto C++ globale, la DLL di runtime C chiama il distruttore dell'oggetto quando la DLL viene scaricata. Se il distruttore rilascia oggetti DirectShow, può bloccarsi di conseguenza.
Per motivi simili, una DLL non deve creare o rilasciare oggetti DirectShow nella routine del punto di ingresso.
Rilascio di interfacce
È consigliabile rilasciare tutti i puntatori all'interfaccia DirectShow mentre l'applicazione sta ancora elaborando i messaggi, prima di uscire dal ciclo di messaggi. In caso contrario, potrebbero essere visualizzate varie asserzioni, perché alcuni oggetti DirectShow inviano messaggi durante le routine di pulizia.
Se si usa la classe ATL CWindowImpl , non attendere fino a Quando OnFinalMessage non libera le interfacce. Al contrario, liberarli quando si gestisce il messaggio WM_CLOSE.
Conteggi dei riferimenti
Quando la versione di debug di Quartz.dll scarica, controlla se gli oggetti DirectShow hanno conteggi dei riferimenti che non sono stati rilasciati. In tal caso, genera un'asserzione:
g_cFGObjects == 0
Quando questa asserzione ha esito negativo, significa che l'applicazione ha trapelato un conteggio dei riferimenti. Esaminare il codice e assicurarsi di rilasciare tutti i puntatori all'interfaccia.
Argomenti correlati