【问题标题】:How to pass COM array to managed code?如何将 COM 数组传递给托管代码?
【发布时间】:2011-07-31 12:48:22
【问题描述】:

我有一个使用 COM 对象(用 C++ 制作)的 .Net 应用程序(特别是 VB,尽管我希望它尽可能与语言无关)。

我需要在 COM 中实现一个将 char 数组从 C++ 传递到 .Net 的事件。我想我需要将数组转换为托管数组; 我该怎么做?

【问题讨论】:

    标签: .net c++ vb.net com interop


    【解决方案1】:

    你没有提到使用的框架。基本上,它会归结为 MFC 或 ATL;使用更高版本的 MFC 你可以混搭,所以我推荐 Atl。

    查看Atl's CComSafeArray 用于此目的的类模板。你会想要的

    但是,如果这真的是文本,请考虑使用_bstr_t 来包装字符串(这样可以轻松地进行编码转换,无需太多努力)。 [1]


    [1] 这些天也有CComBstr,但我个人从很久以前就开始使用 _bstr_t 并且由于与 BSTR 之间的转换而获得了丰富的经验,例如

    【讨论】:

    • 感谢您的评论!有没有办法将指向数据的指针传递给.Net并将其转换为托管数组?我不是很喜欢 Safe 数组(虽然我不知道 CComSafeArary)。它不是文本,而是大量数据(视频),所以我想尽可能避免开销。
    • 如果你使用 STL 向量,你可以; IIRC 有与它们一起使用的 ATL 适配器(但已经很长时间了)
    • 非常感谢,嘿嘿。我会尽快看看这个!
    【解决方案2】:

    这就是我要找的东西:

    Private Sub ComEventHandler(ByVal dataPtr As Integer, ByVal size As Integer) Handles myComObject.OnEvent
        Dim managedData(0 To size - 1) As Byte
        Dim data As IntPtr = dataPtr
    
        If (size = 0) Then
            Marshal.Copy(data, managedData, 0, size)
            ...
        End If
        ...
    End Sub
    

    COM 事件按原样传递 char 数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多