Delen via


Tips voor probleemoplossing

[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

Met deze volgende tips kunt u impasses of crashes in uw DirectShow-toepassing voorkomen.

globale objecten

Een globaal C++-object mag geen DirectShow-objecten maken in de constructormethode of deze vrijgeven in de destructormethode. Dit kan ertoe leiden dat de toepassing voor onbepaalde tijd wordt geblokkeerd, om de volgende reden:

Threads kunnen niet beƫindigen tijdens het uitvoeren van de invoerfunctie van een DLL. Kernel 32 bevat een globale procesvergrendeling tijdens de invoerpuntfunctie en de vergrendeling voorkomt dat de thread wordt afgesloten. Omdat sommige DirectShow-objecten eigenaar zijn van threads, kunnen ze blokkeren als ze worden vrijgegeven vanuit een DLL-invoerpuntfunctie. Als een toepassing een globaal C++-object heeft, roept de C Runtime-DLL destructor van het object aan wanneer het DLL-bestand wordt verwijderd. Als de destructor DirectShow-objecten vrijgeeft, kan deze daardoor geblokkeerd raken.

Om vergelijkbare redenen mag een DLL geen DirectShow-objecten maken of vrijgeven in de ingangspuntroutine.

Interfaces Vrijgeven

U moet alle DirectShow-interfacepointers vrijgeven terwijl uw toepassing nog steeds berichten verwerkt, voordat de berichtlus wordt afgesloten. Anders ziet u mogelijk verschillende asserties, omdat sommige DirectShow-objecten berichten verzenden tijdens hun opschoonroutines.

(Als u de ATL-CWindowImpl klasse gebruikt, wacht dan niet tot OnFinalMessage om de interfaces vrij te maken. Maak ze in plaats daarvan vrij wanneer u het WM_CLOSE-bericht afhandelt.)

verwijzingsaantallen

Wanneer de debug-versie van Quartz.dll wordt afgesloten, wordt gecontroleerd of er DirectShow-objecten referentietellen hebben die niet zijn vrijgegeven. Als dat zo is, gooit het een assertie:

g_cFGObjects == 0 

Wanneer deze bewering mislukt, betekent dit dat uw toepassing een verwijzingsaantal heeft gelekt. Controleer uw code en zorg ervoor dat u alle interfacepointers loslaat.

foutopsporing in DirectShow-