【问题标题】:C# COM Interop: How to translate instructions from C++?C# COM 互操作:如何从 C++ 翻译指令?
【发布时间】:2011-04-03 02:18:41
【问题描述】:

我正在尝试将我的相机制造商针对 C++ 提供的 COM 互操作指令翻译成 C#。

他们写道:

要获取接口,您可以使用普通的 COM 函数从捕获过滤器中请求您需要的特定接口。 例如:

IBaseFilter* pSourceFilter;
...
CComQIPtr<IManufacturersInterface> pKs( pSourceFilter );
pKs->SetShutterSpeed( ssAuto1 );

它们还提供接口签名和 Guid。签名看起来像

interface IManufacturersInterface: IUnknown
{
    // more stuff
    HRESULT SetShutterSpeed( [in] eShutterSpeed lShutter );
    // more stuff
}

我把它翻译成 C#

[ComImport]
[Guid("926ddb16-3c8e-476c-9068-eb4555a99231")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IManufacturersInterface
{
    // more stuff
    [PreserveSig]
    int SetShutterSpeed([In] eShutterSpeed lShutter);
    // more stuff
}

another source 我得到了一个类似的 DirectShow 包装器来访问相机,包括一个 COM 导入接口IBaseFilter。我现在如何翻译第一个例子?

我试过了

IManufacturersInterface control = sourceFilter as IManufacturersInterface; // sourceFilter is declared as IBaseFilter
control.SetShutterSpeed(eShutterSpeed.ssAuto1);

但转换后控制为空。

对不起,如果我含糊不清,我不知道我在这里做什么。这是我第一次不得不使用 COM Interop。它显示,嗯? =)

【问题讨论】:

  • 不要使用 'as' 运算符,而是使用直接强制转换 - 它当然不会工作并给你一个例外。异常应该提供更多细节 - 我猜你正在使用的包装类不支持有问题的接口。
  • @VinayC:你是对的,谢谢!然后我会研究那个包装器。所以我猜想以“CComQIPtr”开头的那行是演员表并没有那么糟糕。 =) 也许把这个作为答案发布,所以我可以接受。
  • 您可以随时将评论标记为良好。但是,您可能需要考虑 Grzenio 的解决方案 - 它会解决您的许多问题!
  • 是的,CComQIPtr 将在分配时对 com 对象进行查询接口“转换” - 它也是一个托管对象,因此它将处理所有适当的添加/取消引用。

标签: c# c++ directshow com-interop


【解决方案1】:

进行 com 互操作的最简单方法是让 Visual Studio 为您创建互操作 - 我将它与许多不同的 com 对象一起使用,并且从未遇到任何问题。首先,在您的 C# 项目中选择 Add Reference 并选择选项卡 COM,在列表中找到相机制造商的对象,您应该完成。您现在可以像使用原生 C# 一样使用 com 对象。

【讨论】:

  • 不幸的是,它似乎没有条目。不过谢谢=)
  • 如果它没有条目,那么可能它还没有注册,你不能使用它。请确保您的相机软件已正确安装。
  • 是的,不行,他不会有这样的 COM 接口类型库。
  • @Hans Passant:您可能知道如何处理“这样的 COM 接口”的教程吗?正如 VinayC 所建议的那样,我正在寻找的接口不受支持,但我很难解决这个问题。
  • @Jens:我不知道。每个人都避免这种情况,因为它很容易出错并且难以维护。改为使用 C++/CLI 语言编写托管包装器,以便您可以使用本机 COM。
猜你喜欢
  • 2010-12-14
  • 2010-10-02
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 2010-11-20
  • 2014-09-05
  • 2014-09-03
  • 2011-07-02
相关资源
最近更新 更多