Скачать MetaTrader 5

Бага в отладчике!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
DrDemon
66
DrDemon  

Когда есть в коде импортированные функции из внешних библиотек DLL, то терминал вылетает если заходишь в функцию советника, в которой используется эта внешняя функция из DLL.

Поясню на примере - терминал вылетает и отладка прекращается когда захожу отладчиком в функцию WriteFile():

#import "kernel32.dll"
int _lopen(string PathName,int ReadWrite);
int _lcreat(string PathName,int Attribute);
int _llseek(int FileHandle,int Offset,int Origin);
int _lread(int FileHandle,string Buffer,int Bytes);
int _lwrite(int FileHandle,string Buffer,int Bytes);
int _lclose(int FileHandle);
bool DeleteFileA(string PathName);

#import


int WriteFile(string FileName,string str)
  {
   int error;

   int strlen=StringLen(str);

DeleteFileA(FileName);

   int handle=_lcreat(FileName,0);

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(handle<0)
     {
      Print("Ошибка создания файла ",FileName);
      return(-1);
     }

   error=_lwrite(handle,str,strlen);

   if(error<0) Print("Ошибка записи в файл ",FileName," ",strlen," байт");

   error=_lclose(handle);

   if(error<0) Print("Ошибка закрытия файла ",FileName);
   return(error);

  }


Код выдрал из своего же советника на MQL4 и этот код там работает, однако в MQL5 почему-то файл не создается, не пойму почему (может у меня ошибка?).

Компилятор на код не ругается.

З.Ы.

Елки-палки сделайте стилизатор настраиваемым!

Ну очень не нравится мне как он фигурные скобки расставляет и не хочу я вот это перед каждым циклом:

//+------------------------------------------------------------------+
//|                                                                  |

//+------------------------------------------------------------------+

и еще хочу пробелы впереди и сзади "=" чтобы читабельней было :)

И еще очень хочется в режиме отладчика всплывающие подсказки с текущим значением переменной или выражения когда к ним мышку подносишь,

а то каждый раз приходится в watchlist заносить. Да и еще в самом вочлисте значения не меняются у переменных (не нашел).

Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
Rashid Umarov
Админ
12608
Rashid Umarov  
Пользуйтесь, пожалуйста, возможностями редактора для удобного форматирования кода. Рекомендую статью MQL5 Community - Памятка пользователя

DrDemon
66
DrDemon  

Когда есть в коде импортированные функции из внешних библиотек DLL, то терминал вылетает если заходишь в функцию советника, в которой используется эта внешняя функция из DLL.

Поясню на примере - терминал вылетает и отладка прекращается когда захожу отладчиком в функцию WriteFile():

#import "kernel32.dll"
int _lopen(string PathName,int ReadWrite);
int _lcreat(string PathName,int Attribute);
int _llseek(int FileHandle,int Offset,int Origin);
int _lread(int FileHandle,string Buffer,int Bytes);
int _lwrite(int FileHandle,string Buffer,int Bytes);
int _lclose(int FileHandle);
bool DeleteFileA(string PathName);
#import

int WriteFile(string FileName,string str)
{
   int error;

   int strlen=StringLen(str);

   DeleteFileA(FileName);

   int handle=_lcreat(FileName,0);

   if(handle<0)
   {
      Print("Ошибка создания файла ",FileName);
      return(-1);
   }

   error=_lwrite(handle,str,strlen);

   if(error<0) Print("Ошибка записи в файл ",FileName," ",strlen," байт");

   error=_lclose(handle);

   if(error<0) Print("Ошибка закрытия файла ",FileName);
   return(error);

}


Код выдрал из своего же советника на MQL4 и этот код там работает, однако в MQL5 почему-то файл не создается, не пойму почему (может у меня ошибка?).

Компилятор на код не ругается.

З.Ы.

Елки-палки сделайте стилизатор настраиваемым!

Ну очень не нравится мне как он фигурные скобки расставляет и не хочу я вот это перед каждым циклом:

//+------------------------------------------------------------------+
//|                                                                                   |
//+------------------------------------------------------------------+

