共用方式為


Factory 範本陣列

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

Factory 範本包含下列公用成員變數:

const WCHAR *              m_Name;                // Name
const CLSID *              m_ClsID;               // CLSID
LPFNNewCOMObject           m_lpfnNew;             // Function to create an instance
                                                  //   of the component
LPFNInitRoutine            m_lpfnInit;            // Initialization function (optional)
const AMOVIESETUP_FILTER * m_pAMovieSetup_Filter; // Set-up information (for filters)

兩個函式指標 m_lpfnNewm_lpfnInit,請使用下列類型定義:

typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);
typedef void (CALLBACK *LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid);

第一個是元件的具現化函式。 第二個是選擇性的初始化函式。 如果您提供初始化函式,則會從 DLL 進入點函式內部呼叫它。 (本文稍後會討論 DLL 進入點函式。)

假設您正在建立 DLL,其中包含名為 CMyComponent 的元件,該元件繼承自 CUnknown。 您必須在 DLL 中提供下列專案:

  • 初始化函式,這是傳回 CMyComponent 新實例的公用方法。
  • 名為 g_Templates 的處理站範本全域陣列 此陣列包含 CMyComponent 的 Factory 範本。
  • 名為 g_cTemplates 的全域變數,指定陣列的大小。

下列範例示範如何宣告這些專案:

// Public method that returns a new instance. 
CUnknown * WINAPI CMyComponent::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) 
{
    CMyComponent *pNewObject = new CMyComponent(NAME("My Component"), pUnk, pHr );
    if (pNewObject == NULL) {
        *pHr = E_OUTOFMEMORY;
    }
    return pNewObject;
} 

CFactoryTemplate g_Templates[1] = 
{
    { 
      L"My Component",                // Name
      &CLSID_MyComponent,             // CLSID
      CMyComponent::CreateInstance,   // Method to create an instance of MyComponent
      NULL,                           // Initialization function
      NULL                            // Set-up information (for filters)
    }
};
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);    

方法 CreateInstance 會呼叫 類別建構函式,並傳回新類別實例的指標。 參數 pUnk 是匯總 IUnknown的指標。 您可以直接將此參數傳遞至類別建構函式。 參數 pHr 是 HRESULT 值的指標。 類別建構函式會將此值設定為適當的值,但如果建構函式失敗,請將值設定為 E_OUTOFMEMORY。

NAME宏會在偵錯組建中產生字串,但會解析為零售組建中的Null。 在此範例中,它會為元件提供出現在偵錯記錄檔中的名稱,但不會佔用最終版本中的記憶體。

方法 CreateInstance 可以有任何名稱,因為類別處理站參考 Factory 範本中的函式指標。 不過, g_Templatesg_cTemplates 是類別處理站預期要尋找的全域變數,因此它們必須剛好擁有這些名稱。

如何建立 DirectShow 篩選 DLL