问题描述
当我运行时(在 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 类别的视频效果类别?
解决方法
您可以枚举类别,如 DirectShow Filter Meta-Category 部分所述:
此元类别包含过滤器类别列表。如果过滤器类别未出现在此列表中,过滤器映射器将忽略该类别,这意味着该过滤器不可用于 Intelligent Connect。
要枚举过滤器类别列表,请使用值 ICreateDevEnum::CreateClassEnumerator
调用 CLSID_ActiveMovieCategories
。此方法返回的名字对象支持以下属性。
这也枚举了第三方创建的类别。
如 answer to your previous question 的 GraphStudioNext 源代码中所述:
通常不推荐这样做,但您也可以从注册表中的 HKCR\CLSID\<GUID of CLSID_ActiveMovieCategories>\Instance
键下读取类别。