【发布时间】:2011-08-30 15:49:59
【问题描述】:
我尝试了很多方法来做到这一点,但都没有奏效。有人对此有正确的例子吗?我只想将wchar_t* 值从函数移动到 C# 级别。
【问题讨论】:
-
那是模棱两可的。您需要发布 C++ 函数声明并描述参数的使用方式。
标签: c# .net c++ interop marshalling
我尝试了很多方法来做到这一点,但都没有奏效。有人对此有正确的例子吗?我只想将wchar_t* 值从函数移动到 C# 级别。
【问题讨论】:
标签: c# .net c++ interop marshalling
这并不像你想象的那么难……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++ 代码必须释放字符串以防止内存泄漏。它是唯一一个可以访问分配字符串的非托管内存区域。
【讨论】:
wchar_t* out 参数具有原始类型 wchar_t**。您的答案中使用的调用者分配方法更好,但它与问题不匹配(通常在无法更改 C++ 代码时出现这些问题)。
GetWindowText 之类的函数所做的(以 LPTSTR 作为输出参数),我不确定为什么它在这里不起作用。
GetWindowText 的原始类型是LPTSTR,这使它成为TCHAR 类型的“out”参数,至少根据 COM 命名约定。 OP 可能需要或不需要使用哪个。
LPTSTR 的类型定义为LPWSTR,它的类型定义为WCHAR*,它的类型定义为wchar_t*。恐怕我不明白有什么区别。您是说在确定原始类型时预定义的 Windows 数据类型有一个特殊的例外吗?