Import der Funktionen (#import)

Import der Funktionen wird von kompilierten Moduls MQL5 (Dateien *.ex5) und aus Moduls des Operationssystems (Dateien *.dll) durchgeführt. Modulname wird in der befehlenden Anweisung #import angegeben. Damit der Compiler den Aufruf der importierenden Funktion richtig durchführen und richtige Parameterübergabe gestalten kann, ist völlige Beschreibung der Funktionen notwendig. Funktionsbeschreibungen folgen unmittelbar der befehlenden Anweisung #import "Modulname". Neuer Befehl #import (möglich auch ohne Parameter) beendet Beschreibungsblock der importierender Funktionen.

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

Zu importierende Funktionen können verschiedene Namen haben. Importiert kann aus verschiedenen Modulen der Funktion mit gleichen Namen gleichzeitig werden. Zu importierende Funktionen können Namen haben, die mit den Namen interner Funktionen zusammenfallen. Operation von Kontexterlaubnis bestimmt, welche Funktion aufgerufen muss.

Die Suchreihenfolge nach der Datei, die nach der Schlüsselwort #import angegeben ist, ist in der Sektion Aufruf der Importfunktionen beschrieben.

Da sich zu importierende Funktionen ausser compilierten Moduls befinden, kann der Compiler Richtigkeit der übertragenen Parameter nicht prüfen. Darum um  Ausführungsfehler zu vermeiden muss man genau Inhalt und Ordnung der Parameter beschreiben, die in importierte Funktionen übertragen werden. Parameter, übertragen in importierte Funktionen (sowie aus EX5, als auch aus DLL-Modulen) können Default-Werte haben.

In importierten Funktionen können als Parameter nicht verwendet werden:

In die aus  DLL importierten Funktionen können als Parameter keine Klassen, Zeilenfelder oder komplizierte Objekte übertragen werden, die Zeilen und/oder dynamische Felder verschiedener Typen enthalten.

Beispiele:

#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

 

für Importieren der Funktionen während der Durchführung eines mql5-Programms wird frühe Bindung verwendet. Das bedeutet, dass Bibliothek während der Ladung des ex5-Programm geladen wird, das sie verwendet.

Es ist nicht empfehlenswert, den vollständig qualifizierten Namen des geladeten Moduls des Typs Drive:\Directory\FileName.Ext zu verwenden. Die MQL5 Bibliotheken werden aus dem Ordner terminal_dir\MQL5\Libraries geladen.

Wenn die zu importierende Funktion verschiedene Aufrufvarianten für die 32- und 64-Bit-Versionen von Windows hat, müssen beide importiert werden und die benötigte Variante der Funktion muss mithilfe der Variablen _IsX64 explizit aufgerufen werden.

Beispiel:

#import "user32.dll"
//--- für das 32-Bit-System
int    MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- für das 64-Bit-System
int    MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//| MessageBox_32_64_bit verwendet die richtige MessageBoxW() Version|
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
 { 
   int res=-1;
   //--- wenn wir das 64-Bit-Windows verwenden
   if(_IsX64)
    { 
      ulong hwnd=0;
      res=MessageBoxW(hwnd,"Beispiel für den Aufruf der 64-Bit-Version von MessageBoxW","MessageBoxW 64 bit",MB_OK|MB_ICONINFORMATION);
     }
   else  // wir verwenden das 32-Bit-Windows
    { 
      uint hwnd=0;
      res=MessageBoxW(hwnd,"Beispiel für den Aufruf der 32-Bit-Version von MessageBoxW","MessageBoxW 32 bit",MB_OK|MB_ICONINFORMATION);
     }
   return (res);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 { 
+//---+
   int ans=MessageBox_32_64_bit();
   PrintFormat("MessageBox_32_64_bit returned %d",ans);
  }

Importieren von Funktionen aus den .NET-Bibliotheken

Um mit .NET-Bibliotheksfunktionen zu arbeiten, importieren Sie einfach die DLL selbst, ohne bestimmte Funktionen zu definieren. MetaEditor importiert automatisch alle Funktionen, mit denen man arbeiten kann:

  • Einfache Strukturen (einfache, alte Daten oder POD, plain old data) — Strukturen, die nur einfache Datentypen beinhalten.
  • 'Public static' Funktionen mit Parametern, bei denen nur einfache Typen und POD-Strukturen oder deren Arrays verwendet werden.

Um Funktionen aus der Bibliothek aufzurufen, importieren Sie sie einfach:

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

Der C#-Code der Funktion Inc() aus TestClass schaut wie folgt aus:

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

Als Ergebnis der Ausführung gibt das Skript den Wert 42 zurück.

Siehe auch

Include Dateien