Importación de funciones (#import)

Las funciones se importan desde los módulos compilados MQL5 (archivos *.ex5) y desde los módulos del sistema operativo (archivos *.dll). El nombre del módulo se indica en la directiva #import. Para que el compilador pueda hacer correctamente la llamada a la función importada y organizar el correcto traspaso de parámetros, hace falta la descripción completa de las funciones. La descripción de la función sigue directamente después de la directiva #import "nombre de módulo". El nuevo comando #import (puede ir sin parámetros) cierra el bloque de descripción de las funciones importadas.

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

Las funciones importadas pueden tener cualquier nombre. Las funciones con nombres iguales pueden ser importadas a la vez desde diferentes módulos. Las funciones importadas pueden tener nombres que coincidan con los nombres de las funciones built-in. La operación de resolución de contexto determina cuál de las funciones tiene que ser invocada.

La orden de búsqueda del archivo especificado tras la palabra clave #import se describe en la sección Llamadas a las funciones importadas.

Dado que las funciones importadas se encuentran fuera del módulo compilado, el compilador no puede comprobar si los parámetros pasados son correctos. Así que para evitar los errores de ejecución, hay que describir con exactitud la composición y el orden de los parámetros pasados a las funciones importadas. Los parámetros pasados a funciones importadas (tanto de EX5, como de DLL-módulos) pueden tener valores por defecto.

En funciones importadas no se puede usar lo siguiente en calidad de parámetros:

Las clases, arrays de cadenas o objetos complejos que contienen las cadenas y/o arrays dinámicos de cualquier tipo no se puede pasar como parámetros a las funciones importadas de DLL.

Ejemplos:

#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

 

Para importar funciones durante la ejecución del programa mql5 se usa la aligación temprana. Eso significa que la biblioteca se carga durante el proceso de carga del programa ex5 que la utilice.

No se recomienda usar el nombre totalmente calificado del módulo cargable del tipo Drive:\Directory\FileName.Ext. Las bibliotecas MQL5 se cargan de la carpeta terminal_dir\MQL5\Libraries.

Si la función importada tiene diferentes variantes de llamada para las versiones de 32 y 64 bits de Windows, entonces será necesario importar ambas y llamar de forma explícita la variante necesaria de la función con la ayuda de la variable _IsX64.

Ejemplo:

#import "user32.dll"
//--- para el sistema de 32 bits
int    MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- para el sistema 64 bits
int    MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//|  MessageBox_32_64_bit usa la variante necesaria de MessageBoxW()   |
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
  {
   int res=-1;
   //--- si tenemos la versión de 64 bits de Windows
   if(_IsX64)
     {
      ulong hwnd=0;
      res=MessageBoxW(hwnd,"Ejemplo de llamada de la versión de 64 bits de MessageBoxW","MessageBoxW 64 bit",MB_OK|MB_ICONINFORMATION);
     }
   else  // tenemos la versión de 32 bits de Windows
     {
      uint hwnd=0;
      res=MessageBoxW(hwnd,"Ejemplo de llamada de la versión de 32 bits de 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);
  }

Importando funciones de bibliotecas .NET

Para trabajar con las funciones de una biblioteca .NET, basta con importar la propia DLL sin indicar funciones concretas. El MetaEditor importará automáticamente todas las funciones con las que se pueda trabajar:

  • Las estructuras sencillas (POD, plain old data), son estructuras que contienen solo tipos sencillos de datos.
  • Las funciones estáticas públicas en cuyos parámetros se usan solo tipos sencillos y estructuras POD o sus matrices.

Para llamar las funciones de una biblioteca, solo tiene que importarlas:

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

El código C# de la función Inc de la clase TestClass tiene el aspecto siguiente:

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

Como resultado de la ejecución, el script retornará el valor 42.

Véase también

Inclusión de archivos