Ошибки, баги, вопросы - страница 2238

 
TheXpert:

да ладно )

проверяли же - винда может файл открыть а скрипт нет. проблема с флагом FILE_SHARE_READ

Рекомендую ознакомиться https://docs.microsoft.com/en-us/windows/desktop/FileIO/creating-and-opening-files

Creating and Opening Files
Creating and Opening Files
  • 2018.05.31
  • Michael Satran
  • docs.microsoft.com
Considerations for creating or opening a file by using the CreateFile function.
 

Как быть с этим фактом?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2018.07.23 16:48

Явно баг, т.к. с подобными флагами сторонние приложения файл читают без проблем.


Такие файлы

FILE_READ | FILE_WRITE | FILE_IS_TEXT | FILE_SHARE_READ

просматриваю в TotalCommander без FileClose. Без FILE_SHARE_READ этого сделать, конечно, не получается

 
Ilyas:

Рекомендую ознакомиться

да, как раз хотел вкинуть.

признаю, что неправ. если первый хендл открыт для записи, второй обязан добавлять флаг FILE_SHARE_WRITE

но есть еще коммент от a100 где вообще записи нет
 
Ilyas:

Открывающему на чтение не хватает флага FILE_SHARE_WRITE (разрешить запись), т.к. имеется пишущий.

Это ограничение системы (WinAPI).

Вот правильные флаги, при котором ваш код будет работать:

Я тоже MSDN читаю. Поясните, это - майкрософт английского не знает, или они сами свою документацию не читают, или - последний вариант - флаги в MQL названы по аналогии WinApi но работают по-другому?

Взято вот отсюда - https://docs.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-createfilea

FILE_SHARE_READ - Enables subsequent open operations on a file or device to request read access. Otherwise, other processes cannot open the file or device if they request read access.

FILE_SHARE_WRITE - Enables subsequent open operations on a file or device to request write access. Otherwise, other processes cannot open the file or device if they request write access.

Исходя из этого, первой программе достаточно указать флаг FILE_SHARE_READ для того чтобы вторая смогла читать. FILE_SHARE_WRITE требуется указать только в случае, когда известно, что помимо первой программы в файл будет писать и вторая.

CreateFileA function
CreateFileA function
  • 2018.06.14
  • windows-sdk-content
  • docs.microsoft.com
Creates or opens a file or I/O device. The most commonly used I/O devices are as follows:\_file, file stream, directory, physical disk, volume, console buffer, tape drive, communications resource, mailslot, and pipe.
[Удален]  

Вопрос к разработчикам.

Есть функция синхронизации:

//+------------------------------------------------------------------+
//| Проверка синхронизации символов                                                                                             |
//+------------------------------------------------------------------+
bool CheckSync()
        {
         //--- Проверка синхронизации символов
         if( !SymbolIsSynchronized( inpSymbol_1 ) )
                {
                 Print( __FUNCTION__,": ОШИБКА #",GetLastError(),": SymbolIsSync("+inpSymbol_1+") = false!" );
                 return( false );
                }
         if( !SymbolIsSynchronized( inpSymbol_2 ) )
                {
                 Print( __FUNCTION__,": ОШИБКА #",GetLastError(),": SymbolIsSync("+inpSymbol_2+") = false!" );
                 return( false );
                }
         //--- Если символы синхронизированы
         return( true );
        }

С помощью нее иногда получаю такую ошибку:

2018.07.24 15:14:27.415 Indicator (USDJPY,M5)   CheckSync: ОШИБКА #4014: SymbolIsSync(EURGBP) = false!

Т.е. индикатор запускается на USDJPY, и получаю ошибку с символа EURGBP. При этом есть открытый график EURGBP в терминале.

Ошибка 4014 говорит о том, что:

Системная функция не разрешена для вызова

Как такое может быть?

 
TheXpert:

да, как раз хотел вкинуть.

признаю, что неправ. если первый хендл открыт для записи, второй обязан добавлять флаг FILE_SHARE_WRITE

но есть еще коммент от a100 где вообще записи нет
В моем случае СервисДеск сейчас пишет что не может воспроизвести... соответственно требуется помощь зала... чуть позже я подробно распишу что и как 
 
Stanislav Korotky:

