工厂模板数组
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media 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_lpfnNew 和 m_lpfnInit)使用以下类型定义:
typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);
typedef void (CALLBACK *LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid);
第一个是 组件的实例化函数。 第二个是可选的初始化函数。 如果提供初始化函数,则会从 DLL 入口点函数内部调用它。 (本文稍后将讨论 DLL 入口点函数。)
假设要创建一个 DLL,其中包含继承自 CUnknown 的名为 CMyComponent 的组件。 必须在 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_Templates 和 g_cTemplates 是类工厂期望查找的全局变量,因此它们必须正好具有这些名称。
相关主题