и еще хочу пробелы впереди и сзади "=" чтобы читабельней было :)

И еще очень хочется в режиме отладчика всплывающие подсказки с текущим значением переменной или выражения когда к ним мышку подносишь,

а то каждый раз приходится в watchlist заносить. Да и еще в самом вочлисте значения не меняются у переменных (не нашел).


Что-то мой собственный пост не редактируется, поэтому запостил заново. В улучшенном варианте :)

Пользуйтесь, пожалуйста, возможностями редактора для удобного форматирования кода. Рекомендую статью MQL5 Community - Памятка пользователя

Я имел в виду стализатор (автоформатирование) кода в MetaEditor'e. Там нужны настройки.
DrDemon
66
DrDemon  

Существенно упростил код и перешел на штатные функции работы с файлами.

И все равно МетаТрейдер вылетает когда заходишь вот в эту функцию отладчиком.

int WriteFile(string FileName,string str)
{
   int handle=FileOpen("1.txt",FILE_WRITE|FILE_TXT|FILE_COMMON);
   FileWrite(handle,str);
   FileClose(handle);
   return(0);
}



Что не так?

---------------

Спустя 5 минут...

Оппана! Убрал параметр FileName и все заработало! Как это так? Параметр ведь вообще нигде не использовался!

int WriteFile(string str)
{  
   int handle=FileOpen("1.txt",FILE_WRITE|FILE_TXT|FILE_COMMON);
   FileWrite(handle,str);
   FileClose(handle);
   return(0);
}


Vasily
1262
Vasily  
могуч и загадочен мкл5
o_o
Модератор
24192
o_o  

DrDemon:


Поясню на примере - терминал вылетает и отладка прекращается когда захожу отладчиком в функцию WriteFile():

забудьте про 16 битные низкоуровневые операции с файлами. Есть намного красивее и лучшее решение!

#import "Kernel32.dll"
        bool MoveFileExW(string &lpExistingFileName, string &lpNewFileName, int dwFlags);
        bool CopyFileW(string &lpExistingFileName, string &lpNewFileName, bool bFailIfExists);
#import

и так далее... весь набор для работы!

http://msdn.microsoft.com/en-us/library/aa365747%28VS.85%29.aspx


PS. кстати - строки передавать надо по ссылке

Ilyas
1204
Ilyas  

Спасибо за сообщение, ошибка в хранении отладочной инфы для параметров функций исправлена.



DrDemon
66
DrDemon  

Спасибо за помощь...

Похоже, что эти функции теперь не работают:

#import "kernel32.dll"
   int _lopen  (string path, int of);
   int _lcreat (string path, int attrib);
   int _llseek (int handle, int offset, int origin);
   int _lread  (int handle, string buffer, int bytes);
   int _lclose (int handle);
   bool DeleteFileA(string fileName);
#import

Люди подскажите рабочие функции, может у кого-нибудь есть маааленькая библиотечка для работы с файлами через WINAPI ?



Rashid Umarov
Админ
12608
Rashid Umarov  
Тип string в MQL5 является Юникодным. Возможно, Вам помогут функции из раздела Преобразование данных либо используйте юникодные варианты функций для работы с файлами из WinAPI.

o_o
Модератор
24192
o_o  
DrDemon:

Спасибо за помощь...

Похоже, что эти функции теперь не работают:

Люди подскажите рабочие функции, может у кого-нибудь есть маааленькая библиотечка для работы с файлами через WINAPI ?



я вам сообщением выше написал. видели?
DrDemon
66
DrDemon  
sergeev:
я вам сообщением выше написал. видели?

Да видел, спасибо. Только не пойму как эти функции описать в MQL, а именно как сопоставить типы параметров при импорте. Буду разбираться.

Получается, что если string в MQL5 юникодные, то нужно использовать юникодные версии функций WINAPI, например CreateFileW? Ансишные версии уже не будут работать? Я правильно понял?

А если все же нужно будет передать во внешнюю функцию ансишную строку (неюникодовскую), то можно ли преобразовать строку unicode в ansi?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий