Funzione di importazione (#import)

Le funzioni sono importate da moduli compilati MQL5 (files *.ex5) e dai moduli del sistema operativo (files *.dll). Il nome del modulo è specificato nella direttiva #import. Per far si che il compilatore sia in grado di formare correttamente la chiamata della funzione importata ed organizzare la corretta trasmissione dei parametri, la descrizione completa delle funzioni è necessaria. Descrizioni delle funzioni immediatamente dopo la direttiva #import "nome modulo". Nuovo comando #import (può essere senza parametri) completa il blocco di descrizioni delle funzioni importate.

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

Funzioni importate possono avere qualsiasi nome. Funzioni aventi gli stessi nomi, ma da diversi moduli possono essere importate contemporaneamente. Funzioni importate possono avere nomi che coincidono con i nomi delle funzioni incorporate. L' operazione di risoluzione ambito definisce quale delle funzioni dovrebbe essere chiamata.

L'ordine di ricerca di un file specificato dopo la parola chiave #import è descritto in Chiamata delle Funzioni Importate.

Poiché le funzioni importate sono al di fuori del modulo compilato, il compilatore non è in grado di verificare la validità dei parametri passati. Pertanto, per evitare errori di run-time, si deve descrivere con precisione la composizione e l'ordine dei parametri passati alle funzioni importate. I parametri passati alle funzioni importate (sia da EX5, e dal modulo DLL) possono avere valori di default.

I seguenti non possono essere utilizzati per i parametri di funzioni importate:

Le classi, array di stringhe o oggetti complessi che contengono stringhe e/o array dinamici di ogni tipo non possono essere passati come parametro alle funzioni importate dalla DLL.

Esempi:

#import "stdlib.ex5"
string ErrorDescription(int error_code);
int    RGB(int valore_rosso,int valore_verde,int valore_blu);
bool   CompareDoubles(double number1,double number2);
string DoubleToStrMorePrecision(double numero,int precisione);
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

Per importare le funzioni durante l'esecuzione di un programma di MQL5, viene utilizzata l'associazione anticipata. Ciò significa che la libreria viene caricata durante il caricamento di un programma con il suo programma EX5.

Non è raccomandato l'uso di un nome completo qualificato del modulo caricabile del tipo Unità:\Cartella\NomeFile.Ext. Le librerie MQL5 vengono caricate dalla cartella terminal_dir\MQL5\Libraries.

Se la funzione importata ha versioni di chiamata diverse per le versioni Windows a 32 e 64 bit, entrambe dovrebbero essere importate, e la versione corretta della funzione dovrebbe essere chiamata esplicitamente usando la variabile _IsX64.

Esempio:

#import "user32.dll"
//--- Per il sistema a 32 bit
int    MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- Per il sistema a 64 bit
int    MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//| MessageBox_32_64_bit utilizza la versione corretta di MessageBoxW|
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
  {
   int res=-1;
   //--- Se stiamo usando Windows a 64 bit
   if(_IsX64)
     {
      ulong hwnd=0;
      res=MessageBoxW(hwnd,"64-bit MessageBoxW call example","MessageBoxW 64 bit",MB_OK|MB_ICONINFORMATION);
     }
   else  // Stiamo usando Windows a 32-bit
     {
      uint hwnd=0;
      res=MessageBoxW(hwnd,"32-bit MessageBoxW esempio di chiamata","MessageBoxW 32 bit",MB_OK|MB_ICONINFORMATION);
     }
   return (res);
  }
//+------------------------------------------------------------------+
//| Funzione Start programma Script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int ans=MessageBox_32_64_bit();
   PrintFormat("MessageBox_32_64_bit ha restituito %d",ans);
  }

Importazione di funzioni da librerie .NET

Per lavorare con le funzioni di libreria .NET, è sufficiente importare la DLL stessa senza definire funzioni specifiche. MetaEditor importa automaticamente tutte le funzioni con cui è possibile lavorare:

  • Strutture semplici (POD, semplici vecchi dati) — strutture che contengono solo tipi di dati semplici.
  • Funzioni statiche pubbliche aventi parametri in cui vengono utilizzati solo tipi semplici e strutture POD o i loro array

Per chiamare le funzioni dalla libreria, è sufficiente importarle:

#import "TestLib.dll"
//+------------------------------------------------------------------+
//| Funzione Start del programma Script                              |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

Il codice C# della funzione Inc di TestClass ha il seguente aspetto:

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

Come risultato dell'esecuzione, lo script restituisce il valore di 42.

Vedi anche

Inclusione Files