【问题标题】:How to get device moniker with a known class id?如何获取具有已知类 ID 的设备名字对象?
【发布时间】:2011-01-22 01:15:55
【问题描述】:

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

【问题讨论】:

    标签: c# directshow moniker


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 2013-08-11
      • 2022-10-25
      • 2021-02-24
      • 1970-01-01
      • 2018-07-04
      相关资源
      最近更新 更多