【问题标题】:How do I marshal wchar_t* from C++ to C# as an out parameter or return value?如何将 wchar_t* 从 C++ 编组为 C# 作为输出参数或返回值?
【发布时间】:2011-08-30 15:49:59
【问题描述】:

我尝试了很多方法来做到这一点,但都没有奏效。有人对此有正确的例子吗?我只想将wchar_t* 值从函数移动到 C# 级别。

【问题讨论】:

  • 那是模棱两可的。您需要发布 C++ 函数声明并描述参数的使用方式。

标签: c# .net c++ interop marshalling


【解决方案1】:

这并不像你想象的那么难……wchar_t* 是什么?该类型通常代表什么价值?一个字符串。它等效于windows.h 中定义的LPWSTR 类型。

因此,您将其编组为 string 类型。但是,由于它是 out 参数(或返回值),因此您需要在 C# 端使用 StringBuilder class,而不是 string 类型。

P/Invoke 语法如下所示:

[DllImport("MyLib.dll")]
public static extern void MyFunction(StringBuilder str);

要使用它,首先要声明一个具有适当容量的StringBuiler 类的实例,然后调用该函数:

StringBuilder myString = new StringBuilder(255);
MyFunction(myString);

请记住,非托管 C++ 代码必须释放字符串以防止内存泄漏。它是唯一一个可以访问分配字符串的非托管内存区域。

【讨论】:

  • A wchar_t* out 参数具有原始类型 wchar_t**。您的答案中使用的调用者分配方法更好,但它与问题不匹配(通常在无法更改 C++ 代码时出现这些问题)。
  • @Ben:是的,我想你是对的。这个问题确实没有足够的信息,但我想我还是会尝试回答。人们通常会忽略我的评论请求以获取更多信息。而且由于这正是您为 GetWindowText 之类的函数所做的(以 LPTSTR 作为输出参数),我不确定为什么它在这里不起作用。
  • GetWindowText 的原始类型是LPTSTR,这使它成为TCHAR 类型的“out”参数,至少根据 COM 命名约定。 OP 可能需要或不需要使用哪个。
  • @Ben:据我所知,LPTSTR 的类型定义为LPWSTR,它的类型定义为WCHAR*,它的类型定义为wchar_t*。恐怕我不明白有什么区别。您是说在确定原始类型时预定义的 Windows 数据类型有一个特殊的例外吗?
  • 无特殊例外,“out 参数”的“原始类型”比“参数类型”多了一层间接性。
猜你喜欢
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
相关资源
最近更新 更多