Bibliotecas: Mapeado de Ficheros sin la DLL - página 10

 
o_o:

Al menos no intentas leer un archivo en memoria después de reiniciar el ordenador...


¿Entonces entiendo que no puedo transferir datos a través de la memoria entre dos terminales de esta manera?

¿Y cuál es la forma correcta? Necesito implementar la transferencia de una cadena de texto de un terminal a otro usando MemMapLib.mqh.

 
Иван:

¿Entonces entiendo que no puedo transferir datos a través de la memoria entre dos terminales de esta manera?

sí puedes

Tienes que implementar la transferencia de una cadena de texto de un terminal a otro utilizando MemMapLib.mqh.

crear un archivo, escribirlo y luego leerlo.

aproximadamente en este orden

https://www.mql5.com/es/code/10571

 
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);

¿Cuál es la cantidad máxima de datos que puedo escribir en un archivo abierto en la memoria y luego leer?

Después de 4096 el Asesor Experto comienza a estrellarse en este punto.

 
Dame el código y la impresión
[Eliminado]  
HANDLE64 CMemMapFile::Open(LPTSTR path, DWORD size, int mode=modeOpen) 
{ 
m_size=size; m_path=path; m_mode=mode; m_pos=0; // начальное положение 
if (m_path=="") return(-1); 
m_hmem=Open(m_path, size, mode, err); 
if (m_hmem==NULL) return(err); // если ошибка создания 
return(0); 
} 

Hola, en el código de arriba "return(0)" debe ser corregido en "return(m_hmem)", de lo contrario no devolverá el handle del archivo mapeado en memoria.

 

Intenté escribir una cadena de 200 caracteres de longitud en un archivo, obtuve un error de exceder el tamaño del array en la línea 214 de la librería. Resulta que el tamaño de la cabecera no se tiene en cuenta a la hora de determinar el tamaño del array receptor.

 
Алексей Барбашин:

Funciona.

No funciona.

Dame el código y el eje

 
o_o:

No funciona.

Dame el código y la impresión


   string control_text = "Nuestra mami está llorando a mares porque todo el mundo está comiendo mucho. ¡Calla mami, no llores! Los otros tienen la misma mierda...";
   string NAME_MAPPING = "Local\\" + Symbol() + "_" + (string)ChartID();
        
   uchar Data_sender[];
   int size_data = StringToCharArray(control_text, Data_sender);

  //--- Crear un objeto de memoria
   CMemMapFile* MappingFile = new CMemMapFile();
  //--- Crear un archivo para grabar
   long err = MappingFile.Open(NAME_MAPPING, size_data+4, modeCreate);
        
  //--- Escribir datos en el fichero
   err = MappingFile.Write(Data_sender, size_data);
        
  //--- Cerrar el registro
   MappingFile.Close();
  //--- Borrar el puntero
   delete MappingFile;
   
   uchar Data_receiver[];
   ArrayResize(Data_receiver, size_data);
   
   //--- Crear un objeto de memoria
   CMemMapFile* MF = new CMemMapFile();
   //--- Abrir el archivo para lectura
   err = MF.Open(NAME_MAPPING, size_data+4, modeOpen);
   //--- Сдвигаем указатель чтения на начало файла
   MF.Seek(0,SEEK_SET);
   //--- Читаем данные из файла
   err=MF.Read(Data_receiver, size_data);
   //--- Cierra el archivo 
   MF.Close();
  //--- Borrar el puntero
   delete MF;

   Print(CharArrayToString(Data_receiver));

He descubierto las dimensiones. Pero he intentado leer el archivo con otro objeto y me sale silencio en la salida. ¿Dónde está el error?

 
Алексей Барбашин:

He averiguado las dimensiones. Pero intenté leer el archivo con otro objeto y obtuve silencio en la salida. ¿Dónde está el error?

//--- Cerrar el registro

No se llama cerrar un registro, se llama cerrar y borrar un archivo.

que es por lo que

//--- Abrir el archivo para lectura
estás intentando abrir algo que no existe.
 
o_o:

no se llama cerrar el registro, se llama cerrar y borrar el archivo.

que es por lo que

estás intentando abrir algo que no existe.

Ok, eso tiene sentido. Estaba siguiendo la analogía de trabajar con archivos normales, cuando cerrar lleva exactamente a cerrar y liberar, no a borrar el archivo.