Bibliothèque: Mappage de fichiers sans DLL - page 3

 
Urain:
Je suppose que nous devons faire une sorte de test garanti. Mais je ne sais pas encore comment.

Logiquement, la fermeture d'un handle entraîne la libération de la zone de mémoire, mais cela ne signifie pas que la fermeture du handle doit remettre cette zone à zéro.

Mais cela ne signifie pas que la fermeture du handle doit remettre cette zone à zéro. le handle est fermé, les données écrites restent jusqu'à ce qu'elles soient écrasées par un autre logiciel. c'est comme ça que ça se passe.

 
sergeev:
Si vous utilisez des fichiers pour stocker des données intermédiaires, vous pouvez bien sûr le faire. L'essentiel est de réinitialiser les données sur le disque à certains points de référence, car si quelque chose se produit, l'information sera irrémédiablement perdue.
Si "quelque chose arrive", l'information réelle sera perdue dans tous les cas. En ce qui concerne les résultats intermédiaires, il est possible de les transférer périodiquement dans un fichier sur le chemin de fer.
 
sergeev:

Logiquement, la fermeture de la poignée libère cette zone de mémoire, mais cela ne signifie pas que la fermeture de la poignée doit remettre cette zone à zéro.

Mais cela ne signifie pas que la fermeture du handle doit remettre cette zone à zéro. Le handle fermé, les données écrites restent jusqu'à ce qu'elles soient écrasées par d'autres logiciels.

Le fichier est fermé, le handle est détruit, nous ouvrons un fichier avec le même nom et lisons les informations nécessaires, bien que par idée la zone distribuée devrait être perdue et l'ouverture d'un fichier détruit sans le créer devrait provoquer une erreur. Je ne sais pas s'il s'agit d'un bogue ou d'une fonctionnalité.

#include <MemMapLib.mqh>
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart()
  {
   CMemMapFile *hmem=new CMemMapFile();
   int err=hmem.Open("Local\\test",111,modeCreate);// créer un fichier

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

   CMemMapFile hm;
   err=hm.Open("Local\\test",111); // ouvrir le fichier, sans le créer
   uchar nextdata[];
   hm.Seek(0,SEEK_SET);
   err=hm.Read(nextdata,sizedata); // lire
   Print(CharArrayToString(nextdata));

   ArrayInitialize(data,0);
   err=hmem.Open("Local\\test",111); // ouvrir le fichier, sans le créer
   hmem.Seek(0,SEEK_SET);
   err=hmem.Read(data,sizedata);     // lire
   Print("à",CharArrayToString(data));

   hmem.Close(); delete hmem; // fermer le fichier
   hm.Close();                // fermer le fichier

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

bien que la zone distribuée soit perdue et que l'ouverture d'un fichier détruit sans l'avoir créé provoque une erreur.

Je pense qu'il s'agit d'un bogue.

Le truc, c'est qu'il y a un nom de fichier en mémoire. Et le système le détecte.

 

J'ai une requête à formuler.

J'ai besoin de trouver une fonction API - de n'importe quelle API, y compris celles qui ne sont pas sous Windows - qui ne permettra pas d'utiliser memcpy/strcpy .

C'est-à-dire trouver un cas où, pour une raison quelconque, la taille du pointeur retourné ne sera pas connue, ou la chaîne retournée ne sera pas terminée par NULL et n'aura pas de taille connue.


Merci de m'aider à trouver les limites de l'application de cette méthode...

 

MT5 642 Win7 64 ne fonctionne pas, d'après ce que j'ai compris, après que

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path) ; // créer un objet mémoire

J'obtiens l'erreur 1400,

mais Vista 32 fonctionne.

 

J'ai vérifié, j'ai eu la même erreur. Mais =6.

 
sergeev:

J'ai vérifié, j'ai eu la même erreur. Mais =6.



Il doit s'agir d'une sorte d'astuce. Au lancement direct il donne err=6, mais en mode debug err=1400.

 
Comment transférer des tableaux int ou double ? Je n'y arrive pas :(
 
baramantan:
Comment transférer des tableaux int ou double ? Je n'y arrive pas :(
traitez-les comme des variables longues de sizeof(<Type>)*<Number_Elements> et tout fonctionnera :)