Поделиться через


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

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

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

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

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

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

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

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

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

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

Счетчики ссылок

При выгрузке отладочной версии Quartz.dll проверяется, есть ли у объектов DirectShow количество ссылок, которые не были освобождены. В этом случае выдаст утверждение:

g_cFGObjects == 0 

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

Отладка в DirectShow