Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize 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 bloqueios ou falhas em seu aplicativo DirectShow.
Objetos Globais
Um objeto C++ global não deve criar objetos DirectShow em seu método construtor ou liberá-los em seu método destructor. Isso pode fazer com que o aplicativo seja bloqueado indefinidamente, pelo seguinte motivo:
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 do DirectShow possuem fios, podem bloquear se forem libertados de dentro de uma função de ponto de entrada de uma DLL. Se um aplicativo tiver um objeto C++ global, a DLL de tempo de execução C chamará o destruidor do objeto quando a DLL for descarregada. Se o destruidor liberar objetos DirectShow, isso pode resultar em bloqueio.
Por razões semelhantes, uma DLL não deve criar ou liberar objetos DirectShow em sua rotina de ponto de entrada.
Lançamento de interfaces
Você deve liberar todos os ponteiros da interface DirectShow enquanto seu aplicativo ainda está processando mensagens, antes que ele saia do loop de mensagens. Caso contrário, você poderá ver várias afirmações, porque alguns objetos DirectShow enviam mensagens durante suas rotinas de limpeza.
(Como corolário, se estiveres a usar a classe ATL CWindowImpl, não esperes até OnFinalMessage para libertar as interfaces. Em vez disso, liberte-as quando lidares com a mensagem WM_CLOSE.)
Contagem 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 liberadas. Em caso afirmativo, lança uma afirmação:
g_cFGObjects == 0
Quando essa afirmação falha, significa que seu aplicativo vazou uma contagem de referência. Revise seu código e certifique-se de liberar todos os ponteiros da interface.
Tópicos relacionados