2013-05-15 111 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#中運行。

相關問題