我正在使用 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?