В данном случае произошло вот что:
Вы назначили переменной s статическую строку, которая находится в пуле стрингов и не может быть изменена. При этом функция GetClassName естественно ничего не знает про какой-то там пул стрингов, ей дали область памяти, она туда записала.
Поэтому попробуйте присвоить переменной временную строку. Например так:
s = "123456789012345678901234567890";
s = s + " ";
Кстати, если бы Вы присвоили во второй раз переменной s какое-либо другое значение, то Вы бы и не увидели проблему.
Вы назначили переменной s статическую строку, которая находится в пуле стрингов и не может быть изменена. При этом функция GetClassName естественно ничего не знает про какой-то там пул стрингов, ей дали область памяти, она туда записала.
Поэтому попробуйте присвоить переменной временную строку. Например так:
s = "123456789012345678901234567890";
s = s + " ";
Кстати, если бы Вы присвоили во второй раз переменной s какое-либо другое значение, то Вы бы и не увидели проблему.
Если в начале присвоить переменной s временную строку, то тогда функция GetClassName вообще не изменяет значение переменной (может и изменяет, но я этого не вижу).
Тогда возникает такой вопрос:
Каким образом можно корректно выделить буфер для таких вызовов?
И какое значение мне надо передавать в качестве nMaxCount (размера буфера)?
Когда строка находится в пуле строк, какой объём памяти для этого выделяется? Равный длине строки (может +1) или 255?
Когда строка передаётся в функцию, что на самом деле передаётся? Адрес начала строки? Каким образом после вызова определяется новый размер строки? Судя по хелпу, длина строки храниться вместе с адресом буфера.
Тогда возникает такой вопрос:
Каким образом можно корректно выделить буфер для таких вызовов?
И какое значение мне надо передавать в качестве nMaxCount (размера буфера)?
Когда строка находится в пуле строк, какой объём памяти для этого выделяется? Равный длине строки (может +1) или 255?
Когда строка передаётся в функцию, что на самом деле передаётся? Адрес начала строки? Каким образом после вызова определяется новый размер строки? Судя по хелпу, длина строки храниться вместе с адресом буфера.
Я получу ответ на свой вопрос?
При вызове любых функций параметры передаются по значению, то есть формируются их локальные копии. Это же касается и строк. Исключение составляют константные строки, которые изначально располагаются в так называемом строковом пуле. Так как эта строка неудаляемая, то и копии её не создаётся. Но при вызове dll-функции такая строка портится (что и было показано Вашим примером).
Что делать? Не использовать такие строки (передающиеся в качестве принимающего параметра) для других целей.
Что делать? Не использовать такие строки (передающиеся в качестве принимающего параметра) для других целей.
Т.е., насколько я понял, если мне надо делать вызов функций из dll, которые возвращают строки, то лучше всю логику работы с этими строками реализовать в dll. А в MQL передавать лишь числовые значения.
Я правильно понял?
Или всё таки можно как-то вернуть в MQL строку из dll, например, не через параметр, а через возвращаемое значение?
Я правильно понял?
Или всё таки можно как-то вернуть в MQL строку из dll, например, не через параметр, а через возвращаемое значение?
Можно возвращать строки. Посмотрите наш пример ExpertSample.dll, функция GetStringValue
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Этот скрипт должен получить имя класса окна в переменную s.
Правильно ли я это делать?
Тут возникает следующая проблема.
Класс получается корректно, но последующие попытки присвоить переменной s другое значение средствами MQL заканчиваются безрезультатно. Значение не меняется.
Вот что выдаёт такой скрипт в логи:
19:36:01 SendMessage EURUSD,M30: AfxFrameOrView42
19:36:01 SendMessage EURUSD,M30: AfxFrameOrView42
А должен выдавать:
19:36:01 SendMessage EURUSD,M30: AfxFrameOrView42
19:36:01 SendMessage EURUSD,M30: 123456789012345678901234567890
Если в самом начале переменную s не инициализировать, то в неё значение вообще не возвращается.
Уважаемые разработчики, можете ли Вы указать как правильно вызывать такие импортируемые методы?
Т.е. те, в которые в качестве параметра передаётся (char*).