激活对象

激活对象是一个帮助程序对象,用于创建另一个对象,有点类似于类工厂。 激活对象公开 IMFActivate 接口。

激活对象允许您延迟目标对象的创建,因为您可以保留 IMFActivate 指针而不创建目标对象。 激活对象也可以序列化,从而用于在另一个进程中创建目标对象。 例如,激活对象用于将管道组件从应用程序进程封送到受保护媒体路径 (PMP) 进程。 某些返回 IMFActivate 指针列表的枚举函数也使用激活对象。 在创建目标对象之前,应用程序可以通过检查激活对象的属性来获取有关该对象的信息。

若要从激活对象创建目标对象,请调用 IMFActivate::ActivateObject 方法。 使用创建的对象完成调用后,调用方必须调用 IMFActivate::ShutdownObject 。 通常,应用程序创建激活对象,媒体会话调用 ActivateObject。 在这种情况下,媒体会话(而不是应用程序)必须调用 ShutdownObject。 在其他情况下,应用程序从媒体会话接收 IMFActivate 指针,应用程序调用 ActivateObjectShutdownObject。 (例如,请参阅 如何播放受保护的媒体文件。)

激活对象可以具有属性, IMFActivate 接口继承 IMFAttributes 接口。 某些激活对象使用属性来配置创建的对象。 每个对象支持的特定属性记录在该激活对象的创建函数的引用中。 使用从函数接收的 IMFActivate 指针设置属性。

对于受保护的播放,激活对象被封送到 PMP 进程。 若要支持封送处理,激活对象必须公开 IPersistStream 接口。 此外,如果 PMP 在受保护的进程中运行,则激活对象和创建的对象必须是受信任的组件。 在未受保护的进程中加载 PMP 时,这不是必需的。

若要在 PMP 进程中使用自定义管道对象 ((例如媒体接收器) ),必须为管道对象实现激活对象:

  • 激活对象必须公开 IMFActivateIPersistStream
  • 激活对象的 IPersist::GetClassID 方法必须返回激活对象的 CLSID。
  • (可选)可以实现 IPersistStream::SaveIPersistStream::Load 方法,以封送配置激活对象所需的任何数据。

当媒体会话在 PMP 进程内加载拓扑时,它会调用 CoCreateInstance 来创建激活对象的新实例。 然后调用 IMFActivate::ActivateObject 来创建管道对象。

媒体基础平台 API

IMFActivate