[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 558

 

Hola a todos. Estoy tratando de escribir una función que escriba un archivo en un directorio especificado por el usuario (trabajando fuera del sandbox).

He escrito el código utilizando la biblioteca"ZI_File_Functions_Full_Lib"https://www.mql5.com/ru/code/8577

La función"PathFunctions.dll."https://www.mql5.com/ru/code/10873 no es adecuado ya que funciona con Vista, yo tengo Windows 7.

Todas las cosas innecesarias eliminadas como la lectura no es necesaria, sólo tomar el directorio y allí crear el archivo con el valor que se conoce inicialmente, eso es todo.

Preguntas:

1. No consigo averiguar dónde está el valor que estamos escribiendo en el archivo.

2. No puedo localizar el lugar donde está escrito el error...

Gracias de antemano.

//===============================================================================================================================================================
//     Импортируемые функции.
//===============================================================================================================================================================

#import "ntdll.dll"
int RtlGetLastWin32Error();
int RtlSetLastWin32Error (int dwErrCode);
#import
#include <WinKernel32.mqh>                                      // Заголовочный файл библиотеки "kernel32.dll" функций API Windows XP.

//===============================================================================================================================================================
// Объявленные константы.
//===============================================================================================================================================================

#define FILE_FULL_CREATE    0                                   // Создать или переписать файл.

//===============================================================================================================================================================
//    Функция открывает или создаёт файл.
//    Функция открывает/создает файл для ввода и/или вывода. Если при открытии для записи файла нет, то он будет создан. Для создания директории
//    используется функция "CreateDirectory()". Функция возвращает: handle - файловый описатель, если функция выполнилась без ошибки;
//                                                               -1     - возникла системная ошибка;
//                                                               -2     - ошибка при перемещении файлового указателя в конец файла;
//                                                               -3     - указан недопустимый способ открытия файла.
//===============================================================================================================================================================
int start(){
   int FileOpenFull (string PathName="D:\files\DATA.csv",      // Имя файла с абсолютным путём.
                     int    ModeCWR=0)                         // Способ открытия файла: 0 - FILE_FULL_CREATE    Открытие файла для записи. Если файл существует, то содержимое файла будет
                                                               //                                                уничтожено. Если файл с таким именем не существует, то будет создан новый.
    {
     int Error;                                                // Номер последней ошибки.
     int Handle;                                               // Файловый описатель.
//===============================================================================================================================================================
  RtlSetLastWin32Error(0);                                                                                              // Обнуляем ошибку.
  if (ModeCWR != FILE_FULL_READ)                                                                                        // Если функция вызвана не для чтения, проверяем на наличие файла.
   {                                                                                                                    // Проверяем на наличие файла. Читаем файл.
    Handle = CreateFileA (PathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (RtlGetLastWin32Error() == 2 && Handle == -1) ModeCWR = FILE_FULL_CREATE;                                        // Файла нет. Создаём файл.
    else
     {
      if (!CloseHandle (Handle))
       {
        Error = RtlGetLastWin32Error();
        Print ("Ошибка в функции \"FileOpenFull()\". Файл с путём \"", PathName, "\" не закрыт при проверки на наличие. Последняя ошибка: \"", Error, "\". ", StringError (Error));
        return (-1);
       }
     }
    RtlSetLastWin32Error(0);                                                                                            // Обнуляем ошибку.
   }
   
//===============================================================================================================================================================
//     Переключатель по способам открытия файла.
//===============================================================================================================================================================
  
  switch (ModeCWR)
   {                                                                                                                    // Создаём файл.
    case FILE_FULL_CREATE:
     {
      Handle = CreateFileA (PathName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
      if (Handle == -1)
       {
        Error = RtlGetLastWin32Error();
        Print ("Ошибка в функции \"FileOpenFull()\". Файл с путём \"", PathName, "\" не открыт. Последняя ошибка: \"", Error, "\". ", StringError (Error));
       }
      return (Handle);
     }
    
//===============================================================================================================================================================
//     Функция закрытия файла.
//     Функция закрывает ранее открытый файл. Если файл закрыт успешно, функция возвращает TRUE, иначе возвращает FALSE.
//===============================================================================================================================================================

   bool FileCloseFull (int Handle)                                                                                   // Файловый описатель, возвращаемый функцией "FileOpenFull()".
    {
     int Error;                                                                                                      // Номер последней ошибки.
     //----
     RtlSetLastWin32Error (0);
     if (!CloseHandle (Handle))
      {
       Error = RtlGetLastWin32Error();
       Print ("Ошибка в функции \"FileCloseFull()\". Последняя ошибка: \"", Error, "\". ", StringError (Error));
       return (false);
      }
     else return (true);
    }

//===============================================================================================================================================================
//    Функция возвращает код системной ошибки.
//===============================================================================================================================================================

   int SystemError()
    {
     return (RtlGetLastWin32Error());
    }
 
//===============================================================================================================================================================
//    Функция возвращает строковое описание кода системной ошибки.
//===============================================================================================================================================================

   string StringError (int ErrorCode)                                                     // Код системной ошибки.
    {
     int    i;
     string String = "";
     //----
     int    Buffer[128];
     //----
     ArrayInitialize (Buffer, 0);
     FormatMessageA (0x1000, 0, ErrorCode, 0, Buffer, ArraySize (Buffer), 0);
     //----
     for (i = 0; i < ArraySize (Buffer); i++)
      {
       String = String + CharToStr (Buffer[i]       & 0xFF)
                       + CharToStr (Buffer[i] >>  8 & 0xFF)
                       + CharToStr (Buffer[i] >> 16 & 0xFF)
                       + CharToStr (Buffer[i] >> 24 & 0xFF);
      }
     return (StringTrimRight (String));
    }
//===============================================================================================================================================================
//    Конец
//===============================================================================================================================================================
}
 
merkulov.artem:

Hola a todos. Estoy tratando de escribir una función que escriba un archivo en un directorio especificado por el usuario (trabajando fuera del sandbox).

He escrito el código utilizando la biblioteca"ZI_File_Functions_Full_Lib"https://www.mql5.com/ru/code/8577

La función"PathFunctions.dll."https://www.mql5.com/ru/code/10873no es adecuado ya que funciona con Vista, yo tengo Windows 7.

Todas las cosas innecesarias eliminadas como la lectura no es necesaria, sólo tomar el directorio y allí crear el archivo con el valor que se conoce inicialmente, eso es todo.

Preguntas:

1. No consigo averiguar dónde está el valor que estamos escribiendo en el archivo.

2. No puedo localizar donde está escrito un error?

Gracias de antemano.

¡Artyom! ¿Dónde está escrito que no funciona con Windows 7? ¿Por qué lees con tan poca atención? No me sorprende que no te funcione.



He mirado tu código y me he dado cuenta de que no sabes programar. Tome primero el ejemplo de la ayuda. Hazlo. Vea cómo funciona. Luego pasa a cosas más complicadas.

Primero se crea o se abre un archivo. Entonces, escríbalo o léalo. Entonces ciérralo. Acabas de copiar las declaraciones de la función en el inicio. Has arrancado un trozo de código de una función universal. Ahora sólo está colgado ahí. No tiene nada que ver con nada. ¿Para qué es eso? No funcionará.

 
Buenas tardes, ¿podríais decirme cómo cerrar el probador de estrategias, qué tengo que pulsar?
 
angelina8:
Buenas tardes, ¿podríais decirme cómo cerrar el probador de estrategias, qué tengo que pulsar?

 
Puede pulsar Ctrl+R, o el botón - en el menú de mt4, que está marcado en rojo en la ilustración de arriba.
 
¿Qué documento tengo que subir a mi cuenta personal?
 
angelina8:
¿Qué documento tengo que subir a mi cuenta personal?

¿Para qué?
 
para retirar fondos
 
angelina8:
para retirar fondos


Depende de la empresa de corretaje. Yo, por ejemplo, tengo una copia de mi pasaporte y un cuestionario
 
¿Una copia de los pasaportes 1, 2 y 11? ¿Cuál es la forma?
Razón de la queja: