如何从C+封送wchar_t*+;是否将C#作为输出参数或返回值?

如何从C+封送wchar_t*+;是否将C#作为输出参数或返回值?,c#,.net,c++,interop,marshalling,C#,.net,C++,Interop,Marshalling,我已经尝试了很多方法,但都没有成功。有人有正确的例子吗?我只想将wchar\u t*值从函数移到C级。这并不像你想象的那么难。。。什么是wchar\u t*?该类型通常表示什么值?一串。它相当于在windows.h中定义的LPWSTR类型 因此,将其封送为字符串类型。但是,由于它是out参数(或返回值),因此需要在C#end上使用,而不是字符串类型 p/Invoke语法如下所示: [DllImport("MyLib.dll")] public static extern void MyFunct

我已经尝试了很多方法,但都没有成功。有人有正确的例子吗?我只想将
wchar\u t*
值从函数移到C级。

这并不像你想象的那么难。。。什么是
wchar\u t*
?该类型通常表示什么值?一串。它相当于在
windows.h
中定义的
LPWSTR
类型

因此,将其封送为
字符串
类型。但是,由于它是
out
参数(或返回值),因此需要在C#end上使用,而不是
字符串
类型

p/Invoke语法如下所示:

[DllImport("MyLib.dll")]
public static extern void MyFunction(StringBuilder str);
要使用它,首先声明具有适当容量的
StringBuiler
类的实例,然后调用函数:

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

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

A
wchar\u t*
out参数具有原始类型
wchar\u t**
。在你的答案中使用的调用方分配方法更好,但它与问题不匹配(通常这些问题是在无法更改C++代码时出现的)。这个问题确实没有足够的信息,但我想我还是要试着回答它。人们通常会忽略我的评论请求以获取更多信息。由于这正是您对函数所做的(使用
LPTSTR
作为out参数),我不确定为什么它在这里不起作用。
GetWindowText
的原始类型是
LPTSTR
,这使它成为
TCHAR
类型的“out”参数,至少根据COM命名约定是这样。这可能是OP使用的,也可能不是。@Ben:据我所知,
LPTSTR
类型定义为
LPWSTR
,类型定义为
WCHAR*
,类型定义为
WCHAR\u t*
。恐怕我不明白有什么区别。你是说在确定原始类型时,预定义的Windows数据类型有一个特殊的例外吗?没有特殊的例外,“输出参数”的“原始类型”比“参数类型”有一个更高级别的间接寻址。这是不明确的。您需要发布C++函数声明并描述如何使用该参数。