2011-11-13 89 views
0

我剛剛在我的使用DSPACK組件庫的Delphi 6 DirectShow應用程序中引入了一個「陳舊」接口引用的很長的調試會話。如您所知,當過濾器圖表處於活動狀態時需要執行一些操作,而在過濾器圖表必須處於非活動狀態時需要對組件參數執行其他操作。問題在於你最終可能得到的DirectShow接口引用仍然具有初始化值(已分配,而不是NIL),但對當前的Filter Graph化身無效,因爲它們是在過濾器圖形的前一個化身期間創建的。這意外並不難,同時打開和關閉Filter Graph以在「實時」發現操作和離線配置操作之間切換。離線操作的一個示例是在下一次打開圖形時創建具體過濾器實例時,爲其中一個DSPACK組件設置Moniker。有沒有一種自動防止「陳舊」DirectShow接口引用的方法?

例如,您可以在首次激活過濾器圖表時指定的IBaseFilter引用,該過濾器圖表是您在去激活並重新激活過濾器圖表後嘗試重新使用的。接口引用現在是「過時的」,因爲它不屬於Filter Graph的當前版本,而是屬於前一版本。這會導致各種奇怪的和不直觀的DirectShow錯誤消息,這些消息不是它們看起來的,而是由於接口引用過時而導致的。

有沒有人想出一種方式,無論是通過約定還是通過一些巧妙的解決方案,如DirectShow智能指針綁定到Filter Graph的生命週期等,以防止發生這種情況?或者是對接口參考使用情況持續小心的唯一解決方案?

回答

1

作爲過濾器開發者,當過濾器收到某些處理請求時,您會返回錯誤代碼,並且看起來過濾器已從圖中刪除或更改其狀態。

從應用程序方面來說,您可以控制執行任何類型的sychnronization來指示終止操作。例如,在停止/釋放過濾器圖形之前,您可以設置一個終止標誌(布爾變量),並且在一種可能遲到並需要同步的處理回調中,檢查該標誌,並知道何時該中止處理由於未解決的終止請求。

相關問題