类工厂和工厂模板

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

本主题介绍如何使用 DirectShow 基类实现 DirectShow 筛选器的 DLL。

在客户端创建 COM 对象的实例之前,它使用对 CoGetClassObject 函数的调用创建对象的类工厂的实例。 然后,客户端调用类工厂的 IClassFactory::CreateInstance 方法。 它是实际创建组件的类工厂,并返回指向所请求接口的指针。 (CoCreateInstance 函数在函数调用中合并这些步骤。

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

方法调用来创建类工厂

CoGetClassObject 调用 dll 中定义的 DllGetClassObject 函数。 此函数创建类工厂,并返回指向类工厂上的接口的指针。 DirectShow 为你实现 DllGetClassObject,但该函数以特定方式依赖于代码。 若要了解其工作原理,必须了解 DirectShow 如何实现类工厂。

类工厂是专用于创建另一个 COM 对象的 COM 对象。 每个类工厂都有它创建的一种类型的对象。 在 DirectShow 中,每个类工厂都是同一C++类的实例,CClassFactory。 类工厂是专用于另一类,CFactoryTemplate,也称为 工厂模板。 每个类工厂保存指向工厂模板的指针。 工厂模板包含有关特定组件的信息,例如组件的类标识符(CLSID),以及指向创建组件的函数的指针。

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

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

dll类工厂模板

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

如何创建 DirectShow 筛选器 DLL