我剛剛在我的使用DSPACK組件庫的Delphi 6 DirectShow應用程序中引入了一個「陳舊」接口引用的很長的調試會話。如您所知,當過濾器圖表處於活動狀態時需要執行一些操作,而在過濾器圖表必須處於非活動狀態時需要對組件參數執行其他操作。問題在於你最終可能得到的DirectShow接口引用仍然具有初始化值(已分配,而不是NIL),但對當前的Filter Graph化身無效,因爲它們是在過濾器圖形的前一個化身期間創建的。這意外並不難,同時打開和關閉Filter Graph以在「實時」發現操作和離線配置操作之間切換。離線操作的一個示例是在下一次打開圖形時創建具體過濾器實例時,爲其中一個DSPACK組件設置Moniker。有沒有一種自動防止「陳舊」DirectShow接口引用的方法?
例如,您可以在首次激活過濾器圖表時指定的IBaseFilter引用,該過濾器圖表是您在去激活並重新激活過濾器圖表後嘗試重新使用的。接口引用現在是「過時的」,因爲它不屬於Filter Graph的當前版本,而是屬於前一版本。這會導致各種奇怪的和不直觀的DirectShow錯誤消息,這些消息不是它們看起來的,而是由於接口引用過時而導致的。
有沒有人想出一種方式,無論是通過約定還是通過一些巧妙的解決方案,如DirectShow智能指針綁定到Filter Graph的生命週期等,以防止發生這種情況?或者是對接口參考使用情況持續小心的唯一解決方案?