Importando Funções (#import)

Funções são importadas a partir de módulos MQL5 compilados (arquivos *.ex5) e a partir de módulos do sistema operacional (arquivos *.dll). O nome do módulo é especificado na diretiva #import. Para que o compilador formate corretamente a chamada da função importada e organize a correta transferência de parâmetros, é necessária uma descrição completa das funções. Descrições de função sucedem imediatamente à diretiva #import "nome do módulo". O novo comando #import (pode-se sem parâmetros) completa o bloco da descrição das funções importadas.

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

Funções importadas podem ter qualquer nome. Funções importadas podem ter qualquer nome. Você pode importar simultaneamente módulos - de diferentes funções - com o mesmo nome. Funções importadas podem ter nomes que coincidem com os nomes de funções internas. A operação de resolução de contexto determina quais das funções devem ser chamadas.

A ordem de pesquisa do arquivo especificado após a palavra-chave #import é descrita na seção Chamada de Funções Importadas.

Já que funções importadas estão do lado de fora do módulo compilado, o compilador não pode verificar a validade dos parâmetros passados. Portanto, para evitar erros em tempo de execução, deve-se descrever com precisão a composição e ordem dos parâmetros passados para funções importadas. Parâmetros passados para funções importadas (tanto de EX5, como de módulo DLL) podem ter valores por padrão.

Nas funções importadas, você não pode usar como parâmetros:

Nas funções importadas da DLL, você não pode passar - como parâmetros - classes, arrays de string ou objetos complexos contendo strings e/ou arrays dinâmicos de qualquer tipo.

Exemplos:

#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 funções durante a execução de um programa mql5, é usada vinculação inicial (early binding). Isso significa que a biblioteca é carregada durante a carga de um programa usando seu programa ex5.

Não é recomendado que usar o nome completo do módulo a carregar, como Drive:\Directory\FileName.Ext. Bibiliotecas MQ5 são carregadas a partir da pasta terminal_dir\MQL5\Libraries.

Se a função importada tiver diferentes opções de chamada para as versões de 32 e 64 bits do Windows, você deverá importar ambas e chamar explicitamente a variante de função desejada com ajuda da variável _IsX64.

Exemplo:

#import "user32.dll"
//--- para um sistema de 32 bits
int    MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- para um sistema de 64 bits
int    MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//|  MessageBox_32_64_bit usa a variação correta do  MessageBoxW()   |
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
  {
   int res=-1;
   // --- se tivermos o Windows de 64 bits
   if(_IsX64)
     {
      ulong hwnd=0;
      res=MessageBoxW(hwnd,"Exemplo de como chamar a versão de 64 bits do MessageBoxW","MessageBoxW 64 bit",MB_OK|MB_ICONINFORMATION);
     }
   else  // temos o Windows de 32 bits
     {
      uint hwnd=0;
      res=MessageBoxW(hwnd,"Exemplo de chamada de uma versão de 32 bits do 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 funções de bibliotecas .NET

Para trabalhar com as funções da biblioteca .NET, basta importar a própria DLL sem especificar funções específicas. O MetaEditor importa automaticamente todas as funções com as quais é possível o trabalho:

  • Estruturas simples (POD, plain old data), isto é, estruturas que contêm apenas tipos de dados simples.
  • Funções estáticas públicas cujos parâmetros usam apenas tipos simples e estruturas de POD ou seus arrays.

Para chamar funções da biblioteca, basta importá-la:

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

O código C# para a função Inc da classe TestClass é semelhante ao seguinte:

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

Como resultado, o script retornará o valor 42.

Veja Também

Incluindo Arquivos