Librerie: Mappatura dei file senza DLL - pagina 3

 
Urain:
Credo che dovremo fare una sorta di test garantito. Ma non so ancora come.

A rigor di logica, la chiusura di un handle provoca la liberazione dell'area di memoria.

Ma non significa che la chiusura dell'handle debba azzerare quest'area. L'handle viene chiuso, i dati scritti rimangono fino a quando non vengono sovrascritti da un altro software. è così che funziona.

 
sergeev:
Se si utilizzano file per la memorizzazione di dati intermedi, è possibile, naturalmente. L'importante è reimpostare i dati su disco in alcuni punti di riferimento, perché se succede qualcosa, le informazioni andranno irrimediabilmente perse.
Se "succede qualcosa", le informazioni effettive andranno perse in ogni caso. E i risultati intermedi, sì, si possono scaricare periodicamente in un file sulla ferrovia.
 
sergeev:

A rigor di logica, chiudendo l'handle si libera quest'area di memoria.

Ma non significa che la chiusura dell'handle debba azzerare quest'area. Chiuso l'handle, i dati scritti rimangono fino a quando non vengono sovrascritti da un altro software.

Il file viene chiuso, l'handle viene distrutto, apriamo un file con lo stesso nome e leggiamo le informazioni necessarie, anche se per idea l'area distribuita dovrebbe essere persa e l'apertura di un file distrutto senza averlo creato dovrebbe causare un errore. Non so se si tratta di un bug o di una funzionalità.

#include <MemMapLib.mqh>
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+
void OnStart()
  {
   CMemMapFile *hmem=new CMemMapFile();
   int err=hmem.Open("Local\\test",111,modeCreate);// creare un file

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

   CMemMapFile hm;
   err=hm.Open("Local\\test",111); // aprire il file, senza creare
   uchar nextdata[];
   hm.Seek(0,SEEK_SET);
   err=hm.Read(nextdata,sizedata); // leggi
   Print(CharArrayToString(nextdata));

   ArrayInitialize(data,0);
   err=hmem.Open("Local\\test",111); // aprire il file, senza creare
   hmem.Seek(0,SEEK_SET);
   err=hmem.Read(data,sizedata);     // leggi
   Print("a",CharArrayToString(data));

   hmem.Close(); delete hmem; // chiudere il file
   hm.Close();                // chiudere il file

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

anche se l'area distribuita dovrebbe essere persa e l'apertura di un file distrutto senza averlo creato dovrebbe causare un errore.

Credo che si tratti di un bug.

Il trucco è che c'è un nome di file in memoria. E il sistema lo rileva.

 

Gente, ho una richiesta.

Ho bisogno di trovare una funzione API - da qualsiasi API, comprese quelle non Windows - che non permetta di usare memcpy/strcpy .

Cioè trovare un caso in cui per qualche motivo la dimensione del puntatore restituito non sia nota, o la stringa restituita non sia NULL-terminata e senza dimensione nota.


Vi prego di aiutarmi a trovare i limiti di applicazione di questo metodo...

 

MT5 642 Win7 64 non funziona, per quanto ne so, dopo che

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // crea un oggetto di memoria

Ottengo l'errore 1400,

ma Vista 32 funziona.

 

Ho controllato e ho ricevuto lo stesso errore. Ma =6.

 
sergeev:

Ho controllato e ho ricevuto lo stesso errore. Ma =6.



Deve essere un trucco di qualche tipo. Al lancio diretto dà err=6, ma in modalità debug err=1400.

 
Come trasferire array di int o double? Non ci riesco :(
 
baramantan:
Come trasferire array di int o double? Non ci riesco :(
Trattateli come variabili lunghe di sizeof(<Type>)*<Number_Elements> e tutto funzionerà :)