Советы по устранению неполадок

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует в новом коде использовать MediaPlayer, IMFMediaEngine и захват аудио и видео в Media Foundation вместо DirectShow, по возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Следующие советы помогут вам избежать взаимоблокировок или сбоев в вашей программе DirectShow.

глобальные объекты

Глобальный объект C++ не должен создавать объекты DirectShow в его методе конструктора или освобождать их в методе деструктора. Это может привести к тому, что приложение блокируется на неопределенный срок по следующей причине:

Потоки не могут завершаться, находясь внутри функции точки входа библиотеки DLL. Ядро 32 содержит глобальную блокировку процесса во время функции точки входа, а блокировка предотвращает выход потока. Так как некоторые объекты DirectShow имеют собственные потоки, они могут блокироваться при вызове из функции точки входа DLL. Если у приложения есть глобальный объект на C++, библиотека C Runtime вызывает деструктор объекта при выгрузке DLL. Если деструктор освобождает объекты DirectShow, он может заблокироваться в результате.

По аналогичным причинам библиотека DLL не должна создавать или выпускать объекты DirectShow в подпрограмме точки входа.

Освобождение интерфейсов

Перед выходом из цикла сообщений следует освободить все указатели интерфейса DirectShow, пока приложение по-прежнему обрабатывает сообщения. В противном случае могут отображаться различные сообщения об ошибках, так как некоторые объекты DirectShow отправляют сообщения во время своих процедур очистки.

(Если вы используете класс ATL CWindowImpl, не ждите до тех пор, пока не сработает OnFinalMessage, чтобы освободить интерфейсы. Вместо этого освободите их во время обработки сообщения WM_CLOSE.)

Количество ссылок

Когда отладочная версия Quartz.dll выгружается, проверяет, имеют ли объекты DirectShow количество ссылок, которые не были выпущены. Если да, он выдает утверждение:

g_cFGObjects == 0 

Если это утверждение завершается ошибкой, это означает, что в вашем приложении произошла утечка счетчика ссылок. Просмотрите код и убедитесь, что вы освобождаете все указатели интерфейса.

отладка в DirectShow