1

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

4

1 回答 1

1

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

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

于 2010-02-28T18:15:50.960 回答