Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересует мнение трейдеров? Заведи опрос на форуме!
Sergey Pekshev
591
Sergey Pekshev 2016.04.28 06:15 

Посоветуйте, как записать структуру mql4 в файл используя WriteFile из kernel32.dll

я так понимаю, структуру, надо преобразовать в массив и затем уже записать, но как это сделать... ? 

писать каждый элемент структуры в файл не очень хочется.

Koldun Zloy
217
Koldun Zloy 2016.04.28 08:21  
#define FILE_WRITE_DATA ( 0x0002 )
#define FILE_APPEND_DATA ( 0x0004 )
#define OPEN_ALWAYS         4
#define FILE_ATTRIBUTE_NORMAL 0x00000080  

struct test_struct {
   double price;
   double lot;
   double sl;
   double tp;
} test;

#import "kernel32.dll"
   int CreateFileW( string lpFileName, uint dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, uint hTemplateFile );
   int WriteFile( int hFile, test_struct& lpStruct, int nNumberOfBytesToWrite, int& lpNumberOfBytesWritten, int lpOverlapped );
   int CloseHandle( int hFile );
#import
   
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   test.price = 1.13;
   test.lot = 1.0;
   test.sl = 1.0;
   test.tp = 2.0;
   
   string terminal_data_path = TerminalInfoString( TERMINAL_DATA_PATH );
   string fileName = terminal_data_path + "\\MQL4\\Files\\TestFile";
   int hFile = CreateFileW( fileName, FILE_WRITE_DATA|FILE_APPEND_DATA, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );
   int NumberOfBytesWritten;
   WriteFile( hFile, test, sizeof( test ), NumberOfBytesWritten, 0 );
   CloseHandle( hFile );
}
//+------------------------------------------------------------------+
Комбинатор
15653
Комбинатор 2016.04.28 10:23  
Указатели и хэндлы только на long поменять
Koldun Zloy
217
Koldun Zloy 2016.04.28 10:44  
Комбинатор:
Указатели и хэндлы только на long поменять

Для четвёрки не нужно.

А для пятёрки надо смотреть какой терминал. 

Комбинатор
15653
Комбинатор 2016.04.28 10:51  
А, точно, это ж четверка
Sergey Pekshev
591
Sergey Pekshev 2016.05.02 08:48  
Koldun Zloy:

Спасибо, реально помог.

Не подскажете аналог mql функции FileFlush()  из kernel32.dll

Andrey Voytenko
22506
Andrey Voytenko 2016.05.02 08:56  
Sergey Pekshev:

Не подскажете аналог mql функции FileFlush()  из kernel32.dll

FlushFileBuffers
Sergey Pekshev
591
Sergey Pekshev 2016.05.02 09:52  
Andrey Voytenko:
FlushFileBuffers

Спасибо, что то проблема за проблемой...

создаю файл

extHandle[i] = CreateFileW(file_name, F_GENERIC_WRITE, F_FILE_SHARE_READ, 0, F_CREATE_ALWAYS, 0, 0);

 Пишет в файл строки в юникоде

extHandle[i] = CreateFileA(file_name, F_GENERIC_WRITE, F_FILE_SHARE_READ, 0, F_CREATE_ALWAYS, 0, 0);

 так создаю файл, возвращает  дескриптор, пишу в файл, возвращает успешно, возвращает сколько байт записано, но файла нету

 

нужно строки писать в ANSI, подскажите  как это сделать

Sergey Pekshev
591
Sergey Pekshev 2016.05.02 10:43  

нашел решение

StringToCharArray()

Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов. 

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

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