Кириллица из dll

 
Всем привет. Есть dll на C++ Visual studio 2015, возвращаю оттуда текст через массив uchar. И всё работает хорошо, но вместо русских букв символы. Как исправить? Как-то явно в dll указать кодировку? 
 
Murat Ishakov:
Всем привет. Есть dll на C++ Visual studio 2015, возвращаю оттуда текст через массив uchar. И всё работает хорошо, но вместо русских букв символы. Как исправить? Как-то явно в dll указать кодировку? 

В МТ используется Unicode. Поэтому dll также должна быть юникодной (строки std::wstring или wchar_t, а не char).

 
Ihor Herasko:

В МТ используется Unicode. Поэтому dll также должна быть юникодной (строки std::wstring или wchar_t, а не char).

Возвращаю массив uchar так как тут на форуме так видел. А можно по другому?
 
Murat Ishakov:
Возвращаю массив uchar так как тут на форуме так видел. А можно по другому?

Как получаете массив uchar в dll? Из строки какого типа? Если в dll строки wchar_t или std::wstring, то массив в MQL нужно использовать типа ushort.

Если же из многобайтной кодировки, то в самой dll сначала нужно использовать MultiByteToWideChar и получить массив wchar_t, а потом все равно передать его в MT с типом ushort.

 
Ihor Herasko:

Как получаете массив uchar в dll? Из строки какого типа? Если в dll строки wchar_t или std::wstring, то массив в MQL нужно использовать типа ushort.

Если же из многобайтной кодировки, то в самой dll сначала нужно использовать MultiByteToWideChar и получить массив wchar_t, а потом все равно передать его в MT с типом ushort.

Вот код, просто пока эксперимент на слияние текста из mql4 и C++

_DLLAPI int __stdcall getText(unsigned char *chtxt, wchar_t *text)
{
        wstring wstr = text;
        string val(wstr.begin(), wstr.end());
        val += " второй текст";
        int n = val.length();
        for (int i = 0; i < n; i++)
        {
                chtxt[i] = val.c_str()[i];
        }
        return n;
}
 
Murat Ishakov:

Вот код, просто пока эксперимент на слияние текста из mql4 и C++

Здесь юникодная строка text приводится к многобайтной кодировке с потерей всей информации для нелатинских символов, потом добавляется текст уже в многобайтной кодировке и отправляется в МТ, который воспринимает все это как юникод.

Таким образом, много лишних и неправильных действий.

Намного проще вот так (не проверял, но смысл должен быть понятен):

_DLLAPI void __stdcall getText(wchar_t *chtxt, const int chtxtMaxSymbols, wchar_t *text)
{
        wstring wst(text);
        wst += _T(" второй текст");
        wmemcpy_s(chtxt, chtxtMaxSymbols, wst.c_str(), wst.length());
}

Только теперь обязательно нужно передать размер строки chtxt в символах (второй аргумент функции).

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127. uchar # Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar...
 
Ihor Herasko:

Здесь юникодная строка text приводится к многобайтной кодировке с потерей всей информации для нелатинских символов, потом добавляется текст уже в многобайтной кодировке и отправляется в МТ, который воспринимает все это как юникод.

Таким образом, много лишних и неправильных действий.

Намного проще вот так (не проверял, но смысл должен быть понятен):

Только теперь обязательно нужно передать размер строки chtxt в символах (второй аргумент функции).

У меня на "_T" Visual ругается. Что-то надо подключить?

 
Murat Ishakov:

Вот код, просто пока эксперимент на слияние текста из mql4 и C++

L" второй текст" ; // буковка L перед строкой, указывает компилятору что строка - юникод
 
Murat Ishakov:

У меня на "_T" Visual ругается. Что-то надо подключить?

_T - это макрос, который определяет тип строки в зависимости от настроек проекта. Если нет такого макроса, то используйте явное указание типа строки - L"второй текст".

 
Ihor Herasko:

_T - это макрос, который определяет тип строки в зависимости от настроек проекта. Если нет такого макроса, то используйте явное указание типа строки - L"второй текст".

А вызов из mql4 как должен выглядеть? Там же uchar убирается? Что будет вместо wchar_t *chtxt? Тоже string?
 
Murat Ishakov:

У меня на "_T" Visual ругается. Что-то надо подключить?

include tchar.h
Причина обращения: