Hinweise zur Fehlerbehebung
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
Diese folgenden Tipps helfen Ihnen, Deadlocks oder Abstürze in Ihrer DirectShow-Anwendung zu vermeiden.
Globale Objekte
Ein globales C++-Objekt sollte keine DirectShow-Objekte in seiner Konstruktormethode erstellen oder in seiner Destruktormethode freigeben. Dies kann dazu führen, dass die Anwendung aus folgendem Grund unbegrenzt blockiert wird:
Threads können innerhalb der Einstiegspunktfunktion einer DLL nicht beendet werden. Kernel 32 enthält während der Einstiegspunktfunktion eine globale Prozesssperre, und die Sperre verhindert, dass der Thread beendet wird. Da einige DirectShow-Objekte Threads besitzen, können sie blockieren, wenn sie innerhalb einer DLL-Einstiegspunktfunktion freigegeben werden. Wenn eine Anwendung über ein globales C++-Objekt verfügt, ruft die C-Laufzeit-DLL den Destruktor des Objekts auf, wenn die DLL entladen wird. Wenn der Destruktor DirectShow-Objekte freigibt, kann er als Ergebnis blockiert werden.
Aus ähnlichen Gründen sollte eine DLL keine DirectShow-Objekte in ihrer Einstiegspunktroutine erstellen oder freigeben.
Freigeben von Schnittstellen
Sie sollten alle DirectShow-Schnittstellenzeiger freigeben, während Ihre Anwendung noch Nachrichten verarbeitet, bevor die Nachrichtenschleife beendet wird. Andernfalls werden möglicherweise verschiedene Assertionen angezeigt, da einige DirectShow-Objekte Während ihrer sauber-Up-Routinen Nachrichten senden.
(Wenn Sie die ATL CWindowImpl-Klasse verwenden, warten Sie nicht, bis OnFinalMessage die Schnittstellen freigibt. Geben Sie sie stattdessen frei, wenn Sie die WM_CLOSE Nachricht verarbeiten.)
Anzahl der Referenzdaten
Wenn die Debugversion von Quartz.dll entladen wird, wird überprüft, ob DirectShow-Objekte Verweisanzahlen aufweisen, die nicht freigegeben wurden. Wenn ja, wird eine Assertion ausgelöst:
g_cFGObjects == 0
Wenn diese Assertion fehlschlägt, bedeutet dies, dass Ihre Anwendung eine Verweisanzahl verloren hat. Überprüfen Sie Ihren Code, und stellen Sie sicher, dass Sie alle Schnittstellenzeiger freigeben.
Zugehörige Themen