C# 如何获取具有已知类id的设备名字对象?

C# 如何获取具有已知类id的设备名字对象?,c#,directshow,moniker,C#,Directshow,Moniker,我使用的是DirectShowLib,它是DirectShow的薄包装。 我已成功枚举BDA设备并收集它们的CLSID。现在,当用户按名称选择一个设备并且我知道所选的CLSID时,我需要将这个设备添加到我的过滤器图中 我做了以下工作: Type type = Type.GetTypeFromCLSID(classid); object device = Activator.CreateInstance(type); int hr = graphBuilder.AddSourceFilterFo

我使用的是DirectShowLib,它是DirectShow的薄包装。 我已成功枚举BDA设备并收集它们的CLSID。现在,当用户按名称选择一个设备并且我知道所选的CLSID时,我需要将这个设备添加到我的过滤器图中

我做了以下工作:

Type type = Type.GetTypeFromCLSID(classid);
object device = Activator.CreateInstance(type);
int hr = graphBuilder.AddSourceFilterForMoniker(
    device, null, filtername, out receivedFilter);
现在的问题是-我在这个装置中得到了什么样的物体?调试器显示它是有效的Com对象。如果我尝试将其强制转换为IBaseFilter,我会得到一个异常“不支持这样的接口”。我可以成功地将它投给IMoniker。但是如果我试着做以下事情:

Type type = Type.GetTypeFromCLSID(classid);
object device = Activator.CreateInstance(type);
int hr = graphBuilder.AddSourceFilterForMoniker(
    device, null, filtername, out receivedFilter);
我得到一个错误:

HRESULT: 0x800401e4 (2147746276)
Name: MK_E_SYNTAX
我知道,如果我在枚举之后立即使用addSourceFilterPerformoniker方法,那么该方法可以很好地工作,因此我似乎没有正确地创建名字对象


如果类id已知,那么创建名字对象的正确方法是什么,这样我就可以将其传递给AddSourceFilterPerformoniker?

只是猜测一下,但您似乎没有创建实现。我所看到的所有涉及名字对象的操作都需要传递IBindCtx实现,以便为涉及名字对象的操作提供上下文


也就是说,该方法没有什么不同,因为您没有为名字对象传递绑定上下文。

只是猜测,但似乎您没有创建实现。我所看到的所有涉及名字对象的操作都需要传递IBindCtx实现,以便为涉及名字对象的操作提供上下文

也就是说,该方法没有什么不同,因为您没有为名字对象传递绑定上下文