激活对象
激活对象是一个帮助程序对象,用于创建另一个对象,有点类似于类工厂。 激活对象公开 IMFActivate 接口。
激活对象允许您延迟目标对象的创建,因为您可以保留 IMFActivate 指针而不创建目标对象。 激活对象也可以序列化,从而用于在另一个进程中创建目标对象。 例如,激活对象用于将管道组件从应用程序进程封送到受保护媒体路径 (PMP) 进程。 某些返回 IMFActivate 指针列表的枚举函数也使用激活对象。 在创建目标对象之前,应用程序可以通过检查激活对象的属性来获取有关该对象的信息。
若要从激活对象创建目标对象,请调用 IMFActivate::ActivateObject 方法。 使用创建的对象完成调用后,调用方必须调用 IMFActivate::ShutdownObject 。 通常,应用程序创建激活对象,媒体会话调用 ActivateObject。 在这种情况下,媒体会话(而不是应用程序)必须调用 ShutdownObject。 在其他情况下,应用程序从媒体会话接收 IMFActivate 指针,应用程序调用 ActivateObject 和 ShutdownObject。 (例如,请参阅 如何播放受保护的媒体文件。)
激活对象可以具有属性, IMFActivate 接口继承 IMFAttributes 接口。 某些激活对象使用属性来配置创建的对象。 每个对象支持的特定属性记录在该激活对象的创建函数的引用中。 使用从函数接收的 IMFActivate 指针设置属性。
对于受保护的播放,激活对象被封送到 PMP 进程。 若要支持封送处理,激活对象必须公开 IPersistStream 接口。 此外,如果 PMP 在受保护的进程中运行,则激活对象和创建的对象必须是受信任的组件。 在未受保护的进程中加载 PMP 时,这不是必需的。
若要在 PMP 进程中使用自定义管道对象 ((例如媒体接收器) ),必须为管道对象实现激活对象:
- 激活对象必须公开 IMFActivate 和 IPersistStream。
- 激活对象的 IPersist::GetClassID 方法必须返回激活对象的 CLSID。
- (可选)可以实现 IPersistStream::Save 和 IPersistStream::Load 方法,以封送配置激活对象所需的任何数据。
当媒体会话在 PMP 进程内加载拓扑时,它会调用 CoCreateInstance 来创建激活对象的新实例。 然后调用 IMFActivate::ActivateObject 来创建管道对象。
相关主题