Я тоже MSDN читаю. Поясните, это - майкрософт английского не знает, или они сами свою документацию не читают, или - последний вариант - флаги в MQL названы по аналогии WinApi но работают по-другому?

Взято вот отсюда - https://docs.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-createfilea

FILE_SHARE_READ - Enables subsequent open operations on a file or device to request read access. Otherwise, other processes cannot open the file or device if they request read access.

FILE_SHARE_WRITE - Enables subsequent open operations on a file or device to request write access. Otherwise, other processes cannot open the file or device if they request write access.

Исходя из этого, первой программе достаточно указать флаг FILE_SHARE_READ для того чтобы вторая смогла читать. FILE_SHARE_WRITE требуется указать только в случае, когда известно, что помимо первой программы в файл будет писать и вторая.

Приведите пример в разнице поведения?


По приведённой ссылке, описание флагов не даёт представления о том, как правильно их использовать при попытке открыть один и тот же файл несколько раз.

Основываясь на данных из приведённого Вами описания, попробуйте ответить на вопрос, будут ли валиднымы четвёртый (hread_1) и пятый (hread_2) вызовы в примере ниже?

   HANDLE hwrite     =::CreateFile(L"test.txt", GENERIC_WRITE,FILE_SHARE_READ,                   nullptr,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,nullptr);

   HANDLE hread_fail =::CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_READ,                   nullptr,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,nullptr);
   HANDLE hread_ok   =::CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_WRITE,                  nullptr,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,nullptr);

   HANDLE hread_1    =::CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_WRITE,                  nullptr,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,nullptr);
   HANDLE hread_2    =::CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ,  nullptr,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,nullptr);

Сразу скажу ответ: эти вызовы будут невалидными

 
Stanislav Korotky:

Я тоже MSDN читаю. Поясните, это - майкрософт английского не знает, или они сами свою документацию не читают, или - последний вариант - флаги в MQL названы по аналогии WinApi но работают по-другому?

Взято вот отсюда - https://docs.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-createfilea

FILE_SHARE_READ - Enables subsequent open operations on a file or device to request read access. Otherwise, other processes cannot open the file or device if they request read access.

FILE_SHARE_WRITE - Enables subsequent open operations on a file or device to request write access. Otherwise, other processes cannot open the file or device if they request write access.

Исходя из этого, первой программе достаточно указать флаг FILE_SHARE_READ для того чтобы вторая смогла читать. FILE_SHARE_WRITE требуется указать только в случае, когда известно, что помимо первой программы в файл будет писать и вторая.

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

 
Alexey Viktorov:

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

Я именно это и говорю, именно так понимаю документацию MS (в частности, тот, кто открывает файл на запись, может разрешить другим совместное чтение). А тот прием использования флагов, который рекомендован для решения, предполагает обратное - что второй процесс с помощью флага совместной записи разрешает себе чтение записываемого файла (т.е. как бы в обход первого процесса поднимает себе права, даже несмотря на то, что первый процесс не указал разрешения на совместный доступ при записи). Это даже звучит противоестественно. Ну да ладно, пойду читать толкования.

 
Stanislav Korotky:

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

Может разрешить не только чтение, но и запись тоже. И если предполагается совместная запись, то в каждом должна быть разрешена совместная запись.

Stanislav Korotky:

А тот прием использования флагов, который рекомендован для решения, предполагает обратное - что второй процесс с помощью флага совместной записи разрешает себе чтение записываемого файла (т.е. как бы в обход первого процесса поднимает себе права, даже несмотря на то, что первый процесс не указал разрешения на совместный доступ при записи). Это даже звучит противоестественно. Ну да ладно, пойду читать толкования.

А это ошибочно. Себе никогда ничего не разрешает и не поднимает себе никаких прав. Флаги FILE_SHARE_READ и FILE_SHARE_WRITE относятся к атрибутам открытого файла. Если в атрибутах нет разрешения от процесса которым файл уже занят, то и использовать этот файл не получится пока его не освободят.

Вот и получается, в тех примерах: Первый открыл файл для записи, разрешил другим процессам чтение, а второй при открытии пытается запретить(не разрешить) запись тому кто уже этот файл использует. Тут-то и получает облом... Типа, кто первый встал тому и тапки...