Partager via


Conseils de dépannage

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Les conseils suivants vous aideront à éviter les blocages ou les blocages dans votre application DirectShow.

Objets globaux

Un objet C++ global ne doit pas créer d’objets DirectShow dans sa méthode de constructeur ni les libérer dans sa méthode de destructeur. Cela peut entraîner le blocage indéfini de l’application, pour la raison suivante :

Les threads ne peuvent pas se quitter à l’intérieur de la fonction de point d’entrée d’une DLL. Le noyau 32 contient un verrou de processus global pendant la fonction de point d’entrée, et le verrou empêche la sortie du thread. Étant donné que certains objets DirectShow possèdent des threads, ils peuvent bloquer s’ils sont libérés à partir d’une fonction de point d’entrée DLL. Si une application a un objet C++ global, la DLL runtime C appelle le destructeur de l’objet lorsque la DLL est déchargée. Si le destructeur libère des objets DirectShow, il peut donc bloquer.

Pour des raisons similaires, une DLL ne doit pas créer ou libérer d’objets DirectShow dans sa routine de point d’entrée.

Libération d’interfaces

Vous devez libérer tous les pointeurs d’interface DirectShow pendant que votre application traite toujours les messages, avant de quitter la boucle de message. Sinon, vous pouvez voir différentes affirmations, car certains objets DirectShow envoient des messages pendant leurs routines propre-up.

(En corollaire, si vous utilisez la classe ATL CWindowImpl , n’attendez pas OnFinalMessage pour libérer les interfaces. Au lieu de cela, libérez-les lorsque vous gérez le message WM_CLOSE.)

Nombre de références

Lorsque la version de débogage de Quartz.dll se décharge, elle vérifie si les objets DirectShow ont des nombres de références qui n’ont pas été libérés. Si c’est le cas, il lève une assertion :

g_cFGObjects == 0 

Lorsque cette assertion échoue, cela signifie que votre application a divulgué un nombre de références. Passez en revue votre code et assurez-vous de libérer tous les pointeurs d’interface.

Débogage dans DirectShow