Dicas de solução de problemas

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Estas dicas a seguir ajudarão você a evitar deadlocks ou falhas em seu aplicativo DirectShow.

Objetos globais

Um objeto C++ global não deve criar objetos DirectShow em seu método de construtor ou soltá-los em seu método destruidor. Isso pode fazer com que o aplicativo seja bloqueado indefinidamente, pelo seguinte motivo:

Os threads não podem sair enquanto estiverem dentro da função de ponto de entrada de uma DLL. O Kernel 32 mantém um bloqueio de processo global durante a função de ponto de entrada e o bloqueio impede que o thread saia. Como alguns objetos DirectShow possuem threads, eles podem bloquear se liberados de dentro de uma função de ponto de entrada de DLL. Se um aplicativo tiver um objeto C++ global, a DLL do runtime C chamará o destruidor do objeto quando a DLL for descarregada. Se o destruidor liberar objetos DirectShow, ele poderá bloquear como resultado.

Por motivos semelhantes, uma DLL não deve criar ou liberar objetos DirectShow em sua rotina de ponto de entrada.

Liberando interfaces

Você deve liberar todos os ponteiros da interface DirectShow enquanto o aplicativo ainda está processando mensagens, antes que ele saia do loop de mensagem. Caso contrário, você poderá ver várias declarações, pois alguns objetos DirectShow enviam mensagens durante suas rotinas de limpo.

(Como um corolário, se você estiver usando a classe CWindowImpl da ATL, não aguarde até OnFinalMessage liberar as interfaces. Em vez disso, libere-os quando você manipular a mensagem WM_CLOSE.)

Contagens de referência

Quando a versão de depuração do Quartz.dll é descarregada, ele verifica se algum objeto DirectShow tem contagens de referência que não foram lançadas. Nesse caso, ele lança uma asserção:

g_cFGObjects == 0 

Quando essa asserção falha, significa que o aplicativo vazou uma contagem de referência. Examine seu código e certifique-se de liberar todos os ponteiros de interface.

Depuração no DirectShow