我想获取 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}"
。
问题是,与“Video Renderer”不同,VMR-7 没有分配到任何类别。在 Windows XP 上,CLSID_VideoMixingRenderer 仅作为单独的键存在于注册表中,它既不是 CLSID_LegacyAmFilterCategory 的子键,也不包含在作为 CLSID_ActiveMovieCategories 子键的任何类别中,也不包含在我能想到的任何其他类别中,也不是链接到注册表中的任何其他 CLSID。系统设备枚举器从不返回 VMR-7 的任何名字对象。过滤器本身存在并且有效(实际上,它是 Windows XP 下的主要视频渲染器)。我可以用
CoCreateInstance (CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**) &VMR7IBaseFilterPointer);
将 VMR-7 添加到 filtergraph。但是,如果我无法获得它的绰号,我该如何获得它的显示名称呢?我试图让 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 接口?