У меня есть приложение 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 в Func1 () C ++, все работает нормально.И в окне памяти 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, я смогу получить правильную повторную строку в коде C #:
ret2 = L"1?2?3?4?5";
Но когда я возвращаю ret2 в DLL C ++, возвращаемая строка ret inC # кажется поврежден.Двоичные файлы в C ++ DLL, на мой взгляд, являются правильными Unicode.Но двоичные файлы в коде 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.
Есть идеи?Спасибо заранее.