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

 
o_O:

lib n'est pas lié à des sections, car le code peut théoriquement être exécuté dans différents processus.

Pour le contrôler, utilisez votre variante ou https://www.mql5.com/fr/code/1835 par exemple.

Ai-je bien compris que si un mutex est nommé, je peux obtenir son handle depuis n'importe quel processus, et pas seulement depuis metatrader ?
 
Al_key:
Ai-je bien compris que si le mutex est nommé, je peux obtenir son handle depuis n'importe quel processus, et pas seulement depuis metatrader ?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686931%28v=vs.85%29.aspx a trouvé la réponse moi-même. En effet, ils peuvent être partagés entre les processus.
 

Question pour l'auteur.

J'utilise la classe dans mt4. Si j'éteins et rallume le terminal, tout s'arrête de fonctionner. La solution n'est pas très pratique, il faut supprimer les Expert Advisors avant d'éteindre et les attacher après avoir allumé le terminal. Existe-t-il un moyen de contourner ce problème.

Et le deuxième. Je n'arrive pas à lire le mapping d'un fichier créé par un programme écrit en Delphi. Quelles peuvent être les nuances.

En bref, il s'agit de panneaux de trading fonctionnant sur plusieurs terminaux.

 
Dmitry Luck'janenko:


Si vous éteignez et rallumez le terminal, tout cesse de fonctionner. Il n'est pas très pratique de supprimer les EA avant d'éteindre le terminal et de les attacher après l'avoir rallumé. Existe-t-il un moyen de contourner ce problème ?

Il est nécessaire d'enregistrer et de voir ce qui se passe avec les fichiers lors d'une telle désinitialisation. il n'y a pas de verrou.

Je ne peux pas lire le mappage du fichier

Quelle est la fonction de winapi signifiée par "read" ?

 
o_O:

Il est nécessaire d'enregistrer et de voir ce qui arrive aux fichiers lors d'une telle désinitialisation. il n'y a pas de verrous.

Quelle fonction de winapi est concernée par "read" ?

Le fait est que la fonction

HANDLE64 CMemMapFile::Open(LPTSTR path, DWORD size, int mode=modeOpen)

renvoie toujours 0.


C'est pourquoi je ne peux pas vraiment comprendre si le fichier est ouvert.

Dans l'image ci-dessus se trouve le journal de l'Expert Advisor qui ouvre un fichier qui n'a pas encore été créé. Et il n'y a pas d'erreurs.

Peut-être que la fonction

CMemMapFile::Open

devrait être insérée non pas dans int OnInit(), mais quelque part plus loin, par exemple, dans OnTick(), mais comme le handle retourné est toujours 0, il n'y a pas de possibilité de faire une vérification pour éviter d'ouvrir le fichier constamment à chaque tick.

Et pour la deuxième question.

Dans Delphi, je crée une application qui crée un mappage de fichier. Lors de la connexion, des erreurs se produisent. A savoir des nombres qui ne sont pas correctement transmis. J'ai commencé à aligner avec {$Align Off}

J'ai obtenu d'autres erreurs comme Access violation read to 0x04E91000 in 'msvcrt.dll'.

Maintenant les données sont alignées normalement de 19 octets - "00:35:50.260 Panel v 1.00 GBPUSD.m,M5 : OnInitsizeof(PipeData)= 19".


mais lors de la lecture, toutes les données sont à zéro.

 
Dmitry Luck'janenko:

Le problème est que la fonction

renvoie toujours 0.

C'est pourquoi je ne peux pas vraiment comprendre si le fichier est ouvert.

C'est exact, CMemMapFile::Open renvoie un code d'erreur ou 0 lorsqu'il n'y a pas d'erreur.

(contrairement à CMemMapApi:, qui renvoie un handle ouvert et écrit l'erreur dans le paramètre passé).

Et le handle est dans m_hmem.



Dans delphi, vous créez une application qui crée un mappage de fichier. Lors de la connexion, des erreurs se produisent. A savoir des nombres qui ne sont pas passés correctement.

Prenez-vous en compte les octets DWORD réservés au début du fichier ?
 
o_O:


tenez-vous compte des octets DWORD réservés au début du fichier ?
4 octets ? je vais essayer, je ne l'ai pas fait.
 
Dmitry Luck'janenko:
4 octets ? je vais essayer, je n'ai pas compté.

regardez comment le fichier est écrit ou créé dans la source.

sur le paramètre m_size

 
o_O:

est correcte, CMemMapFile::Open renvoie un code d'erreur ou 0 s'il n'y a pas d'erreur.

(contrairement à CMemMapApi:, qui renvoie un handle ouvert et écrit l'erreur dans le paramètre passé).

Et le handle est dans m_hmem.


Prenez-vous en compte les octets DWORD réservés en début de fichier ?
2016.03.04 19:00:00.897 BuyNow Client v 1.03 USDCHF.m,M5 : BuyNow Client v 1.03.mq4, handle=8589934592


est m_hmem lors de l'ouverture d'un mappage de fichier inexistant. Comment déterminer s'il s'agit d'une erreur ou d'un handle ?

 
Dmitry Luck'janenko:

est m_hmem lors de l'ouverture d'un mappage de fichier inexistant. Comment déterminer s'il s'agit d'une erreur ou d'une poignée ?

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