IKsAggregateControl 介面 (ksproxy.h)
IKsAggregateControl 介面提供方法,可在支援介面的 KS 物件上新增和移除 COM 伺服器做為匯總提供者。
此介面的介面標識碼 (IID) IID_IKsAggregateControl。
繼承
IKsAggregateControl 介面繼承自 IUnknown 介面。
方法
IKsAggregateControl 介面具有這些方法。
IKsAggregateControl::KsAddAggregate KsAddAggregate 方法會將 COM 伺服器新增為匯總提供者至公開 IKsAggregateControl 介面之 KS 物件的介面提供者清單。 |
IKsAggregateControl::KsRemoveAggregate KsRemoveAggregate 方法會從公開 IKsAggregateControl 介面之 KS 物件的介面提供者清單中移除先前新增的 COM 伺服器匯總提供者。 |
備註
KS 篩選或針腳支援的所有屬性、方法和事件集都可以以零個或多個匯總介面、對話方塊等方式,在篩選或釘選物件的 DirectShow Proxy 表示上表示。 這些客戶端匯總介面是設定延伸模組,然後可用來與基礎 KS 物件通訊,以代表集合的功能。 集合延伸模組是已註冊的 COM 伺服器,它會在句柄建立期間透過 CoCreateInstance 載入 KS 篩選器或針腳。
集合延伸模組的主要用途是允許介面的匯總,以便透過一或多個 COM 介面支援某些集合。 不過,實作也可能包含對話框的支持、線程中的異步處理等等。 設定處理程式的註冊可讓一個處理程式指出要匯總的特定介面,或公開未命名的介面清單。 在第一個案例中,只有適當的查詢會傳送至物件,而後者中所有不符合已支援介面的查詢都會傳送至此延伸模組物件。
延伸模組也可以藉由支援 IDistributorNotify 介面來接收狀態變更的通知。 如果擴充物件支援此介面,則會在篩選本身處理這些變更之前收到所有啟動、停止和暫停狀態變更的通知。 此外, IDistributorNotify::NotifyGraphChange 方法用於針腳物件延伸模組,以指出 KS 針腳實例剛關閉。 這個方法僅用於針腳介面延伸模組,而且每次連接中斷連接或重新連線時,都會在延伸模組物件上呼叫,而延伸模組物件仍會由針腳物件載入和匯總。
需要釘選連線變更的通知,因為連接中斷連接時不會卸除擴充功能。 相反地,擴充功能會在第一次連接時載入,並透過中斷連線並重新連線而繼續載入,除非重新連線指出針腳上不再支援特定的擴充功能集。 這個事實可讓擴充物件在重新連線之間保留狀態,但也表示延伸模組可能需要 KS 針腳目前是否已連接的相關信息。 擴充功能可以藉由呼叫 IKsObject::KsGetObjectHandle 方法,在延伸模組收到 NotifyGraphChange 呼叫時查詢 KS 針腳的物件句柄來判斷這項資訊。 第一次載入擴充功能時,它可以假設接腳已連線,而任何後續的通知都可能表示中斷連線或重新連線。 因此,通知會在實際變更之後發生,而不是之前通知的狀態變更。
集合延伸模組基本上是一部 COM 伺服器,選擇性地公開 IDistributorNotify 介面,以及零個或多個其他匯總介面,可供篩選的用戶端用來操作延伸模組物件所代表的集合。 透過 CoCreateInstance 建立擴充物件要求時,伺服器一律會顯示用來建立 COM 物件的外部 IUnknown 。 這個 IUnknown 是載入集合延伸模組之篩選或釘選物件上的介面。 IUnknown 介面指標可用來從篩選或針腳查詢資訊或介面,例如 IKsControl。 不過,外部物件上不應留下任何參考,因為它會導致迴圈參考計數。 使用沒有參考計數的介面是可接受的,因為延伸模組是由外部物件匯總,而且根據定義,會在外部對象的參考計數達到零時終結。
為了載入設定延伸模組,Proxy 會查閱從篩選或釘選收集之每個集合的 GUID,以判斷登錄中是否有每個集合。 要載入擴充功能之每個集合的 GUID 為:
HKLM\System\CurrentControlSet\Control\MediaInterfaces\{set guid}
如果存在此子機碼,集合的 GUID 會直接對應至 CoCreateInstance 呼叫之 COM 伺服器參數中使用的 GUID。 每個子機碼可能也有具名二進位值 iid,其中包含要針對這個集合延伸模組匯總介面之 GUID 的二進位表示法。 這是會導致篩選或釘選上的 QueryInterface 傳送至 COM 伺服器的介面 GUID,以供此延伸模組使用。 如果子機碼下沒有這個具名值,所有未知 的 QueryInterface 呼叫都會透過這個延伸模組物件路由傳送,因此允許它支援基礎物件上公開的特定集合的許多介面。 將 iid 設定為集合的 GUID,或未設定 iid 值,即可將集合的 GUID 當做介面識別碼使用。 在後者的情況下,不支援的其他查詢可能會傳送至擴充物件。
雖然 MediaInterfaces 登錄機碼可用來明確指出提供者匯總的任何) 時, (哪一個介面,但整個專案不需要存在。 影響在於任何 COM 伺服器都可以透過 IKsAggregateControl 載入,讓此 COM 伺服器提供匯總介面,不論 COM 伺服器是否列在 MediaInterfaces 登錄機碼底下。
對於支援且已經定義擴充物件處理程式的集合,這些處理程式會在安裝時間自動註冊,或將特定類型的裝置新增至系統時,驅動程式安裝不需要為其篩選條件公開這些 COM 介面執行任何其他工作。 不過,若要公開私人集的 COM 介面,必須在安裝篩選時加入 MediaInterfaces 專案和 COM 伺服器專案。
Proxy 也允許篩選覆寫 在 MediaInterfaces 下註冊之集合的 COM 伺服器。 若要覆寫,請在 隨插即用 介面登錄機碼底下建立 SetAliases 機碼。 CLSID 和 FriendlyName 位於 HKLM\...\SetAliases 路徑中。
此外,輸入具名值 {set guid},這是設定 GUID 的字串格式,做為取代 MediaInterfaces 子機碼之 GUID 的二進位值。 因此,針對此篩選條件或任何在此篩選下的物件,所有具有此 GUID 的集合都會使用此替代 GUID 來尋找 MediaInterfaces 專案,而不是集合本身的 GUID。 新的 MediaInterfaces 專案會如往常註冊。
如需 IDistributorNotify、IUnknown 和 CoCreateInstance 的詳細資訊,請參閱 Microsoft Windows SDK 檔。
規格需求
需求 | 值 |
---|---|
目標平台 | Windows |
標頭 | ksproxy.h (包含 Ksproxy.h) |