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

 
o_o:

Au moins, vous n'essayez pas de lire un fichier en mémoire après avoir redémarré l'ordinateur...


Je comprends donc que je ne peux pas transférer des données en mémoire entre deux terminaux de cette manière ?

Et quelle est la bonne méthode ? J'ai besoin d'implémenter le transfert d'une chaîne de texte d'un terminal à l'autre en utilisant MemMapLib.mqh.

 
Иван:

Je comprends donc que je ne peux pas transférer des données par l'intermédiaire de la mémoire entre deux terminaux de cette manière ?

Vous pouvez le faire.

Vous devez implémenter le transfert d'une ligne de texte d'un terminal à l'autre en utilisant MemMapLib.mqh.

Créez un fichier, écrivez-le, puis lisez-le.

A peu près dans cet ordre

https://www.mql5.com/fr/code/10571

 
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);

Quelle est la quantité maximale de données que je peux écrire dans un fichier ouvert en mémoire et lire ensuite ?

Après 4096, l'Expert Advisor commence à se bloquer.

 
Donnez-moi le code et l'impression
[Supprimé]  
HANDLE64 CMemMapFile::Open(LPTSTR path, DWORD size, int mode=modeOpen) 
{ 
m_size=size; m_path=path; m_mode=mode; m_pos=0; // начальное положение 
if (m_path=="") return(-1); 
m_hmem=Open(m_path, size, mode, err); 
if (m_hmem==NULL) return(err); // если ошибка создания 
return(0); 
} 

Bonjour, dans le code ci-dessus "return(0)" doit être corrigé en "return(m_hmem)", sinon il ne renverra pas le handle du fichier mappé en mémoire.

 

J'ai essayé d'écrire une chaîne de 200 caractères dans un fichier, j'ai obtenu une erreur de dépassement de la taille du tableau à la ligne 214 de la bibliothèque. Il s'avère que la taille de l'en-tête n'est pas prise en compte lors de la détermination de la taille du tableau de réception.

 
Алексей Барбашин:

Il fonctionne.

ne fonctionne pas.

Donnez-moi le code et le fuseau

 
o_o:

Cela ne fonctionne pas.

Donnez-moi le code et l'impression


   string control_text = "Notre maman pleure fort parce que tout le monde se goinfre. Chut maman, ne pleure pas ! Les autres ont la même merde...";
   string NAME_MAPPING = "Local\\" + Symbol() + "_" + (string)ChartID();
        
   uchar Data_sender[];
   int size_data = StringToCharArray(control_text, Data_sender);

  //--- Créer un objet mémoire
   CMemMapFile* MappingFile = new CMemMapFile();
  //--- Créer un fichier pour l'enregistrement
   long err = MappingFile.Open(NAME_MAPPING, size_data+4, modeCreate);
        
  //--- Écriture des données dans le fichier
   err = MappingFile.Write(Data_sender, size_data);
        
  //--- Fermer l'enregistrement
   MappingFile.Close();
  //--- Supprimer le pointeur
   delete MappingFile;
   
   uchar Data_receiver[];
   ArrayResize(Data_receiver, size_data);
   
   //--- Créer un objet mémoire
   CMemMapFile* MF = new CMemMapFile();
   //--- Ouvrir le fichier en lecture
   err = MF.Open(NAME_MAPPING, size_data+4, modeOpen);
   //--- Сдвигаем указатель чтения на начало файла
   MF.Seek(0,SEEK_SET);
   //--- Читаем данные из файла
   err=MF.Read(Data_receiver, size_data);
   //--- Fermer le fichier 
   MF.Close();
  //--- Supprimer le pointeur
   delete MF;

   Print(CharArrayToString(Data_receiver));

J'ai trouvé les dimensions. Mais j'ai essayé de lire le fichier avec un autre objet et j'ai obtenu un silence sur la sortie. Où est l'erreur ?

 
Алексей Барбашин:

J'ai trouvé les dimensions. Mais j'ai essayé de lire le fichier avec un autre objet et j'ai obtenu un silence sur la sortie. Où est l'erreur ?

//--- Fermer l'enregistrement

Il ne s'agit pas de fermer un enregistrement, mais de fermer et de supprimer un fichier.

C'est pourquoi

//--- Ouvrir le fichier en lecture
vous essayez d'ouvrir quelque chose qui n'existe pas.
 
o_o:

il ne s'agit pas de fermer l'enregistrement, mais de fermer et d'effacer le fichier.

c'est pourquoi

vous essayez d'ouvrir quelque chose qui n'existe pas.

D'accord, c'est logique. Je suivais l'analogie avec le travail sur des fichiers ordinaires, lorsque la fermeture conduit exactement à la fermeture et à la libération, et non à la suppression du fichier.