如何获取具有已知类 ID 的设备名字?
我正在使用 DirectShowLib,它是 DirectShow 的薄包装。 我已成功枚举 BDA 设备并收集其 CLSID。现在,当用户按名称选择设备并且我知道所选的 CLSID 时,我需要将此设备添加到我的过滤器图表中。
我做了以下事情:
Type type = Type.GetTypeFromCLSID(classid);
object device = Activator.CreateInstance(type);
现在的问题是 - 我在设备中得到了什么样的对象?调试器显示它是一个有效的 Com 对象。如果我尝试将其转换为 IBaseFilter,则会收到异常“不支持此类接口”。我可以成功将其投射到 IMoniker。但是,如果我尝试执行以下操作:
int hr = graphBuilder.AddSourceFilterForMoniker(
device, null, filtername, out receivedFilter);
我收到错误:
HRESULT: 0x800401e4 (2147746276)
Name: MK_E_SYNTAX
我知道如果我在枚举后立即使用方法 AddSourceFilterForMoniker 则可以正常工作,所以看来我只是没有正确创建名字对象。
如果类 id 已知,那么创建名字对象的正确方法是什么,以便我可以将其传递给 AddSourceFilterForMoniker?
I am using a DirectShowLib which is a thin wrapper for DirectShow.
I have successfully enumerated BDA devices and collected their CLSIDs. Now when user selects a device by name and I know the chosen CLSID, I need to add this device to my filter graph.
I did the following:
Type type = Type.GetTypeFromCLSID(classid);
object device = Activator.CreateInstance(type);
Now the question is - what kind of object I got here in device? Debugger shows that it is a valid Com object. If I try to cast it to IBaseFilter, I get an exception "No such interface supported". I can cast it to IMoniker successfully. But then if I try to do the following:
int hr = graphBuilder.AddSourceFilterForMoniker(
device, null, filtername, out receivedFilter);
I get an error:
HRESULT: 0x800401e4 (2147746276)
Name: MK_E_SYNTAX
I know that the method AddSourceFilterForMoniker works fine if I use it right after enumeration, so it seems I just do not create the moniker right.
What is the right way to create moniker object if class id is known, so I can pass it to the AddSourceFilterForMoniker?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
只是猜测,但您似乎没有创建 IBindCtx实施。我所涉及的所有涉及 IMoniker 的操作可见,需要传递 IBindCtx 实现,以便为涉及名字的操作提供上下文。
话虽这么说, AddSourceFilterForMoniker 方法不是不同的是,您没有传递名字的绑定上下文。
Just a guess, but it appears you are not creating an IBindCtx implementation. All operations that involve IMoniker that I've seen require a IBindCtx implementation to be passed in order to provide context for operations involving the moniker.
That being said, the AddSourceFilterForMoniker method is no different, in that you aren't passing a bind context for the moniker.