Падает Meta Trader 5 при подключении 64 битной dll

 

Советник содержит код

#import "Wrapper.dll"
  void CreateServices(string);
#import

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  CreateServices("test");
  return(0);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {

}

библиотека Wrapper.dll

#include "stdafx.h"

using namespace System;

// ---------------------------------------------------------------
// Создает сервис и возвращает указатель на него
// ---------------------------------------------------------------
_DLLAPI void __stdcall CreateServices(const wchar_t* serverName)
{

}

при запуске советника падает Meta Trader 5

 
Спасибо, проверим.
 
Renat Fatkhullin:
Спасибо, проверим.
Так и что? Проблему решили?

Я собрал 64-битную dll-ку. Она работает.
Но в случае обращения к ней (вызова функции из dll) в тот момент когда в окне графика видно сообщение "Ожидание обновления" терминал падает.
Падает в OnCalculate() индикатора. Обращение к dll в OnInit() проходят нормально.

Использую MetaTrader 5 build 1755
MetaTrader 5 build 1755
MetaTrader 5 build 1755
  • 2018.01.18
  • MetaQuotes Software Corp.
  • www.metatrader5.com
Исправлена ошибка, из-за которой терминал и MetaEditor блокировали выключение и перезагрузку Windows. Исправлено выставление отступа графика при применении шаблона. MQL5 Исправлены ошибки, приводившие к замедлению компиляции в некоторых условиях. Исправления по крешлогам.
 
Neocriss:
Так и что? Проблему решили?

Я собрал 64-битную dll-ку. Она работает.
Но в случае обращения к ней (вызова функции из dll) в тот момент когда в окне графика видно сообщение "Ожидание обновления" терминал падает.
Падает в OnCalculate() индикатора. Обращение к dll в OnInit() проходят нормально.

Использую MetaTrader 5 build 1755

А последний билд 1795 от 3 апреля

 
Alexey Volchanskiy:

А последний билд 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

Тут поищите ответ на свой вопрос.

Передача массива string в dll по ссылке
Передача массива string в dll по ссылке
  • 2010.03.07
  • www.mql5.com
Общее обсуждение: Передача массива string в dll по ссылке
 
Evgeny Belyaev:

https://www.mql5.com/ru/forum/622

https://www.mql5.com/ru/articles/18

Тут поищите ответ на свой вопрос.

да и вообще, выложите весь проект длл
мне лично он даром не нужен, утомили секретчики

выложите и мы быстро найдем баг

 
Evgeny Belyaev:

https://www.mql5.com/ru/forum/622

https://www.mql5.com/ru/articles/18

Тут поищите ответ на свой вопрос.

К сожалению, эти ссылки мне бесполезны.

 

Потому что как я выше писал:


1. Мой код работает. Он работает бесконечно долго, но лишь до момента появления надписи: "Ожидание обновления", - в окне терминала;

2. Терминал падает. А терминал не должен падать, потому что он отлавливает все не перехваченные исключения при вызовах любых функций из внешний dll. Терминал максимум должен выгрузить индикатор, но не упасть.

3. Я лишь спросил есть ли способ определить, что терминал находится в состоянии "Ожидание обновления"?

 
Andrey Masterov:

Советник содержит код

библиотека Wrapper.dll

при запуске советника падает Meta Trader 5

Это полный код?

Если не полный, то разобраться нельзя, так как у вас тысяча возможностей завалить систему из dll.

 
Alexey Volchanskiy:

да и вообще, выложите весь проект длл
мне лично он даром не нужен, утомили секретчики

выложите и мы быстро найдем баг

Алексей, спасибо что откликнулись.
Специально для Вас и для чистоты эксперимента, сегодня я написал аналог моей 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.