激活对象

激活对象 是一个帮助程序对象,用于创建另一个对象,有点类似于类工厂。 激活对象公开 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