2011-11-01 31 views
0

我寫了一個推送源過濾器,我在我的Delphi 6應用程序中私下使用。該應用程序使用DSPACK DirectShow組件庫。私下我的意思是我簡單地將過濾器的實例直接添加到我的過濾器圖中,而不是駐留在外部DLL中的過濾器(.ax文件)。如果過濾器有持久的本地數據,是否需要每個DirectShow過濾器實例的唯一類ID?

我應該爲每個創建的過濾器實例創建唯一的類ID(GUID),還是安全地在創建的所有實例之間使用相同的類ID?我很關心這個問題,因爲Filter的每個實例都會創建一個本地數據存儲對象來存放排隊等待Filter的數據。本地數據存儲對象由主機應用程序內的其他代碼寫入,從而通過我的推送源過濾器將數據推送到Filter Graph中。

我現在還不知道DirectShow如何知道方法指針查找是如何完成的,以瞭解我的設計是否安全。當我直接將一個Filter的實例添加到圖形中時,DirectShow是否存儲了Filter Graph將通過對象引用或類ID調用的接口方法指針?如果它是前者,那麼一切都會好起來的,但如果它是後者,那麼如果同一個實例獲得所有方法調用,那麼這可能是一個問題。有沒有人知道這個設計問題的答案?

回答

2

類標識符是特定於類的,而不是類實例。您的過濾器類應該有自己的唯一標識符,並且該類的所有實例都將在運行時共享它。如果您要從其他項目複製代碼,則需要確保用新生成的代碼替換所有現有的CLSID,IID和LIBID標識符。

+0

是的,謝謝,我知道。但是,如果我將多個Filter類的實例添加到同一個Filter Graph,我創建的第一個實例最終會獲得所有DX調用(FillBuffer(),DecideBufferSize()等),還是Filter Graph將路由這些調用到正確的類實例,基於引腳連接? –

+1

一旦過濾器被實例化並且在圖中,它們的'CLSID'只用於持久性目的(只有當它達到保存狀態!),所以它們需要公開相同的'CLSID'。該圖通過它們的接口指針來區分修飾器,並且它還爲它們提供了唯一的名稱。 –

+0

Thanks @Roman R.這就是我需要知道的。 –