wchar_t* C++ => string c#??
От: Lepsik Индия figvam.ca
Дата: 08.07.16 21:09
Оценка:
wchar_t* NTAPI TestUnicode()
{
    return L"<\xD1\xD1\xD1\xD0\xAE\xA9>\0\0";  //CCCP
}


        [DllImport("unittest.dll", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr TestUnicode();        //


        protected bool foo()
        {
            IntPtr ptrUserList = TestUnicode();
            string userList = Marshal.PtrToStringUni(ptrUserList);
    }



Вместо СССP вижу кракозябли? В чем проблема?
c++ c#
Re: wchar_t* C++ => string c#??
От: const_volatile  
Дата: 08.07.16 23:48
Оценка: +2 :))
Здравствуйте, Lepsik, Вы писали:

L>
L>wchar_t* NTAPI TestUnicode()
L>{
L>    return L"<\xD1\xD1\xD1\xD0\xAE\xA9>\0\0";  //CCCP
L>}

L>


L>Вместо СССP вижу кракозябли? В чем проблема?


очевидно, потому что у тебя кракозябли в строке.

строка L"\xD1\xD1\xD1\xD0\xAE\xA9" состоит из 6 символов с уникодами
0x00D1, 0x00D1, 0x00D1, 0x00D0, 0x00AE, 0x00A9 соответственно, т.е. "ÑÑÑЮ©". с чего ты взял, что этот бессмысленный набор символов должен означать "СССР"? уникоды букв "С" и "Р" — 0x0421 и 0x420, их и надо было прописывать.
Re[2]: wchar_t* C++ => string c#??
От: Lepsik Индия figvam.ca
Дата: 11.07.16 14:13
Оценка:
_>очевидно, потому что у тебя кракозябли в строке.

_>строка L"\xD1\xD1\xD1\xD0\xAE\xA9" состоит из 6 символов с уникодами

_>0x00D1, 0x00D1, 0x00D1, 0x00D0, 0x00AE, 0x00A9 соответственно, т.е. "ÑÑÑЮ©". с чего ты взял, что этот бессмысленный набор символов должен означать "СССР"? уникоды букв "С" и "Р" — 0x0421 и 0x420, их и надо было прописывать.

Ничего не изменилось



wchar_t* NTAPI TestUnicode()
{
    wchar_t test[] = L"<\x0421\x0421\x0421\x0420\x00AE\x00A9>\0\0";
    wchar_t* return_value = NULL;
    return_value = (wchar_t*)allocate_buffer(_countof(test) * sizeof(wchar_t));
    wcscpy_s(return_value, _countof(test), test);
    return return_value;
}
Re: wchar_t* C++ => string c#??
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.07.16 14:44
Оценка:
Здравствуйте, Lepsik, Вы писали:


L>[ccode]

L>wchar_t* NTAPI TestUnicode()
L>{
L> return L"<\xD1\xD1\xD1\xD0\xAE\xA9>\0\0"; //CCCP
L>}
А нельзя попроще

return L"CCCP"; //CCCP

Только вот строка прекратит существование после выхода из процедуры.
Проще создать статическую переменную wstring присвоить ей значение и передать c_str().
Прошу прощения если что. С++ изучаю 2 недели.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 11.07.2016 14:47 Serginio1 . Предыдущая версия .
Re: wchar_t* C++ => string c#??
От: α Российская Империя  
Дата: 11.07.16 15:10
Оценка: +1
Здравствуйте, Lepsik, Вы писали:

L>Вместо СССP вижу кракозябли? В чем проблема?


Во-первых, как уже сказали проблема с юникодом в L

Во-вторых, к черту IntPtr:
[DllImport("unittest.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static extern string TestUnicode();

В-третьих, память кто-то должен выделять и кто-то освобождать:
return SysAllocString(L"СССР");
Отредактировано 11.07.2016 15:15 α . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.