1

我想获取 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 接口?

4

1 回答 1

0

DirectShow 过滤器是一个 COM 对象,不需要或假设实现任何自描述接口。没有附加、承诺或记录显示名称,因此您没有检索它的方法。

DisplayName 是一个与注册信息相关联的字符串,如果没有像您提到的示例中那样注册过滤器,则首先没有 DisplayName。

Moniker 是实例化过滤器的“快捷方式”。一旦你有了一个实例,游戏中就没有更多的名字了。

在这种情况下,您可以做的最好的事情是尝试为您所持有的实例恢复 CLSID(例如,请参阅Getting GUID of coclass object using pointer to interface it implements),然后在注册表中查找 COM 类描述(也是可选的,但在大多数情况下都存在)。

于 2021-01-12T09:26:06.950 回答