类工厂和工厂模板

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 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(也称为 工厂模板)进行专用化。 每个类工厂都有一个指向工厂模板的指针。 工厂模板包含有关特定组件的信息,例如组件的类标识符 (CLSID) ,以及指向创建组件的函数的指针。

DLL 声明工厂模板的全局数组,DLL 中的每个组件对应一个。 当 DllGetClassObject 创建一个新的类工厂时,它会在数组中搜索具有匹配 CLSID 的模板。 假设找到一个,它会创建一个类工厂,其中包含指向匹配模板的指针。 当客户端调用 IClassFactory::CreateInstance 时,类工厂将调用模板中定义的实例化函数。

下图显示了方法调用的序列。

dll 中的类工厂模板

此体系结构的优点是,只需定义一些特定于组件的内容,例如实例化函数,而无需实现整个类工厂。

如何创建 DirectShow 筛选器 DLL