Скачать MetaTrader 5

Бага в компиляторе!

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

Экспериментирую с работой файловых функций.

Компилятор зависает (входит в бесконечный цикл) при компилировании этого кода.

Конечно в коде есть ошибки. Забыл удалить из кода функцию AnsiToUnicode, начал компиляцию и все зависло.

//+------------------------------------------------------------------+
//|                                                     FileTest.mq5 |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"

#import "ntdll.dll"
 int RtlGetLastWin32Error();
 int RtlSetLastWin32Error (int dwErrCode);
#import

//==== Константы для функции "CreateFile()". ===============================================================================================================================================================
                                                // ---- Параметр "dwDesiredAccess". ------------------------------------------------------------------------------------------------------------------------
//#define GENERIC_EXECUTE                         // Общий доступ к файлу.
#define GENERIC_WRITE                0x40000000 // Доступ к файлу для записи.
#define GENERIC_READ                 0x80000000 // Доступ к файлу для чтения.
                                                // ---- Дополнительные атрибуты для параметра "dwDesiredAccess". -------------------------------------------------------------------------------------------
#define FILE_ADD_FILE                0x0002     // Для директория, право создавать файл в директории.
#define FILE_ADD_SUBDIRECTORY        0x0004     // Для директория, право создавать subdirectory.
//#define FILE_ALL_ACCESS                         // Все возможные права доступа для файла.
#define FILE_APPEND_DATA             0x0004     // Для файлового объекта, право добавлять данные в файл.
#define FILE_CREATE_PIPE_INSTANCE    0x0004     // Для поименованной трубы, право создавать трубу.
#define FILE_DELETE_CHILD            0x0040     // Для директория, право удалять директорий и все файлы, которые он содержит, включая только для чтения файлы.
#define FILE_EXECUTE                 0x0020     // Для исконного кодового файла, право выполнять файл. Это право доступа данное сценариям может заставить сценарий, чтобы быть программой, в зависимости от переводчика сценария.
#define FILE_LIST_DIRECTORY          0x0001     // Для директория, право указывать содержание директория.
#define FILE_READ_ATTRIBUTES         0x0080     // Право читать атрибуты файла.
#define FILE_READ_DATA               0x0001     // Для файлового объекта, право читать соответствующие файловые данные. Для объекта директория, право читать соответствующие данные директория.
#define FILE_READ_EA                 0x0008     // Право читать расширенные атрибуты файла.
#define FILE_TRAVERSE                0x0020     // Для директория, право просматривать директорий. По умолчанию, пользователи назначены привилегия BYPASS_TRAVERSE_CHECKING, которая игнорирует право доступа FILE_TRAVERSE.
#define FILE_WRITE_ATTRIBUTES        0x0100     // Право записывать атрибуты файла.
#define FILE_WRITE_DATA              0x0002     // Для файлового объекта, право записывать данные в файл. Для объекта директория, право создавать файл в директории (FILE_ADD_FILE).
#define FILE_WRITE_EA                0x0010     // Право записывать расширенные атрибуты файла.
//#define STANDARD_RIGHTS_READ                    // Включает READ_CONTROL, который - право читать информации в файле или дескрипторе объектной безопасности директория. Это не включает информацию в SACL.
//#define STANDARD_RIGHTS_WRITE                   // Также, как STANDARD_RIGHTS_READ.
//#define SYNCHRONIZE                             // Право определять файловый указатель в одной из функций ожидания.
                                                // ---- Параметр "dwShareMode". ----------------------------------------------------------------------------------------------------------------------------
#define FILE_SHARE_NO                0x00000000 // Запрещает процессы открытия файла.
#define _FILE_SHARE_READ              0x00000001 // Подготавливает работу без ограничений в файле или устройстве для чтения.
#define _FILE_SHARE_WRITE             0x00000002 // Подготавливает работу без ограничений в файле или устройстве для записи.
#define FILE_SHARE_DELETE            0x00000004 // Подготавливает работу без ограничений в файле или устройстве для удаления.
                                                // ---- Параметр "dwCreationDisposition".-------------------------------------------------------------------------------------------------------------------
#define CREATE_NEW                   1          // Создает новый файл, если его ещё нет.
#define CREATE_ALWAYS                2          // Создает новый файл, всегда.
#define OPEN_EXISTING                3          // Открывает файл или устройство, если он существует.
#define OPEN_ALWAYS                  4          // Открывает файл, всегда.
#define TRUNCATE_EXISTING            5          // Открывает файл и исключает это чтобы размер - нулевые байты, только если он существует.
                                                // ---- Параметр "dwFlagsAndAttributes". -------------------------------------------------------------------------------------------------------------------
                                                // ---- Атрибут. -------------------------------------------------------------------------------------------------------------------------------------------
#define FILE_ATTRIBUTE_READONLY      0x1        //    (1) Файл читается только. Приложения могут прочитать файл, но не могут записаться на или удалять это.
#define FILE_ATTRIBUTE_HIDDEN        0x2        //    (2) Файл исчезнут. Не включайте это в обычном листинге директория.
#define FILE_ATTRIBUTE_SYSTEM        0x4        //    (4) Файл является частью или использованное исключительно операционной системой.
#define FILE_ATTRIBUTE_ARCHIVE       0x20       //   (32) Файл должен быть архивизирован. Приложения используют этот атрибут, чтобы выделять файлам для копии или удаления.
#define FILE_ATTRIBUTE_NORMAL        0x80       //  (128) Файл нет был установлен другие атрибуты. Этот атрибут - в силе только если использовано только.
#define FILE_ATTRIBUTE_TEMPORARY     0x100      //  (256) Файл используется для временной памяти.
#define FILE_ATTRIBUTE_OFFLINE       0x1000     // (4096) Данные файла не немедленно доступно. Этот атрибут указывает, что файловые данные физически перемещены на offline память.
#define FILE_ATTRIBUTE_ENCRYPTED     0x4000     //(16384) Файл или директорий закодированы.
                                                // ---- Флаг. ----------------------------------------------------------------------------------------------------------------------------------------------
