我使用的是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?
答案 0 :(得分:1)
只是一个猜测,但似乎您没有创建IBindCtx实现。我见过的涉及IMoniker的所有操作都需要传递IBindCtx实现,以便为涉及名字对象的操作提供上下文。
话虽如此,AddSourceFilterForMoniker方法也没有什么不同,因为你没有为名字对象传递绑定上下文。