Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здесь юникодная строка text приводится к многобайтной кодировке с потерей всей информации для нелатинских символов, потом добавляется текст уже в многобайтной кодировке и отправляется в МТ, который воспринимает все это как юникод.
Таким образом, много лишних и неправильных действий.
Намного проще вот так (не проверял, но смысл должен быть понятен):
Только теперь обязательно нужно передать размер строки chtxt в символах (второй аргумент функции).
Хоть и можно разместить строку требуемой длины вызовом StringSetLength, но мне кажется, даже так лучше не делать - мы не знаем, как работает выделение памяти в мтшной string. Можно возвращать из длл адрес массива, который заведомо не разрушится до выгрузки длл, и конвертировать его в строку вызовом ShortArrayToString.
А как тогда будет правильно вызов в mql4?
Как-то так получается. Тоже не проверял ))
немного поправилХоть и можно разместить строку требуемой длины вызовом StringSetLength, но мне кажется, даже так лучше не делать - мы не знаем, как работает выделение памяти в мтшной string. Можно возвращать из длл адрес массива, который заведомо не разрушится до выгрузки длл, и конвертировать его в строку вызовом ShortArrayToString.
Мне тоже не очень нравится такой способ, но, помнится, как-то разработчики писали, что достаточно инициализировать строку нужным количеством символов (это количество и нужно передать в функцию). Этот способ приходится использовать, если в DLL нет долгоживущих переменных. Если же в DLL организовать такие переменные, то, конечно же, так лучше.
А вызов из mql4 как должен выглядеть? Там же uchar убирается? Что будет вместо wchar_t *chtxt? Тоже string?
Можно string (только перед вызовом забить в строку достаточное количество символов), а лучше - массив ushort, который потом преобразовать в string.
Мне тоже не очень нравится такой способ, но, помнится, как-то разработчики писали, что достаточно инициализировать строку нужным количеством символов (это количество и нужно передать в функцию). Этот способ приходится использовать, если в DLL нет долгоживущих переменных. Если же в DLL организовать такие переменные, то, конечно же, так лучше.
О, я этого не видел. Спасибо.
О, я этого не видел. Спасибо.
инициализируйте строку с помощью StringInit()
так делаю давно, работает без проблем при обмене с dll, очень удобно, что могу задать конкретный размер буфера
я в два вызова получаю данные из dll, на первом вызове обрабатываю запрос и сохраняю данные в локальной статической переменной в dll и возвращаю размер требуемого буфера , на втором вызове передаю в MQL это значение
и чтобы в основном коде было удобно это использовать, делаю такую обертку:
инициализируйте строку с помощью StringInit()
так делаю давно, работает без проблем при обмене с dll, очень удобно, что могу задать конкретный размер буфера
я в два вызова получаю данные из dll, на первом вызове обрабатываю запрос и сохраняю данные в локальной статической переменной в dll и возвращаю размер требуемого буфера , на втором вызове передаю в MQL это значение
и чтобы в основном коде было удобно это использовать, делаю такую обертку: