2013-05-15 88 views
1

我想从C++传递字符串到c#。从C++传递字符串到c#

C++: 
extern "C" __declspec(dllexport) void GetSurfaceName(wchar_t* o_name); 

void GetSurfaceName(wchar_t* o_name) 
{ 
    swprintf(o_name, 20, L"Surface name"); 
} 

C#: 
[DllImport("SurfaceReader.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern void GetSurfaceName(StringBuilder o_name); 

StringBuilder name = new StringBuilder(20); 
GetSurfaceName(name); 

但只传递第一个符号:name [0] =='S'。其他符号是空值。你能告诉我这里有什么问题吗?

感谢, 振亚

回答

2

您忘记告诉pinvoke编组人员该函数正在使用Unicode字符串。默认值是CharSet.Ansi,你需要明确地使用CharSet.Unicode。修复:

[DllImport("SurfaceReader.dll", 
      CallingConvention = CallingConvention.Cdecl, 
      CharSet = CharSet.Unicode)] 
private static extern void GetSurfaceName(StringBuilder o_name); 

你会得到一个“S”,因为现在的“S”的UTF-16编码值看起来像一个C字符串有一个字符。

一般避免使用像“20”这样的幻数。只需添加一个说明字符串缓冲区有多长的参数。这样你就会从来没有意外损坏GC堆。传递StringBuilder.Capacity。并给这个函数一个可以指示成功的返回值,所以你也不会忽略一个太小的缓冲区。

+0

感谢您的详细解答! – Zheden

0

我不知道,但不是使用StringBuilder的,我想从C#字符(WCHAR)数组传递到C++,填充它,然后用这个数组在C#中运行。

相关问题