Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
то есть если хотим передавать строки в эксперт из DLL то надо заранее проинициализировтаь строки максимальным значением типа
то есть если хотим передавать строки в эксперт из DLL то надо заранее проинициализировтаь строки максимальным значением типа
Должен ли я также указать длину строки как указано в коде ниже или достаточно скопировать новую строку в strArray[n].string в которой зарезервировано максимальное количество байт под символы?
Терминал потом не упадет в дальнейшем из-за того, что длина строки заканчивающаяся нулём у него изменилась внутри длл, а len не была модифицирована в длл?
Ну а что терминал потом сам узнает что у него длина строки поменялась в dll без изменения len? Не случится ли так что строку то я поменяю а терминал об этом не узнает или он потом проверяет новую длину строки и модифицирует уже len исходя из этого?
Используйте стринг как С строку, у которой концом является ноль.
Категорически нельзя трогать или изменять поле MqlStr.len - оно только для внутреннего использования виртуальной среды MQL4.
Используйте стринг как С строку, у которой концом является ноль.
Как показала практика работы с дебаггером, в dll передается не ссылка на структуру (типа TMT4String) а просто pchar (т.е. только указатель на сами данные), а я уже вижу не первый раз, когда народ воспринимает этот указатель как поинтер именно на TMT4String, и начинает модифицировать поля len, и т.п.
Кто тут все таки прав?
Имхо, это будет полезно, т.к. вопросов по форуму немало, а ответов по делу почти нет.
p.s. Renat, а кто вам делал "навеску" на terminal.exe - это ваши сотрудники, или сторонний заказ?
Автору адназначно респект ;), ибо сделано весьма оригинально - вроде в наше время уже ниче нового придумать нельзя, но тем не менее, даже такие вещи как ida5.0 толком файло загрузить не могут.
Я бы вам все таки посоветовал не заморачиваться с защитой, т. к. лично у меня ушло минут 5 на выяснение причин (почему файло не грузится), и все закончилось правкой поля NumberOfRvaAndSizes (на 0x10) в OptionalHeader прям в .exe, после чего все заработало :), но автору еще раз - респект :)
Эффекта - почти что ноль (все равно сломают), а проблемы с отладкой dll создает конкретно (особенно тем, кто не знает что такое NumberOfRvaAndSizes), а отлаживать dll как тож надо...
Категорически нельзя трогать или изменять поле MqlStr.len - оно только для внутреннего использования виртуальной среды MQL4.
Используйте стринг как С строку, у которой концом является ноль.
Категорически нельзя трогать или изменять поле MqlStr.len - оно только для внутреннего использования виртуальной среды MQL4.
Используйте стринг как С строку, у которой концом является ноль.
Как показала практика работы с дебаггером, в dll передается не ссылка на структуру (типа TMT4String) а просто pchar (т.е. только указатель на сами данные), а я уже вижу не первый раз, когда народ воспринимает этот указатель как поинтер именно на TMT4String, и начинает модифицировать поля len, и т.п.
Кто тут все таки прав?
Имхо, это будет полезно, т.к. вопросов по форуму немало, а ответов по делу почти нет.
p.s. Renat, а кто вам делал "навеску" на terminal.exe - это ваши сотрудники, или сторонний заказ?
Автору адназначно респект ;), ибо сделано весьма оригинально - вроде в наше время уже ниче нового придумать нельзя, но тем не менее, даже такие вещи как ida5.0 толком файло загрузить не могут.
Я бы вам все таки посоветовал не заморачиваться с защитой, т. к. лично у меня ушло минут 5 на выяснение причин (почему файло не грузится), и все закончилось правкой поля NumberOfRvaAndSizes (на 0x10) в OptionalHeader прям в .exe, после чего все заработало :), но автору еще раз - респект :)
Эффекта - почти что ноль (все равно сломают), а проблемы с отладкой dll создает конкретно (особенно тем, кто не знает что такое NumberOfRvaAndSizes), а отлаживать dll как тож надо...
func(string str);
то в Dll она будет как
func(char* str);
то есть без поля int len перед строкой.
Однако если передаём массив ссылок на строки в эксперте
func(string& strings[]) {
}
то dll будет получать указатель на массив строк типа
MqlStr {
int len;
char* string;
};
func(MqlStr* pStrings) {
}
А насчёт отладки длл. У меня получалось нормально. Правда одна проблема иногда длл не освобождалась терминалом даже если удалить эксперта с чарта (он один был).
Думаю теперь сделать так что эксперт вызывает функции init и deinit из промежуточной длл которая уже принудительно делает LoadLibrary и FreeLibrary для другой длл с нужным кодом. Мне кажется что в MQ был сделал упор на язык mql4 а работа с длл добавилась как дополнительная фича, чтобы было без хорошего продумывания и тестирования.
Но если метаквотс усовершенствует механизм работы с длл то это улучшило бы продукт значительно. Можно было бы позволить вызывать функции входящих в состав MQL4 прямо из Dll плугинов. И разрешить это только при запущенном терминале чтобы люди не делали свои терминалы а просто разрабатывали plugins к MT4.
Категорически нельзя трогать или изменять поле MqlStr.len - оно только для внутреннего использования виртуальной среды MQL4.
Используйте стринг как С строку, у которой концом является ноль.
Как Вы верно заметили, при прямой передаче строки в DLL, идет прямая ссылка вида char*, а при передаче массива строк выдается MqlStr*.
Вообще-то работать с DLL из MQL4 легко, так как мы изначально делали такую интеграцию. Есть конечно особенности работы со строками, но они из-за того, что мы максимально ускорили работу с ними, введя специальный контролируемый пул строк (по сравнению с new/delete мы ускорились в десяток раз).
Эффекта - почти что ноль (все равно сломают), а проблемы с отладкой dll создает конкретно (особенно тем, кто не знает что такое NumberOfRvaAndSizes), а отлаживать dll как тож надо...
Категорически нельзя трогать или изменять поле MqlStr.len - оно только для внутреннего использования виртуальной среды MQL4.
Используйте стринг как С строку, у которой концом является ноль.
Как Вы верно заметили, при прямой передаче строки в DLL, идет прямая ссылка вида char*, а при передаче массива строк выдается MqlStr*.
Вообще-то работать с DLL из MQL4 легко, так как мы изначально делали такую интеграцию. Есть конечно особенности работы со строками, но они из-за того, что мы максимально ускорили работу с ними, введя специальный контролируемый пул строк (по сравнению с new/delete мы ускорились в десяток раз).
А насчёт интеграции с длл она реализована но вот есть ограничения на передачу структур данных между экспертом и DLL и вообще вызов функций из длл происходит медленнее чем если бы я в длл переписывал функции start init и прочие а терминал бы вызывал их уже из моего длл плугина.