Discussion de l'article "Se débarrasser des DLL auto-produites"

 

Un nouvel article Se débarrasser des DLL auto-produites a été publié :

Si la fonctionnalité du langage MQL5 n'est pas suffisante pour accomplir les tâches, un programmeur MQL5 doit utiliser des outils supplémentaires. Il doit passer à un autre langage de programmation et créer une DLL intermédiaire. MQL5 a la possibilité de présenter différents types de données et de les transférer vers l'API mais, malheureusement, MQL5 ne peut pas résoudre le problème concernant l'extraction de données à partir du pointeur accepté. Dans cet article, nous allons parsemer tous les « i » et montrer des mécanismes simples d'échange et de travail avec des types de données complexes.

Le diagramme 1 montre les tailles comparatives de certains types de données.

Tailles des différents types de données dans MQL5


La fonction Memcpy est nécessaire pour copier les données d'une zone de mémoire à une autre.
La figure 2 montre la copie de quatre octets.

Exemple de copie de 4 octets à l'aide de memcpy

Dans MQL5, cela se présente comme suit.

Auteur : ---

 
Merci pour l'article, question : lors de l'utilisation de la fonction memcpy, dans l'exemple nous avons écrit l'adresse en int, si le système est x64, devons-nous utiliser une variable long ? Comment peut-on savoir par programme quel est le système (x64, x86) ? Merci de votre compréhension.
 

Sur la question de long - vous pouvez, mais ce n'est pas nécessaire du tout, si vous utilisez int comme un récepteur de 4 octets de quelque chose comme ça à partir d'un tableau de caractères. (c'est-à-dire que vous passez exactement par le pointeur &).

Comment le savoir - ici vous pouvez http://forum.ixbt.com/topic.cgi?id=26:37968

 
sergeev:

Sur la question de long - vous pouvez, mais ce n'est pas nécessaire du tout, si vous utilisez int comme un récepteur de 4 octets de quelque chose comme ça à partir d'un tableau de caractères. (c'est-à-dire que vous passez exactement par le pointeur &).

Pour le savoir, vous pouvez consulter le site http://forum.ixbt.com/topic.cgi?id=26:37968.

Pouvez-vous préciser le temps d'échange dans cette structure (par exemple, pour 10 nombres au format Int) ?
 
shelandr:
Pouvez-vous apporter des précisions sur l'heure d'échange dans cette structure (par exemple, pour 10 nombres au format Int) ?

clarifier la question.

Je pense qu'il s'agit d'une question créative liée davantage au travail d'une bibliothèque éolienne qu'à mql.

 
Article très utile et instructif concernant le travail avec des API DLL externes. Merci beaucoup.
 

Bonjour. Bien que l'article ait été écrit il y a relativement longtemps, la question de l'échange de données avec des dll de bibliothèque est toujours d'actualité. J'ai moi-même été confronté récemment à la nécessité d'implémenter une certaine fonctionnalité et j'avais le choix entre écrire ma propre dll ou continuer à essayer d'utiliser les dll de la bibliothèque. J'ai opté pour cette dernière solution et j'ai naturellement été confronté à la difficulté de transférer des structures et de récupérer des données. Après avoir lu cet article, je n'ai pas bien saisi certains points qui, à mon avis, sont très compliqués. Dans cet article, lors du transfert d'une structure vers un environnement externe, il est suggéré d'utiliser un tableau comme zone de mémoire allouée dans laquelle la fonction de la bibliothèque placera le résultat et que nous devons convertir pour la suite du travail. J'ai très peu d'expérience dans ce domaine et mon raisonnement semblera peut-être amateur, mais je vais tout de même exprimer mon opinion dans l'espoir que des personnes intelligentes me corrigeront. Prenons un exemple simple mentionné dans un vieil article https://www.mql5.com/fr/articles/1543.

Cet article traite de la question de la recherche de fichiers au moyen de dll de bibliothèque. Il suggère également de passer un pointeur à un tableau de la taille requise et d'extraire ensuite les données requises de ce tableau.

Qu'est-ce qu'une structure ? Il s'agit de la même section de mémoire. Essayons maintenant de changer l'approche du passage des structures et de l'extraction des données :

// Déclarer les définitions des types de données

#define  DWORD int
#define  TCHAR short // Définir ce type, car nous allons travailler avec l'unicode
#define  MAX_PATH (260)

// Déclare la structure FILETIME
struct FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime; 
};

// Déclare la structure de données des résultats de la recherche
struct _WIN32_FIND_DATA {
  DWORD dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD nFileSizeHigh;
  DWORD nFileSizeLow;
  DWORD dwReserved0;
  DWORD dwReserved1;
  TCHAR cFileName[MAX_PATH];
  TCHAR cAlternateFileName[14]; 
};

// En déclarant des types de données, nous copions les structures WinAPI sans aucune modification.
// Importation d'une fonction de la bibliothèque
#import "kernel32.dll"
   int  FindFirstFileW(string path, _WIN32_FIND_DATA& answer);
#import 
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int OnInit()
  {
// Créer une variable avec le type de la structure précédemment créée 
   _WIN32_FIND_DATA data;
// Appeler la fonction de la bibliothèque, en passant un pointeur sur notre structure, et en fait sur la mémoire allouée. 
int handle = FindFirstFileW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\*.mq5", data);
   if(handle!=-1)
      {
        // Afficher le résultat de la recherche en accédant aux champs de notre structure sans conversion supplémentaire 
Print("Nom de fichier trouvé :", ShortArrayToString(data.cFileName));   
         Print("Nom du fichier temporairement trouvé : ", ShortArrayToString(data.cAlternateFileName));
         Print("Taille du fichier trouvée : ", data.nFileSizeLow); 
      }
//---
   return(INIT_SUCCEEDED);
  }
//+-
Групповые файловые операции
Групповые файловые операции
  • 2008.07.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Иногда требуется проделать одинаковые операции для некоторой группы файлов. Если у вас есть список файлов, входящих в эту группу, то это не проблема. Но если этот список нужно получить самостоятельно, то возникает вопрос: "Каким образом?" В статье предлагается сделать это с помощью функций FindFirstFile() и FindNextFile(), входящих в библиотеку kernel32.dll.
 
Алексей Барбашин: Il est également suggéré de passer un pointeur à un tableau de la taille requise et d'extraire ensuite les données requises de ce tableau. Il est également suggéré de passer un pointeur à un tableau de la taille requise et d'extraire ensuite les données requises de ce tableau.

Qu'est-ce qu'une structure ? Il s'agit de la même section de mémoire. Essayons maintenant de changer l'approche du passage des structures et de l'extraction des données :

J'ai collé votre code correctement dans l'éditeur

 
Rashid Umarov:

J'ai collé votre code correctement dans l'éditeur


Merci beaucoup ! Je n'ai pas encore trouvé comment formater le code correctement ici. (((

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

Merci beaucoup ! Je n'ai pas encore trouvé comment coder correctement ici. (((


Comment insérer le code.

 
Vladimir Karputov:

Comment insérer le code.


Je vous remercie ! Je vais y jeter un coup d'œil ! )))