Падает Meta Trader 5 при подключении 64 битной dll
Спасибо, проверим.
Я собрал 64-битную dll-ку. Она работает.
Но в случае обращения к ней (вызова функции из dll) в тот момент когда в окне графика видно сообщение "Ожидание обновления" терминал падает.
Падает в OnCalculate() индикатора. Обращение к dll в OnInit() проходят нормально.
Использую MetaTrader 5 build 1755
- 2018.01.18
- MetaQuotes Software Corp.
- www.metatrader5.com
Так и что? Проблему решили?
Я собрал 64-битную dll-ку. Она работает.
Но в случае обращения к ней (вызова функции из dll) в тот момент когда в окне графика видно сообщение "Ожидание обновления" терминал падает.
Падает в OnCalculate() индикатора. Обращение к dll в OnInit() проходят нормально.
Использую MetaTrader 5 build 1755
А последний билд 1795 от 3 апреля
А последний билд 1795 от 3 апреля
Обновился до MetaTraider 5 build 1795 - проблема актуальна. Терминал падает.
Кроме того я выяснил, что связано это с передачей параметра в функцию.
Если совпадают 2 фактора:
1) я передаю строку которую хочу заполнить текстом;
2) на экране графика светится надпись "Ожидание обновления"
#import "Libra.dll"
void FillReport(string symbol, ENUM_TIMEFRAMES timeframe, string &report);
#import
а в OnCalculate() следующее:
string report = "";
FillReport(_Symbol, _Period, report);
Comment(report);
Если надпись "Ожидание обновления" не появляется, то всё отрабатывает корректно.
Такая надпись появляется когда переключаешь таймфрейм на графике.
Если же я передаю параметры не по ссылке, а по значению, то есть ничего не возвращаю в индикатор из DLL'ки, то такой метод в ситуации "Ожидание обновления" отрабатывает корректно.
Есть какой-либо способ узнать что на момент выполнения OnCalculate() график находится в состоянии Ожидание обновления" ?
Обновился до MetaTraider 5 build 1795 - проблема актуальна. Терминал падает.
Кроме того я выяснил, что связано это с передачей параметра в функцию.
Если совпадают 2 фактора:
1) я передаю строку которую хочу заполнить текстом;
2) на экране графика светится надпись "Ожидание обновления"
#import "Libra.dll"
void FillReport(string symbol, ENUM_TIMEFRAMES timeframe, string &report);
#import
а в OnCalculate() следующее:
string report = "";
FillReport(_Symbol, _Period, report);
Comment(report);
Если надпись "Ожидание обновления" не появляется, то всё отрабатывает корректно.
Такая надпись появляется когда переключаешь таймфрейм на графике.
Если же я передаю параметры не по ссылке, а по значению, то есть ничего не возвращаю в индикатор из DLL'ки, то такой метод в ситуации "Ожидание обновления" отрабатывает корректно.
Есть какой-либо способ узнать что на момент выполнения OnCalculate() график находится в состоянии Ожидание обновления" ?
https://www.mql5.com/ru/forum/622
https://www.mql5.com/ru/articles/18
Тут поищите ответ на свой вопрос.
- 2010.03.07
- www.mql5.com
https://www.mql5.com/ru/forum/622
https://www.mql5.com/ru/articles/18
Тут поищите ответ на свой вопрос.
да и вообще, выложите весь проект длл
мне лично он даром не нужен, утомили секретчики
выложите и мы быстро найдем баг
https://www.mql5.com/ru/forum/622
https://www.mql5.com/ru/articles/18
Тут поищите ответ на свой вопрос.
К сожалению, эти ссылки мне бесполезны.
Потому что как я выше писал:
1. Мой код работает. Он работает бесконечно долго, но лишь
до момента появления надписи: "Ожидание обновления", - в окне
терминала;
2. Терминал падает. А терминал не должен падать, потому что он отлавливает все не перехваченные исключения при вызовах любых функций из внешний dll. Терминал максимум должен выгрузить индикатор, но не упасть.
3. Я лишь спросил есть ли способ определить, что терминал находится в состоянии "Ожидание обновления"?
Советник содержит код
библиотека Wrapper.dll
при запуске советника падает Meta Trader 5
Это полный код?
Если не полный, то разобраться нельзя, так как у вас тысяча возможностей завалить систему из dll.
да и вообще, выложите весь проект длл
мне лично он даром не нужен, утомили секретчики
выложите и мы быстро найдем баг
Алексей, спасибо что откликнулись.
Специально для Вас и для чистоты эксперимента, сегодня я написал аналог моей dll-ки на C++.
Результат тот же:
1. Код работает.
2. Терминал падает.
Изначально dll-ка была
написана на C# под .NET Framework 4.7.
Всё что делает индикатор, так это считает как часто был вызван метод OnInit() на каждом из таймфреймов и выводит эту информацию в верхний левый угол окна графика.
Исходник на .NET (LibraDLL_SourceCode.zip) здесь:
https://yadi.sk/d/REPNNBBu3UQhc5
Исходник на C++ (LibraDLL_SourceCode_C++.zip) здесь:
https://yadi.sk/d/zFrl2muT3URaDV
Исходник индикатора (IndicatorEventTest.mq5) здесь:
https://yadi.sk/d/qVXKaqvM3URbJd
Скомпилированная библиотечка под .NET (Libra.dll_C#.NET.zip) здесь:
https://yadi.sk/d/NbUvvDpk3URbAT
Скомпилированная native библиотечка (Libra.dll_C++.zip) здесь:
https://yadi.sk/d/LNeeMekU3URbGj
Отличие native библиотеки от .NET библиотеки в том, что в последней реализовано логирование.
Libra.dll (под .NET) пишет лог в папку C:\Program Files\MetaTrader 5\Logs\
И из совокупных логов видно, что такие методы языка MQL5 как Alert или Print идущие до обращения к функции в DLL в момент проблемного выполнения OnCalculate() не отрабатывают, зато сама функция в DLL отрабатывает полностью.
Прежде чем вызывать метод из DLL, который заполняет строку (приёмный буфер) текстом, следует явно задать размер этого приёмного буфера функцией StringInit.
Советник содержит код
библиотека Wrapper.dll
при запуске советника падает Meta Trader 5