Строка, возвращаемая C ++ dll, повреждена в вызывающей программе C #, почему?

У меня есть приложение C #, которое вызывает C ++ DLL.

В C # у меня есть следующий код:

[DllImport(@"111.dll", CharSet = CharSet.Unicode)]
public extern static String Func1(String arg);
......
String arg = "test text";
String retstring = Func1(arg);

В CPP у меня есть функция, определенная следующим образом :

extern "C"
{
__declspec(dllexport) LPWSTR Func1(LPWSTR arg)
{
          ....
          LPWSTR ret1 = L"1?2?3?4?5";
          LPWSTR ret2 = SomeActualFunction(arg);
          retturn ret1; // return ret2;
     }
}

Если я верну ret1 в C ++ Func1 (), все будет работать нормально. И в окне памяти VS2008 я вижу правильные двоичные файлы Unicode. В C ++ двоичные файлы ret1 имеют вид

"31 00 3f 00 32 00 3f 00 33 00 3f 00 34 00 3f 00 35 00"

, а в C # двоичные файлы retstring имеют вид

"28 67 a3 f7 fe 07 00 00 0a 00 00 00 09 00 00 00 31 00 3f 00 32 00 3f 00 33 00 3f 00 34 00 3f 00 35 00 "

. Я думаю, что двоичные файлы C #

«28 67 a3 f7 fe 07 00 00 0a 00 00 00 09 00 00 00»

являются заголовком типа System.String.

Более того, если я добавлю следующую строку непосредственно перед возвратом в код CPP я также могу получить правильную строку ret в коде C #:

ret2 = L"1?2?3?4?5";

Но когда я возвращаю ret2 в C ++ DLL, возвращаемая строка ret в C # кажется поврежденной. На мой взгляд, двоичные файлы в C ++ DLL являются правильным Unicode. Но двоичные файлы retstring в коде C # таковы

«28 67 a3 f7 fe 07 00 00 0a 00 00 00 09 00 00 00 dd dd dd dd dd dd dd dd dd dd dd dd ....».

Я могу только заметить, что ret2 длиннее, чем ret1 - ret2 имеет несколько сотен WCHAR.

Есть идеи? Спасибо заранее.

6
задан McArthor Lee 15 June 2011 в 07:32
поделиться