#define FILE_FLAG_BACKUP_SEMANTICS   0x02000000 // Файл открывается или создается для резервного или действия восстановления.
#define FILE_FLAG_DELETE_ON_CLOSE    0x04000000 // Файл должен немедленно удаляться после закрытия.
#define FILE_FLAG_NO_BUFFERING       0x20000000 // Файл или устройство открывается без системы, кешировавшейся для данных читает и записывает.
#define FILE_FLAG_OPEN_NO_RECALL     0x00100000 // Файловые данные требуется, но это должно оставаться расположен в дистанционной памяти.
#define FILE_FLAG_OPEN_REPARSE_POINT 0x00200000 // Нормально reparse точку обрабатывая не произойдет; CreateFile ПОПЫТАЕТСЯ открывать reparse точку.
#define FILE_FLAG_OVERLAPPED         0x40000000 // Файл или устройство открывается или создается для асинхронного В/В.
#define FILE_FLAG_POSIX_SEMANTICS    0x0100000  // Доступ произойдет согласно правила POSIX.
#define FILE_FLAG_RANDOM_ACCESS      0x10000000 // Доступ собирается быть произвольным. Система может использовать это как намек, чтобы оптимизировать файловое кэширование.
#define FILE_FLAG_SEQUENTIAL_SCAN    0x08000000 // Доступ собирается быть последовательным из начала, чтобы заканчиваться. Система может использовать это как намек, чтобы оптимизировать файловое кэширование.
#define FILE_FLAG_WRITE_THROUGH      0x80000000 // Операции Записи не пройдет через любой промежуточный кеш, они пойдут непосредственно на диск.
//==== Константы для функции "CreateFileMappingA()". =======================================================================================================================================================
#define PAGE_EXECUTE                 0x10       // Включает исполнительный доступ к фиксированной области страниц. Результатом попытки прочитать или записать в фиксированную область является нарушение доступа.
#define PAGE_EXECUTE_READ            0x20       // Включает доступ исполнительный/чтения к фиксированной области страниц. Результатом попытки записать в фиксированную область является нарушение доступа.
#define PAGE_EXECUTE_READWRITE       0x40       // Включает исполнительный/чтения/записи доступ к фиксированной области страниц.
#define PAGE_EXECUTE_WRITECOPY       0x80       // Включает доступ исполнительный/чтения/записи к фиксированной области image файла кодовых страниц. Страницы распределяют “чтение при записи”(read-on-write)
                                                // и “копирование при записи”(copy-on-write).
#define PAGE_NOACCESS                0x01       // Выключает все доступы к фиксированной области страниц. Результатом попытки прочитать из, записать в, или исполнить фиксированную область является
                                                // исключение нарушения доступа, называемое ошибка общей защиты (GP).
#define PAGE_READONLY                0x02       // Включает доступ чтения к фиксированной области страниц. Результатом попытки записать в фиксированную область является нарушение доступа. Если система
                                                // различается между доступом “только для чтения” и исполнением, то попытка исполнить код в фиксированной области приведет к нарушению доступа.
#define PAGE_READWRITE               0x04       // Включает доступ чтения/записи к фиксированной области страниц.
#define PAGE_WRITECOPY               0x08       // Дает копирование при записи(copy-on-write) защиту для фиксированной области страниц.


#import "kernel32.dll"
bool DeleteFileA(string PathName);
int  CreateFileA(string lpFileName,int dwDesiredAccess,int dwShareMode,int lpSecurityAttributes,int dwCreationDisposition,int dwFlagsAndAttributes,int hTemplateFile);
bool ReadFile(int hFile,string &lpBuffer,int nNumberOfBytesToRead,int &lpNumberOfBytesRead[],int lpOverlapped);
bool WriteFile(int hFile,string lpBuffer,int nNumberOfBytesToWrite,int &lpNumberOfBytesWritten[],int lpOverlapped);
                                                                                               
bool MoveFileExW(string &lpExistingFileName,string &lpNewFileName,int dwFlags);
bool CopyFileW(string &lpExistingFileName,string &lpNewFileName,bool bFailIfExists);

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);
#import

void OnStart()
{
   int Handle;
   string PathName = "C:\!NewFile.txt";
   uchar PathNameA[];
  
   StringToCharArray(PathName, PathNameA);
  
   Handle = _lcreat(PathNameA, 0);
   Print("_lcreat PathName=", PathName, "   Create result = ", Handle, ",  GetLastError()=", RtlGetLastWin32Error());
   _lwrite(Handle, PathName, StringLen(PathName));
   _lclose(Handle);
  
   Handle = CreateFileW(PathName, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
   Print("PathName=", PathName, "   Create result = ", Handle, ",  GetLastError()=", RtlGetLastWin32Error());
 
  
}

string AnsiToUnicode(uchar& Buff)
{}
   // translate ANSI to UNICODE
   ushort chW; uchar chA; string rez;
   for(int i=0; i<StringLen(clip); i++)
     {
      chW=StringGetCharacter(clip, i);
      chA=uchar(chW&255); rez=rez+CharToString(chA);
      chA=uchar(chW>>8&255); rez=rez+CharToString(chA);
     }
   return(rez);
}


Кстати, только потом нашел функцию для конвертирования строк из Unicode в ANSI и обратно. Хорошо бы об этих функциях написать в Справке в разделе String.

Ilyas
1212
Ilyas  
Спасибо за сообщение, исправлено.

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