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

 
o_O:
J'ai écrit que CMemMapFile::Open renvoie un code d'erreur ou 0 lorsqu'il n'y a pas d'erreur.

Au début de la conversation, j'ai posté une capture d'écran de ce que la fonction CMemMapFile::Open renvoie.

C'était 0, comme s'il n'y avait pas d'erreur.


Puis j'ai corrigé pour voir si le handle était NULL.

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

et comme résultat j'ai obtenu

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

Il n'y a pas d'erreur, il y a un handle, de quoi d'autre avez-vous besoin, me direz-vous... mais personne n'a créé l'affichage du fichier... Et il est impossible d'ouvrir un mapping qui n'a pas été créé.

Ou peut-être que ce mapping a été créé par quelqu'un d'autre et que je n'en ai pas connaissance ????

Un programme crée un affichage avec ce nom exact :-)

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

//--- créer un timer
//---
      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:


Ou peut-être que ce mapping a été créé par quelqu'un d'autre et que je n'en ai pas connaissance ?

Un programme crée un mapping avec ce nom exact :-)


Eh bien, vous avez créé quelque chose vous-même avant cela )

Le logiciel fonctionne avec la mémoire comme ça. Il n'efface rien d'un coup. C'est pourquoi les anciennes données peuvent rester en place et être ouvertes.

Mais lorsqu'elles sont écrasées, elles ne s'ouvrent pas. Vous n'avez probablement rien fait entre les ouvertures.
 

Excellente bibliothèque, je l'ai utilisée avec des mutex pour écrire un copieur local.

En tant que composant important pour le récepteur, j'ai obtenu la taille du fichier et j'ai construit une boucle à partir de celle-ci,

J'ai trouvé quelques bugs - ArrayOutOfRange ou manque de 4 octets.

Corrigé

//------------------------------------------------------------------ Write
int CMemMapApi::Write(HANDLE64 hmem, const uchar &buf[], DWORD pos, int sz, DWORD &err) // écrire le nombre d'octets spécifié dans la mémoire
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // s'il n'est pas ouvert
        DWORD size=GetSize(hmem, err); if (pos+sz>size) { UnViewFile(view); return(-2); }; // si la taille est plus petite, quitter
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM); 
        memcpyX(src, view, size+HEAD_MEM); // a pris le bytebuffer
        for(int i=0; i<sz; i++)
        { 
        src[pos+i+HEAD_MEM]=buf[i]; // écrit dans la mémoire
        }
        memcpyX(view, src, size+HEAD_MEM); // l'a recopié
        UnViewFile(view); // ferme la vue
        return(0); // a retourné OK.
}
//------------------------------------------------------------------ Read
int CMemMapApi::Read(HANDLE64 hmem, uchar &buf[], DWORD pos, int sz, DWORD &err) // lit dans la mémoire le nombre d'octets spécifié
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // s'il n'est pas ouvert
        DWORD size=GetSize(hmem, err); // a obtenu la taille
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM);
        memcpyX(src, view, size+HEAD_MEM); // a pris le bytebuffer
        ArrayResize(buf, sz);
        int i=0; 
        for(i=0; i<sz && pos+i<size; i++) 
        {
        buf[i]=src[pos+i+HEAD_MEM]; // lecture d'octets
        //i++ ;
        }
        UnViewFile(view); // ferme la vue 
        return(i); // nombre d'octets copiés
}
 

Si je crée une MMF avec MQL5 et que j'y écris, puis que je la lis.

Mais si je crée une MMF avec un autre programme, une erreur critique se produit lorsque j'essaie d'écrire ou de lire à partir de cette MMF.

Quel est le problème ?

 
Alex19791979:

Si je crée une MMF avec MQL5 et que j'y écris, puis que je la lis.

Mais si je crée une MMF avec un autre programme, une erreur critique se produit lorsque j'essaie d'écrire ou de lire à partir de cette MMF.

Quel est le problème ?


Le club des télépathes s'efforce de deviner le numéro de l'erreur critique.

 
Alexey Volchanskiy:

Le club des télépathes tente de deviner le numéro de l'erreur critique.

topikstarter est bloqué par l'influence télépathique
 

Message d'erreur critique MT5 sans code d'erreur. S'il y avait un code, il serait indiqué.

 
Alex19791979:

Mais si j'ai créé le MMF avec un autre programme, lorsque j'essaie d'écrire ou de lire à partir du MMF, une erreur critique se produit.

Quel est le problème ?

- vérifier qu'il n'y a pas d'erreurs lors de l'ouverture du fichier
- vérifier le volume alloué disponible pour la lecture/écriture dans toutes les fonctions de travail avec des tableaux/chaînes (prendre en compte 2 octets)
etc.

 

Problème résolu.

Il est nécessaire d'écrire et de lire les fichiers MMF par une application tierce à partir de 4 octets, et non de 0.

Et pour MT5, 4 octets ne sont pas comptés, même si l'offset est de 0.

C'est pourquoi, lorsqu'un programme tiers écrivait à partir de 0 octet, une erreur se produisait lors de la lecture du MT5.

 
Alex19791979:

Problème résolu.

Il est nécessaire d'écrire et de lire les fichiers MMF par une application tierce à partir de 4 octets, et non de 0.

Et pour MT5, 4 octets ne sont pas comptés, même si l'offset est de 0.

C'est pourquoi lorsque j'avais un programme tiers qui écrivait à partir de 0 octet, lorsque j'essayais de lire MT5, une erreur se produisait.

Peut-être n'avez-vous pas tenu compte du fait que les premiers octets de la classe sont alloués à l'en-tête, où la taille du fichier est stockée ?