【问题标题】:List of all categories of filters and hardware devices under WindowsWindows下所有类别的过滤器和硬件设备列表
【发布时间】:2020-12-20 23:25:32
【问题描述】:

当我运行时(在 C++ 中) CoCreateInstance (CLSID_SystemDeviceEnum [...]) 进而 CreateClassEnumerator (CLSID_ActiveMovieCategories [...]), 我得到28个类别。但我知道还有更多的类别,其中一些是安装在我的系统上的,例如:

KSCATEGORY_BDA_NETWORK_PROVIDER, "BDA network provider"    {71985F4B-1CA1-11D3-9CC8-00C04F7971E0}
CLSID_VideoEffects1Category,     "Video effect (1 input)"  {CC7BFB42-F175-11D1-A392-00E0291F3959}
CLSID_MediaEncoderCategory,      "EncAPI encoder"          {7D22E920-5CA9-4787-8C2B-A6779BD11781}

我可以列出谁的成员 CreateClassEnumerator (CLSID_VideoEffects1Category [...]). 有没有办法列出系统上所有类别的过滤器和硬件设备,包括未映射到任何 DirectShow 类别的视频效果类别?

【问题讨论】:

  • “我知道还有更多类别...” - 你怎么知道?用你知道的方式列举它们。
  • 你已经有完整的枚举

标签: c++ windows filter categories directshow


【解决方案1】:

您可以按照DirectShow Filter Meta-Category 部分中的说明枚举类别:

此元类别包含过滤器类别列表。如果过滤器类别未出现在此列表中,过滤器映射器将忽略该类别,这意味着该过滤器不适用于 Intelligent Connect。

要枚举过滤器类别列表,请调用 ICreateDevEnum::CreateClassEnumerator 并使用值 CLSID_ActiveMovieCategories。此方法返回的名字对象支持以下属性。

这也列举了第三方创建的类别。

GraphStudioNextanswer to your previous question源代码中提到:

一般不推荐,但你也可以从注册表中读取类别,在HKCR\CLSID\<GUID of CLSID_ActiveMovieCategories>\Instance键下。

【讨论】:

  • 您的问题在“所有类别”部分没有意义。首先没有所有类别。 “如果第三方应用程序创建了自定义类别并安装了”部分特别包含在文档化 API 中,如上述答案的正文所涵盖。
  • 枚举 API 采用附加类别 GUID 的事实并不意味着它们是任何枚举的一部分。具体来说,您提到的那些类别现在已明确标记为 API 的已弃用部分,并已从 Windows SDK 中删除。 DirectShow 公开它们以保持与遗留应用程序(使用 DES)的运行时兼容性。不必定义一个方法来列出它们。
  • API 接受并可能显示某些项目的 GUID 属于这两种类型:1 由 API 运行时显式处理,以无意中公开具有特殊定义含义的项目(DES 案例)2由于与其他 API 的共同表面而可用,并且通过这种方式,通过 DirectShow API 拾取非 DirectShow 项目。在这两种情况下,类别本身都不会被包含在某种综合注册表中。
猜你喜欢
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多