Librerie: Mappatura dei file senza DLL - pagina 8

 
o_O:
Ho scritto che CMemMapFile::Open restituisce un codice di errore o 0 se non ci sono errori.

All'inizio della conversazione ho pubblicato uno screenshot di ciò che la funzione CMemMapFile::Open restituisce.

Era 0 come se non ci fosse alcun errore.


Poi l'ho corretto per vedere se l'handle è NULL.

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

e come risultato ho ottenuto

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

Non c'è nessun errore, c'è un handle, cos'altro serve, direte voi... ma nessuno ha creato la visualizzazione del file... Ed è impossibile aprire una mappatura che non è stata creata.

O forse questa mappatura è stata creata da qualcun altro e io non ne sono a conoscenza????

Qualche programma crea una visualizzazione con questo nome esatto :-)

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

//--- creare il timer
//---
      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 forse questa mappatura è stata creata da qualcun altro e io non ne sono a conoscenza?

Qualche programma crea una mappatura con quel nome esatto :-)


Beh, hai creato qualcosa tu stesso prima di questo)

Il software lavora con la memoria in questo modo, non cancella nulla in una volta sola. Ecco perché i vecchi dati possono rimanere in giro ed essere aperti.

Ma quando si sovrascrive, non si apre. Probabilmente non hai fatto nulla tra le aperture.
 

Ottima libreria, usata insieme ai mutex per scrivere una copiatrice locale.

Come componente importante per il ricevitore, ho ottenuto la dimensione del file e ho costruito un ciclo a partire da essa,

Ho trovato alcuni bug - ArrayOutOfRange o mancanza di 4 byte.

Corretto

//------------------------------------------------------------------ Write
int CMemMapApi::Write(HANDLE64 hmem, const uchar &buf[], DWORD pos, int sz, DWORD &err) // scrivere il numero di byte specificato nella memoria
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // se non è aperto
        DWORD size=GetSize(hmem, err); if (pos+sz>size) { UnViewFile(view); return(-2); }; // se la dimensione è inferiore, uscire
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM); 
        memcpyX(src, view, size+HEAD_MEM); // ha preso il bytebuffer
        for(int i=0; i<sz; i++)
        { 
        src[pos+i+HEAD_MEM]=buf[i]; // scritto in memoria
        }
        memcpyX(view, src, size+HEAD_MEM); // copiato di nuovo
        UnViewFile(view); // ha chiuso la vista
        return(0); // restituito OK.
}
//------------------------------------------------------------------ Read
int CMemMapApi::Read(HANDLE64 hmem, uchar &buf[], DWORD pos, int sz, DWORD &err) // leggere dalla memoria il numero di byte specificato
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // se non è aperto
        DWORD size=GetSize(hmem, err); // abbiamo la dimensione
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM);
        memcpyX(src, view, size+HEAD_MEM); // ha preso il bytebuffer
        ArrayResize(buf, sz);
        int i=0; 
        for(i=0; i<sz && pos+i<size; i++) 
        {
        buf[i]=src[pos+i+HEAD_MEM]; // leggere i byte
        //i++;
        }
        UnViewFile(view); // ha chiuso la vista 
        return(i); // numero di byte copiati
}
 

Se creo un MMF con MQL5, lo scrivo e lo leggo.

Ma se creo l'MMF con un altro programma, quando cerco di scrivere o leggere da esso, si verifica un errore critico.

Qual è il problema?

 
Alex19791979:

Se creo un MMF con MQL5, lo scrivo e lo leggo.

Ma se creo l'MMF con un altro programma, quando cerco di scrivere o leggere da esso, si verifica un errore critico.

Qual è il problema?


Il club dei telepatici sta cercando di indovinare il numero dell'errore critico.

 
Alexey Volchanskiy:

Il club dei telepatici sta cercando di indovinare il numero dell'errore critico.

topikstarter è bloccato dall'influenza telepatica
 

MT5 messaggio di errore critico senza codice di errore. Se ci fosse un codice, sarebbe indicato.

 
Alex19791979:

Ma se ho creato MMF con un altro programma, quando cerco di scrivere o leggere da esso, si verifica un errore critico.

Qual è il problema?

- verificare che non vi siano errori all'apertura del file
- verificare il volume allocato disponibile per la lettura/scrittura in tutte le funzioni di lavoro con array/stringhe (tenere conto di 2 byte)
ecc.

 

Problema risolto.

È necessario scrivere e leggere i file MMF da un'applicazione di terze parti partendo da 4 byte, non da 0.

E per l'MT5 i 4 byte non vengono contati, anche se l'offset è 0.

Per questo motivo, quando un programma di terze parti scriveva a partire da 0 byte, si verificava un errore quando si cercava di leggere la MT5.

 
Alex19791979:

Problema risolto.

È necessario scrivere e leggere i file MMF da un'applicazione di terze parti a partire da 4 byte, non da 0.

E per la MT5 i 4 byte non vengono contati, anche se l'offset è 0.

Ecco perché quando avevo un programma di terze parti che scriveva a partire da 0 byte, quando ho provato a leggere l'MT5, si è verificato un errore.

Forse non si è tenuto conto del fatto che i primi byte della classe sono allocati per l'intestazione, dove viene memorizzata la dimensione del file?