2012-04-17 88 views
1

我有一个自定义的源过滤器,通过执行dshow基类中的CSourceCSourceStream。它使用IFilterMapper2::RegisterFilter方法以不同名称导出多次。 现在,在我的过滤器中,我想知道(尽快)哪些已注册的过滤器实例正在被打开。 例如,假设我有一个模拟虚拟摄像头的dll。同样的dll导出过滤器的两个实例,所以在(说)Skype中,我可以选择虚拟凸轮#1虚拟凸轮#2。在我的CSourceCSourceStream的构造函数中,我想知道它是否是虚拟凸轮#1虚拟凸轮#2正在构建中。这可以做到吗?DShow源过滤器:我是哪个过滤器实例?

回答

2

有没有文件记录的方式,但有一个解决方法。由于DirectShow稳定,它应该可以很好地工作。

在您的过滤器类覆盖IPersistPropertyBag::Load和您所做的读取IPropertyBag::Read映射到注册表从HKEY_LOCAL_MACHINE\SOFTWARE\Classes...\CLSID_VideoInputDeviceCategory\Instance\<your-instance>读取。所以你可以把你需要的所有标识都放在那里,并让它可以访问。

注意这是从应用程序的BindToObject调用中调用的。

Call Stack

我这样做在通过IP摄像机的回答http://alax.info/blog/1233

+0

感谢支持虚拟视频输入,声音完美。尽管如此,我仍然遇到了一些困难。我的CSource实现类现在继承自IPersistPropertyBag,但在我的CVCam :: QueryInterface中,我注意到IPersistPropertyBag接口永远不会被请求。因此IPersistPropertyBag的方法永远不会被调用。我错过了明显的东西吗? – 2012-04-18 10:16:23

+0

我能想到的是,你不是指示支持IPersistPropertyBag(在'GetInterface'中)。 – 2012-04-18 10:57:54

+0

如果你的意思是QueryInterface,我是。 'REFIID riid'参数永远不会等于'IID_IPersistPropertyBag',无论是在我的'CSource',还是'QueryInterface'和'NonDelegatingQueryInterface'方法的'CSourceStream'。 – 2012-04-18 11:09:59