Importer une Fonction (#import)

Les fonctions sont importées depuis des modules MQL5 compilés (fichiers *.ex5) et des modules du système d'exploitation (fichiers *.dll). Le nom du module est spécifié dans la directive #import. Pour que le compilateur puisse former correctement l'appel à la fonction importée et organiser la transmission des paramètres correctement, la description complète des fonctions est nécessaire. Les descriptions des fonctions suivent immédiatement la directive #import "nom_module". La nouvelle commande #import (peut être sans paramètres) termine le bloc des descriptions des fonctions importées.

#import "nom_du_fichier"
    func1 define;
    func2 define;
    ...
    funcN define;
#import

Les fonctions importées peuvent avoir plusieurs noms. Les fonctions ayant le même nom mais des modules différents peuvent être importés en même temps. Les fonctions importées peuvent avoir des noms qui correspondent aux noms des fonctions intégrées. L'opération de résolution de portée définit quelles fonctions doivent être appelées.

L'ordre de recherche d'un fichier spécifié après le mot-clé #import est décrit dans Appel des Fonction Importées.

Puisque les fonctions importées sont en dehors du module compilé, le compilateur ne peut pas vérifier la validité des paramètres passés. Donc, pour éviter des erreurs d'exécution (runtime), la composition et l'ordre des paramètres passés aux fonctions importés doivent être décrits de façon précise. Les paramètres passés aux fonctions importées (à la fois des modules EX5 et DLL) peuvent avoir des valeurs par défaut.

Les suivants ne peuvent pas être utilisés comme paramètres des fonctions importées :

Les classes, tableaux de chaînes de caractères ou d'objets complexes qui contiennent des chaînes de caractères et/ou des tableaux dynamiques de n'importe quels types ne peuvent pas être passés comme paramètres aux fonctions importées des DLL.

Exemples :

#import "stdlib.ex5"
string ErrorDescription(int error_code);
int    RGB(int red_value,int green_value,int blue_value);
bool   CompareDoubles(double number1,double number2);
string DoubleToStrMorePrecision(double number,int precision);
string IntegerToHexString(int integer_number);
#import "ExpertSample.dll"
int    GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
double GetArrayItemValue(double &arr[],int,int);
bool   SetArrayItemValue(double &arr[],int,int,double);
double GetRatesItemValue(double &rates[][6],int,int,int);
#import

Pour importer des fonctions pendant l'exécution d'un programme mql5, la liaison anticipée (early binding) est utilisée. Cela signifie que la bibliothèque est chargée pendant le chargement d'un programme utilisant son programme ex5.

Il n'est pas recommandé d'utiliser le nom qualifié complet (fully qualified name) du module chargeable du type Lecteur:\Répertoire\NomFichier.Ext. Les bibliothèques MQL5 sont chargées à partir du répertoire rep_terminal\MQL5\Libraries.

Si la fonction importée a des versions d'appel différentes pour les versions de Windows 32 et 64 bits, les deux doivent être importées et la bonne version de la fonction sera appelée explicitement avec la variable _IsX64.

Exemple :

#import "user32.dll"
//--- Pour le système 32 bits
int    MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- Pour le système 64 bits
int    MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//|  MessageBox_32_64_bit utilise la bonne version de MessageBoxW()  |
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
  {
   int res=-1;
   //--- Si nous utilisons Windows 64 bits
   if(_IsX64)
     {
      ulong hwnd=0;
      res=MessageBoxW(hwnd,"Exemple d'appel à MessageBoxW 64 bits","MessageBoxW 64 bits",MB_OK|MB_ICONINFORMATION);
     }
   else  // Nous utilisons Windows 32 bits
     {
      uint hwnd=0;
      res=MessageBoxW(hwnd,"Exemple d'appel à MessageBoxW 32 bits","MessageBoxW 32 bits",MB_OK|MB_ICONINFORMATION);
     }
   return (res);
  }
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme                               |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int ans=MessageBox_32_64_bit();
   PrintFormat("MessageBox_32_64_bit a retourné %d",ans);
  }

Importer des fonctions de bibliothèques .NET

Pour utiliser les fonctions des bibliothèques .NET, importez simplement la DLL sans définir de fonctions spécifiques. MetaEditor importe automatiquement toutes les fonctions utilisables :

  • Structures simples (POD, plain old data) – structures qui ne contiennent que des types de données simples.
  • Fonctions statiques publiques ayant des paramètres, dans lesquelles seuls des types simples et des structures POD, ou leurs tableaux, sont utilisés.

Pour appeler des fonctions de la bibliothèque, il suffit de l'importer :

#import "TestLib.dll"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

Le code C# de la fonction Inc de TestClass ressemble à:

public class TestClass
  {
   public static void Inc(ref int x)
     {
      x++;
     }
  }

Le script retourne la valeur 42 comme résultat de l'exécution.

Voir aussi

Inclure des Fichiers