- Пример передачи массива на С
- Общайтесь с разработчиками через Сервисдеск!
- Вопросы от начинающих MQL4 MT4 MetaTrader 4
Всем привет. Есть dll на C++ Visual studio 2015, возвращаю оттуда текст через массив uchar. И всё работает хорошо, но вместо русских букв символы. Как исправить? Как-то явно в dll указать кодировку?
В МТ используется Unicode. Поэтому dll также должна быть юникодной (строки std::wstring или wchar_t, а не char).
В МТ используется Unicode. Поэтому dll также должна быть юникодной (строки std::wstring или wchar_t, а не char).
Возвращаю массив uchar так как тут на форуме так видел. А можно по другому?
Как получаете массив uchar в dll? Из строки какого типа? Если в dll строки wchar_t или std::wstring, то массив в MQL нужно использовать типа ushort.
Если же из многобайтной кодировки, то в самой dll сначала нужно использовать MultiByteToWideChar и получить массив wchar_t, а потом все равно передать его в MT с типом ushort.
Как получаете массив 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; }
Вот код, просто пока эксперимент на слияние текста из 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 в символах (второй аргумент функции).
- www.mql5.com
Здесь юникодная строка text приводится к многобайтной кодировке с потерей всей информации для нелатинских символов, потом добавляется текст уже в многобайтной кодировке и отправляется в МТ, который воспринимает все это как юникод.
Таким образом, много лишних и неправильных действий.
Намного проще вот так (не проверял, но смысл должен быть понятен):
Только теперь обязательно нужно передать размер строки chtxt в символах (второй аргумент функции).
У меня на "_T" Visual ругается. Что-то надо подключить?
Вот код, просто пока эксперимент на слияние текста из mql4 и C++
L" второй текст" ; // буковка L перед строкой, указывает компилятору что строка - юникод
_T - это макрос, который определяет тип строки в зависимости от настроек проекта. Если нет такого макроса, то используйте явное указание типа строки - L"второй текст".
У меня на "_T" Visual ругается. Что-то надо подключить?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования