Compartir a través de


Sugerencias para la solución de problemas

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Estas sugerencias siguientes le ayudarán a evitar interbloqueos o bloqueos en la aplicación DirectShow.

Objetos globales

Un objeto C++ global no debe crear objetos DirectShow en su método de constructor ni liberarlos en su método destructor. Si lo hace, puede hacer que la aplicación se bloquee indefinidamente, por el siguiente motivo:

Los subprocesos no pueden salir mientras se encuentra dentro de la función de punto de entrada de un archivo DLL. Kernel 32 contiene un bloqueo de proceso global durante la función de punto de entrada y el bloqueo impide que el subproceso salga. Dado que algunos objetos DirectShow poseen subprocesos, pueden bloquearse si se liberan desde dentro de una función de punto de entrada dll. Si una aplicación tiene un objeto C++ global, el archivo DLL en tiempo de ejecución de C llama al destructor del objeto cuando se descarga el archivo DLL. Si el destructor libera objetos DirectShow, puede bloquearse como resultado.

Por motivos similares, un archivo DLL no debe crear ni liberar objetos DirectShow en su rutina de punto de entrada.

Liberar interfaces

Debe liberar todos los punteros de interfaz directShow mientras la aplicación sigue procesando mensajes, antes de salir del bucle de mensajes. De lo contrario, es posible que vea varias aserciones, ya que algunos objetos DirectShow envían mensajes durante sus rutinas de limpieza.

(Como corolario, si usa la clase ATL CWindowImpl , no espere hasta que OnFinalMessage libere las interfaces. En su lugar, liberelos cuando controle el mensaje de WM_CLOSE).

Recuentos de referencias

Cuando se descarga la versión de depuración de Quartz.dll, comprueba si los objetos DirectShow tienen recuentos de referencia que no se publicaron. Si es así, produce una aserción:

g_cFGObjects == 0 

Cuando se produce un error en esta aserción, significa que la aplicación ha filtrado un recuento de referencias. Revise el código y asegúrese de liberar todos los punteros de interfaz.

Depuración en DirectShow