问题描述
我想获取 VMR-7 过滤器的显示名称 (CLSID_VideoMixingRenderer,{B87BEB7B-8D29-423f-AE4D-6582C10175AC}).
通常,我会使用 CoCreateInstance (CLSID_SystemDeviceEnum) + CreateClassEnumerator (CLSID_ActiveMovieCategories)
,然后使用名字对象枚举来查找过滤器的名字对象并使用名字对象的 GetDisplayName 方法。例如,在“视频渲染器”( CLSID_VideoRenderer,{70E102B0-5556-11CE-97C0-00AA0055595A})
的情况下,这有效--它返回显示名称 "@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\{70E102B0-5556-11CE-97C0-00AA0055595A}"
。
问题是,与“视频渲染器”不同,VMR-7 没有被分配到任何类别。在 Windows XP 上,CLSID_VideoMixingRenderer 仅作为单独的键存在于注册表中,既不是 CLSID_LegacyAmFilterCategory 的子键,也不包含在作为 CLSID_ActiveMovieCategories 子键的任何类别中,也不包含在我能想到的任何其他类别中,也不是链接到注册表中的任何其他 CLSID。 System Device Enumerator 永远不会为 VMR-7 返回任何名字。
过滤器本身存在并起作用(实际上,它是 Windows XP 下的主要视频渲染器)。我可以使用
CoCreateInstance (CLSID_VideoMixingRenderer,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**) &VMR7IBaseFilterPointer);
将 VMR-7 添加到过滤器图中。 但是如果我不能为它获得一个绰号,我怎么能得到它的显示名称呢?我试图通过 VMR-7 的绰号
hr = VMR7IBaseFilterPointer -> QueryInterface (IID_IMoniker,(void**) &pim);
和
hr = VMR7IBaseFilterPointer -> QueryInterface (IID_IUnknown,(void**) &punk);
hr = punk -> QueryInterface (IID_IMoniker,(void**) &pim);,
但得到“无接口”作为响应,好像没有实现 IMoniker 接口。 另一个问题是,允许名字对象的过滤器不是也应该提供 IMoniker 接口吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)