工厂模板数组

[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayerIMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]

工厂模板包含以下公共成员变量:

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 的工厂模板。
  • 一个名为 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 方法可以具有任何名称,因为类工厂引用工厂模板中的函数指针。 但是,g_Templatesg_cTemplates 是类工厂期望查找的全局变量,因此它们必须正好具有这些名称。

如何创建 DirectShow 筛选器 DLL