如何获得具有已知类ID的设备名字对象?

时间:2010-02-28 17:31:11

标签: c# directshow moniker

我使用的是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?

1 个答案:

答案 0 :(得分:1)

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

话虽如此,AddSourceFilterForMoniker方法也没有什么不同,因为你没有为名字对象传递绑定上下文。