共用方式為


Class Factory 和 Factory 範本

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

本主題描述如何使用 DirectShow 基類來實作 DirectShow 篩選的 DLL。

在用戶端建立 COM 物件的實例之前,它會使用 對 CoGetClassObject 函式的呼叫,建立物件的類別處理站實例。 然後,用戶端會呼叫類別處理站的 IClassFactory::CreateInstance 方法。 它是實際建立元件的類別處理站,並傳回所要求介面的指標。 (CoCreateInstance 函式會將這些步驟結合在函數 call.)

下圖顯示方法呼叫的順序。

方法呼叫以建立類別處理站

CoGetClassObject 會呼叫 DLL 中定義的 DllGetClassObject 函式。 此函式會建立類別處理站,並傳回類別處理站上介面的指標。 DirectShow 會為您實作 DllGetClassObject ,但函式會以特定方式依賴您的程式碼。 若要瞭解其運作方式,您必須瞭解 DirectShow 如何實作類別處理站。

類別處理站是專用於建立另一個 COM 物件的 COM 物件。 每個類別處理站都有一種建立的物件類型。 在 DirectShow 中,每個類別處理站都是相同 C++ 類別 CClassFactory的實例。 類別處理站是透過另一個類別 CFactoryTemplate特製化,也稱為 Factory 範本。 每個類別處理站都會保留 Factory 範本的指標。 Factory 範本包含特定元件的相關資訊,例如元件類別識別碼 (CLSID) ,以及建立元件的函式指標。

DLL 會宣告處理站範本的全域陣列,DLL 中的每個元件各一個。 當 DllGetClassObject 建立新的類別處理站時,它會搜尋具有相符 CLSID 的範本陣列。 假設找到一個,它會建立一個類別處理站,以保存相符範本的指標。 當用戶端呼叫 IClassFactory::CreateInstance時,類別處理站會呼叫範本中定義的具現化函式。

下圖顯示方法呼叫的順序。

dll 中的 class Factory 範本

此架構的優點是您可以只定義一些元件特有的專案,例如具現化函式,而不需要實作整個類別處理站。

如何建立 DirectShow 篩選 DLL