【问题标题】:Return a string from a C# method to a C++ function in an output argument在输出参数中将字符串从 C# 方法返回到 C++ 函数
【发布时间】:2015-01-21 17:45:12
【问题描述】:

我正在从 C++ 函数调用 C# 方法。

C# 方法应该执行以下操作:

  • 分配一个BSTR 并在输出参数中将其返回给 C++ 函数
  • 通过堆栈将HRESULT返回给C++函数(通过返回值)

我已经实现了如下的C#方法:

int Method(out IntPtr output)
{
    int status = 0;
    ...
    output = Marshal.StringToBSTR(someString);
    ...
    return status;
}

问题:

  • 我应该在 C++ 中使用什么变体类型,它对应于 C# 中的 out IntPtr 类型?
  • 为了返回 BSTR,我应该使用 C# 中的其他类型吗?
  • 如果是,那么它是什么 C# 类型,对应的 C++ 变体类型是什么?

我尝试了here 列出的几种变体类型,但它们似乎都不起作用。

【问题讨论】:

  • C++ 代码是否使用 C# DLL 作为 COM 组件?还是您正在编写 C++/CLI?
  • @Matt:第一个选项。

标签: c# c++ marshalling com-interop variant


【解决方案1】:

您使用COM Callable Wrapper 来回答您的问题:

  1. C# out IntPtr 映射到COM data types 中的void**

  2. 默认情况下,C#字符串类型在COM中被编组为BSTR类型,请检查Default Marshaling for Strings,所以你可以在C#中使用字符串

  3. BSTR 的变体类型是 VT_BSTR,但如果您只处理字符串,则可以只使用 BSTR,您不需要使用变体类型。

【讨论】:

  • 但我没有将 BSTR 传递给 C# 方法。我正在传递BSTR*,C# 方法应该将新分配的BSTR 的地址写入其中。所以我不能为此目的使用VT_BSTR
  • 但是你把 Intptr 传出去,它变成了 void** 。
  • 在 C# 方面,我期待 out IntPtr(除非您有更好的建议)。调用此方法时,我应该在 C++ 端使用什么 VT
  • 为什么要将 C# 的 BSTR 类型传递给 COM?
  • 我需要 C# 方法来分配一些带有信息的字符串并将其返回给我。这就是为什么我想将 BSTR* 传递给它。顺便说一句,您在第二个项目符号中提到的那个链接表明 BSTR* 的相应 C# 类型是 System.String。这很好,我喜欢。但我假设我应该在 C# 方法中声明out String,对吧?也许我应该使用VT_BSTR | VT_BYREF?可惜链接中的表格没有VT 列。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 2018-03-14
  • 2014-11-06
  • 2013-03-25
  • 2021-05-12
相关资源
最近更新 更多