Bibliotheken: Abbildungsdateien ohne DLL - Seite 8

 
o_O:
Ich schrieb, dass CMemMapFile::Open einen Fehlercode oder 0 zurückgibt, wenn kein Fehler vorliegt.

Zu Beginn der Konversation habe ich einen Screenshot gepostet, was die Funktion CMemMapFile::Open zurückgibt.

Es war 0, als ob es keinen Fehler gäbe.


Dann habe ich es korrigiert, um zu sehen, ob das Handle NULL ist.

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

und als Ergebnis bekam ich

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

Es gibt keinen Fehler, es gibt ein Handle, was brauchen Sie noch, werden Sie sagen... aber niemand hat die Dateianzeige erstellt... Und es ist unmöglich, ein Mapping zu öffnen, das noch nicht erstellt wurde.

Oder vielleicht wurde dieses Mapping von jemand anderem erstellt und ich weiß nichts davon????

Irgendein Programm erstellt eine Anzeige mit genau diesem Namen :-)

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

//--- Zeitschaltuhr erstellen
//---
      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:


Oder vielleicht wurde dieses Mapping von jemand anderem erstellt und ich weiß nichts davon...?

Irgendein Programm erstellt ein Mapping mit genau diesem Namen :-)


Na ja, du hast ja vorher selbst etwas erstellt )

die Software arbeitet einfach so mit dem Speicher. Sie löscht nicht alles auf einmal. Deshalb können alte Daten hängen bleiben und geöffnet werden.

Aber wenn es überschrieben wird, lässt es sich nicht öffnen. Du hast wahrscheinlich nichts zwischen den Öffnungen gemacht.
 

Ausgezeichnete Bibliothek, habe sie zusammen mit Mutexen benutzt, um einen lokalen Kopierer zu schreiben

Als wichtige Komponente für den Empfänger habe ich die Dateigröße ermittelt und daraus eine Schleife gebaut,

Ich habe ein paar Fehler gefunden - ArrayOutOfRange oder fehlende 4 Bytes.

Behoben

//------------------------------------------------------------------ Write
int CMemMapApi::Write(HANDLE64 hmem, const uchar &buf[], DWORD pos, int sz, DWORD &err) // Schreiben der angegebenen Anzahl von Bytes in den Speicher
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // wenn nicht geöffnet
        DWORD size=GetSize(hmem, err); if (pos+sz>size) { UnViewFile(view); return(-2); }; // wenn die Größe kleiner ist, beenden
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM); 
        memcpyX(src, view, size+HEAD_MEM); // nahm den Bytebuffer
        for(int i=0; i<sz; i++)
        { 
        src[pos+i+HEAD_MEM]=buf[i]; // in den Speicher geschrieben
        }
        memcpyX(view, src, size+HEAD_MEM); // zurückkopiert
        UnViewFile(view); // Schließen der Ansicht
        return(0); // OK zurückgegeben.
}
//------------------------------------------------------------------ Read
int CMemMapApi::Read(HANDLE64 hmem, uchar &buf[], DWORD pos, int sz, DWORD &err) // Lesen der angegebenen Anzahl von Bytes aus dem Speicher
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // wenn nicht geöffnet
        DWORD size=GetSize(hmem, err); // hat die Größe
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM);
        memcpyX(src, view, size+HEAD_MEM); // nahm den Bytebuffer
        ArrayResize(buf, sz);
        int i=0; 
        for(i=0; i<sz && pos+i<size; i++) 
        {
        buf[i]=src[pos+i+HEAD_MEM]; // Bytes lesen
        //i++;
        }
        UnViewFile(view); // Schließen der Ansicht 
        return(i); // Anzahl der kopierten Bytes
}
 

Wenn ich ein MMF mit MQL5 erstelle und darin schreibe und es dann lese.

Wenn ich jedoch ein MMF mit einem anderen Programm erstelle, tritt beim Versuch, es zu beschreiben oder zu lesen, ein kritischer Fehler auf.

Worin besteht das Problem?

 
Alex19791979:

Wenn ich ein MMF mit MQL5 erstelle und darin schreibe und es dann lese.

Wenn ich jedoch ein MMF mit einem anderen Programm erstelle, tritt beim Versuch, es zu beschreiben oder zu lesen, ein kritischer Fehler auf.

Wo liegt das Problem?


Der Club der Telepathen bemüht sich, die Nummer des kritischen Fehlers zu erraten.

 
Alexey Volchanskiy:

Der Club der Telepathen versucht angespannt, die Zahl des kritischen Fehlers zu erraten.

topikstarter ist gegen telepathischen Einfluss blockiert
 

MT5 kritische Fehlermeldung ohne Fehlercode; wenn es einen Code gäbe, würde er angezeigt.

 
Alex19791979:

Wenn ich jedoch ein MMF mit einem anderen Programm erstellt habe, tritt beim Versuch, es zu beschreiben oder zu lesen, ein kritischer Fehler auf.

Wo liegt das Problem?

- Prüfen Sie, ob beim Öffnen der Datei keine Fehler auftreten
- Prüfen Sie das verfügbare zugewiesene Volumen für das Lesen/Schreiben in allen Funktionen der Arbeit mit Arrays/Strings (berücksichtigen Sie 2 Bytes)
usw.

 

Problem gelöst.

Es ist notwendig, MMF-Dateien durch eine Drittanbieter-Anwendung zu schreiben und zu lesen, beginnend mit 4 Bytes, nicht mit 0.

Und für MT5 werden 4 Bytes nicht gezählt, auch wenn der Offset 0 ist.

Deshalb trat ein Fehler auf, wenn ein Drittanbieterprogramm ab 0 Byte schrieb und versuchte, MT5 zu lesen.

 
Alex19791979:

Problem gelöst.

Es ist notwendig, MMF-Dateien durch eine Drittanbieter-Anwendung zu schreiben und zu lesen, beginnend mit 4 Bytes, nicht mit 0.

Und für MT5 werden 4 Bytes nicht gezählt, auch wenn der Offset 0 ist.

Wenn ich also ein Drittanbieterprogramm hatte, das ab 0 Byte schrieb, trat beim Versuch, MT5 zu lesen, ein Fehler auf.

Vielleicht haben Sie nicht bedacht, dass die ersten Bytes in der Klasse für den Header reserviert sind, in dem die Dateigröße gespeichert ist?