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

 
o_O:
Escribí que CMemMapFile::Open devuelve un código de error o 0 cuando no hay error.

Al principio de la conversación publiqué una captura de pantalla de lo que devuelve la función CMemMapFile::Open.

Era 0 como si no hubiera error.


Luego lo corregí para ver si el handle es NULL.

Print(__FILE__,", handle=",MapFile.m_hmem);

y como resultado obtuve

2016.03.04 19:00:00.897 BuyNow Client v 1.03 USDCHF.m,M5: BuyNow Client v 1.03.mq4, handle=8589934592

No hay error, hay un handle, qué más necesita, dirá usted... pero nadie creó la visualización del archivo... Y es imposible abrir una cartografía que no ha sido creada.

O tal vez este mapeo fue creado por otra persona y yo no lo sé????

Algún programa crea una visualización con este nombre exacto :-)

#define HADER "BuyNow v10"
CMemMapFile MapFile;
long handl;
int OnInit()
  {

//--- crear temporizador
//---
      EventSetMillisecondTimer(Timer);
      handl=MapFile.Open(StringConcatenate("Local\\","_",HADER,"_",GetSymbol(),"_",((ServerAccauntNumber==0) ?  AccountNumber():ServerAccauntNumber)),BUF_SIZE+HEAD_MEM,modeOpen);
      Print(__FILE__,", handle=",MapFile.m_hmem);
//---
   return(INIT_SUCCEEDED);
  }
 

Dmitry Luck'janenko:


O tal vez este mapeo fue creado por otra persona y yo no lo sé ???.

Algún programa crea un mapeo con ese nombre exacto :-)


Bueno, has creado algo tu mismo antes de eso )

el software simplemente trabaja con la memoria así. No borra nada de una vez. Es por eso que los datos antiguos pueden colgar alrededor y ser abierto.

Pero cuando se sobrescribe, no se abrirá. Usted probablemente no hizo nada entre las aperturas.
 

Excelente librería, la usé junto con mutexes para escribir un copiador local

Como componente importante para el receptor obtuve el tamaño del archivo y construí un bucle a partir de él,

Encontré algunos bugs - ArrayOutOfRange o falta de 4 bytes.

Arreglado

//------------------------------------------------------------------ Write
int CMemMapApi::Write(HANDLE64 hmem, const uchar &buf[], DWORD pos, int sz, DWORD &err) // escribir el número especificado de bytes en la memoria
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // si no está abierto
        DWORD size=GetSize(hmem, err); if (pos+sz>size) { UnViewFile(view); return(-2); }; // si el tamaño es menor, salir
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM); 
        memcpyX(src, view, size+HEAD_MEM); // tomó el bytebuffer
        for(int i=0; i<sz; i++)
        { 
        src[pos+i+HEAD_MEM]=buf[i]; // escrito en memoria
        }
        memcpyX(view, src, size+HEAD_MEM); // copiado de nuevo
        UnViewFile(view); // cerrar la vista
        return(0); // devuelto OK.
}
//------------------------------------------------------------------ Read
int CMemMapApi::Read(HANDLE64 hmem, uchar &buf[], DWORD pos, int sz, DWORD &err) // leer de la memoria el número especificado de bytes
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // si no está abierto
        DWORD size=GetSize(hmem, err); // tengo el tamaño
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM);
        memcpyX(src, view, size+HEAD_MEM); // tomó el bytebuffer
        ArrayResize(buf, sz);
        int i=0; 
        for(i=0; i<sz && pos+i<size; i++) 
        {
        buf[i]=src[pos+i+HEAD_MEM]; // leer bytes
        //i++;
        }
        UnViewFile(view); // cerrar la vista 
        return(i); // número de bytes copiados
}
 

Si creo MMF a través de MQL5 y escribo en él y luego lo leo.

Pero si creo el MMF con otro programa, cuando intento escribir o leer en él, se produce un error crítico.

¿Cuál es el problema?

 
Alex19791979:

Si creo MMF a través de MQL5 y escribo en él y luego lo leo.

Pero si creo el MMF con otro programa, cuando intento escribir o leer en él, se produce un error crítico.

¿Cuál es el problema?


El club de telépatas se esfuerza por adivinar el número del error crítico.

 
Alexey Volchanskiy:

El club de los telépatas trata tensamente de adivinar el número del error crítico.

topikstarter está bloqueado de la influencia telepática
 

MT5 mensaje de error crítico sin código de error. Si hubiera un código, se indicaría.

 
Alex19791979:

Pero si he creado MMF con otro programa, cuando intento escribir o leer desde él, se produce un error crítico.

¿Cuál es el problema?

- compruebe si no hay errores al abrir el archivo
- compruebe el volumen asignado disponible para lectura/escritura en todas las funciones de trabajo con arrays/cadenas (tenga en cuenta 2 bytes)
etc.

 

Problema solucionado.

Es necesario escribir y leer archivos MMF por una aplicación de terceros a partir de 4 bytes, no desde 0.

Y para MT5 no se cuentan 4 bytes, aunque el offset sea 0.

Por eso cuando un programa de terceros escribía desde 0 byte, se producía un error al intentar leer MT5.

 
Alex19791979:

Problema solucionado.

Es necesario escribir y leer archivos MMF por una aplicación de terceros a partir de 4 bytes, no desde 0.

Y para MT5 no se cuentan 4 bytes, aunque el offset sea 0.

Por eso cuando tenía un programa de terceros escribiendo desde 0 byte, al intentar leer MT5, se producía un error.

¿Quizás no tuviste en cuenta que los primeros bytes de la clase se asignan para la cabecera, donde se almacena el tamaño del fichero?