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

 
Urain:
Supongo que tenemos que hacer algún tipo de prueba garantizada. Pero aún no sé cómo.

Lógicamente, cerrar un handle hace que se libere el área de memoria.

Pero no significa que cerrar el handle deba borrar esta área a cero. El handle se cierra, los datos escritos permanecen hasta que son sobrescritos por otro software. así es como es.

 
sergeev:
Si utilizas archivos para almacenar datos intermedios, puedes hacerlo, por supuesto. Lo principal es restablecer los datos en el disco en algunos puntos de referencia, porque si pasa algo, la información se perderá irremediablemente.
Si "pasa algo", la información real se perderá en cualquier caso. Y los resultados intermedios, sí, puedes volcarlos periódicamente a un fichero en el ferrocarril.
 
sergeev:

Lógicamente, cerrando el handle se liberará esta zona de memoria.

Pero esto no significa que cerrando el handle se libere esta área a cero. Handle cerrado, los datos escritos permanecen hasta que son sobreescritos por otro software. por lo que sucede así.

Se cierra el fichero, se destruye el handle, abrimos un fichero con el mismo nombre y leemos la información necesaria, aunque por idea el área distribuida debería perderse y abrir un fichero destruido sin crearlo debería provocar un error. No se si esto es un bug o una feature.

#include <MemMapLib.mqh>
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
   CMemMapFile *hmem=new CMemMapFile();
   int err=hmem.Open("Local\\test",111,modeCreate);// crear un fichero

   uchar data[];
   int sizedata=StringToCharArray("Hello from MQL5!",data);
   err=hmem.Write(data,sizedata);  // escribir
   ArrayInitialize(data,0);

   CMemMapFile hm;
   err=hm.Open("Local\\test",111); // abrir el fichero, sin crear
   uchar nextdata[];
   hm.Seek(0,SEEK_SET);
   err=hm.Read(nextdata,sizedata); // leer
   Print(CharArrayToString(nextdata));

   ArrayInitialize(data,0);
   err=hmem.Open("Local\\test",111); // abrir el fichero, sin crear
   hmem.Seek(0,SEEK_SET);
   err=hmem.Read(data,sizedata);     // leer
   Print("to",CharArrayToString(data));

   hmem.Close(); delete hmem; // cerrar el archivo
   hm.Close();                // cerrar el archivo

   ArrayInitialize(data,0);
   err=hm.Open("Local\\test",111);Print("err=",err);
   hm.Seek(0,SEEK_SET);
   err=hm.Read(data,sizedata);
   Print("después",CharArrayToString(data));
  }
//+------------------------------------------------------------------+
 
Urain:

aunque el área distribuida debería perderse y abrir un archivo destruido sin crearlo debería provocar un error.

Creo que es un error.

El truco está en que hay un nombre de fichero en memoria. Y el sistema lo detecta.

 

Amigos, tengo una petición.

Necesito encontrar una función API - de cualquier API, incluyendo las que no son de Windows - que no permita usar memcpy/strcpy .

Es decir, encontrar un caso en el que por alguna razón no se conozca el tamaño del puntero devuelto, o la cadena devuelta no esté terminada en NULL y sin tamaño conocido.


Por favor, ayúdame a encontrar los límites de la aplicación de este método...

 

MT5 642 Win7 64 no funciona, según tengo entendido, después de

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // crear objeto de memoria

Me da error 1400,

pero en Vista 32 funciona.

 

Lo he comprobado y me da el mismo error. Pero =6.

 
sergeev:

Lo he comprobado y me da el mismo error. Pero =6.



Debe ser un truco de algún tipo. En lanzamiento directo da err=6, pero en modo debug err=1400.

 
¿Cómo transferir matrices int o double? No puedo hacerlo :(
 
baramantan:
¿Cómo transferir matrices int o double? No puedo hacerlo :(
trátalos como variables long de sizeof(<Tipo>)*<Numero_Elementos> y todo funcionará :)