У меня только что был длинный сеанс отладки, который был вызван «устаревшей» ссылкой на интерфейс в моем приложении Delphi 6 DirectShow, которое использует библиотеку компонентов DSPACK. Как вы знаете, есть некоторые операции, которые необходимо выполнить, когда граф фильтра активен, и некоторые операции, выполняемые с параметрами компонента, когда граф фильтра должен быть неактивным. Проблема заключается в том, что в результате вы можете получить ссылки на интерфейс DirectShow, которые по-прежнему имеют инициализированные значения (назначенные, но не NIL), но не действительны для текущего воплощения графика фильтра, поскольку они были созданы во время предыдущего воплощения графика фильтра. Это не так сложно сделать случайно, при включении и выключении графика фильтра для переключения между «живыми» операциями обнаружения и операциями автономной конфигурации. Примером автономной операции является настройка Moniker для одного из компонентов DSPACK, который будет использоваться при создании экземпляра конкретного фильтра при следующем включении графика.
Например, у вас может быть ссылка на IBaseFilter, назначенная вами при первой активации графика фильтра, которую вы пытались использовать повторно после деактивации и повторной активации графика фильтра. Ссылка на интерфейс теперь «устарела», потому что она принадлежит не текущему воплощению Графа фильтра, а предыдущему. Это приводит к всевозможным странным и не интуитивным сообщениям об ошибках DirectShow, которые не являются тем, чем они кажутся, но на самом деле из-за устаревшей ссылки на интерфейс.
Кто-нибудь придумал способ, будь то по соглашению или с помощью какого-нибудь умного решения, такого как интеллектуальный указатель DirectShow, привязанный к времени жизни графика фильтра и т. Д., Чтобы этого не произошло? Или это единственное решение, которое должно быть неослабно осторожным при использовании ссылок на интерфейсы?