Bibliotheken: Abbildungsdateien ohne DLL - Seite 3

 
Urain:
Ich denke, wir müssen eine Art Garantietest durchführen. Aber ich weiß noch nicht, wie.

Logisch gesehen führt das Schließen eines Handles dazu, dass der Speicherbereich freigegeben wird.

Aber das bedeutet nicht, dass das Schließen des Handles diesen Bereich auf Null setzen sollte. Das Handle wird geschlossen, die geschriebenen Daten bleiben erhalten, bis sie von anderer Software überschrieben werden. so ist es.

 
sergeev:
Wenn Sie Dateien zur Zwischenspeicherung von Daten verwenden, können Sie das natürlich tun. Das Wichtigste ist, dass Sie die Daten an bestimmten Referenzpunkten auf die Festplatte zurücksetzen, denn wenn etwas passiert, sind die Informationen unwiederbringlich verloren.
Wenn "etwas passiert", sind die eigentlichen Informationen auf jeden Fall verloren. Und Zwischenergebnisse, ja, die kann man periodisch in eine Datei auf der Bahn auslagern.
 
sergeev:

Logischerweise wird durch das Schließen des Handles dieser Speicherbereich freigegeben.

Aber das bedeutet nicht, dass das Schließen des Handles diesen Bereich auf Null zurücksetzt. Wenn das Handle geschlossen wird, bleiben die geschriebenen Daten erhalten, bis sie von anderer Software überschrieben werden.

Die Datei wird geschlossen, der Handle wird zerstört, wir öffnen eine Datei mit dem gleichen Namen und lesen die notwendigen Informationen, obwohl der verteilte Bereich eigentlich verloren sein sollte und das Öffnen einer zerstörten Datei, ohne sie zu erstellen, einen Fehler verursachen sollte. Ich weiß nicht, ob dies ein Fehler oder ein Feature ist.

#include <MemMapLib.mqh>
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
   CMemMapFile *hmem=new CMemMapFile();
   int err=hmem.Open("Local\\test",111,modeCreate);// eine Datei erstellen

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

   CMemMapFile hm;
   err=hm.Open("Local\\test",111); // die Datei öffnen, ohne sie zu erstellen
   uchar nextdata[];
   hm.Seek(0,SEEK_SET);
   err=hm.Read(nextdata,sizedata); // lesen
   Print(CharArrayToString(nextdata));

   ArrayInitialize(data,0);
   err=hmem.Open("Local\\test",111); // die Datei öffnen, ohne sie zu erstellen
   hmem.Seek(0,SEEK_SET);
   err=hmem.Read(data,sizedata);     // lesen
   Print("zu",CharArrayToString(data));

   hmem.Close(); delete hmem; // Schließen der Datei
   hm.Close();                // Schließen der Datei

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

obwohl der verteilte Bereich verloren gehen sollte und das Öffnen einer zerstörten Datei, ohne sie zu erstellen, einen Fehler verursachen sollte.

Ich denke, das ist ein Fehler.

Der Trick ist, dass es einen Dateinamen im Speicher gibt. Und das System erkennt ihn.

 

Leute, ich habe eine Anfrage.

Ich muss eine solche API-Funktion finden - von jeder API, auch von Nicht-Windows-Funktionen - die es nicht erlaubt, memcpy/strcpy zu verwenden.

D.h. ich muss einen Fall finden, in dem aus irgendeinem Grund die Größe des zurückgegebenen Zeigers nicht bekannt ist, oder die zurückgegebene Zeichenkette nicht NULL-terminiert und ohne bekannte Größe ist.


Bitte helfen Sie mir, die Grenzen der Anwendung dieser Methode zu finden...

 

MT5 642 Win7 64 funktioniert nicht, soweit ich es verstehe, nach

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // Speicherobjekt erstellen

Ich erhalte Fehler 1400,

aber Vista 32 funktioniert.

 

Ich habe es überprüft und den gleichen Fehler erhalten. Aber =6.

 
sergeev:

Ich habe es überprüft und den gleichen Fehler erhalten. Aber =6.



Das muss eine Art Trick sein. Beim direkten Start gibt es err=6, aber im Debug-Modus err=1400.

 
Wie überträgt man int oder double Arrays? Ich kann es nicht tun :(
 
baramantan:
Wie überträgt man int oder double Arrays? Ich kann es nicht tun :(
behandle sie als lange Variablen von sizeof(<Type>)*<Number_Elements> und alles wird funktionieren :)