Импорт функций (#import)

Импорт функций осуществляется из откомпилированных модулей MQL5 (файлы *.ex5) и из модулей операционной системы (файлы *.dll). Имя модуля указывается в директиве #import. Для того чтобы компилятор мог правильно оформить вызов импортируемой функции и организовать правильную передачу параметров, необходимо полное описание функций. Описания функций следуют непосредственно за директивой #import "имя модуля". Новая команда #import (можно без параметров) завершает блок описания импортируемых функций.

#import "имя_файла"
    func1 define;
    func2 define;
    ...
    funcN define;
#import

Импортируемые функции могут иметь любые имена. Можно одновременно импортировать из разных модулей функции с одинаковыми именами. Импортируемые функции могут иметь имена, совпадающие с именами встроенных функций. Операция разрешения контекста определяет, какая из функций должна вызываться.

Порядок поиска файла, указанного после ключевого слова #import, описан в разделе Вызов импортируемых функций.

Так как импортируемые функции находятся вне компилируемого модуля, компилятор не может проверить правильность передаваемых параметров. Поэтому, во избежание ошибок выполнения, необходимо точно описывать состав и порядок параметров, передаваемых в импортируемые функции. Параметры, передаваемые в импортируемые функции (как из EX5, так и из DLL-модулей), могут иметь значения по умолчанию.

В импортируемых функциях в качестве параметров нельзя использовать:

В импортируемые из DLL функции нельзя передавать в качестве параметра классы, массив строк или сложные объекты, содержащие строки и/или динамические массивы любых типов.

Примеры:

#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

 

Для импорта функций во время выполнения mql5-программы используется раннее связывание. Это значит, что библиотека загружается в процессе загрузки использующей ее ex5-программы.

Не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида Drive:\Directory\FileName.Ext. Библиотеки MQL5 загружаются из папки terminal_dir\MQL5\Libraries.

Если импортируемая функция имеет разные варианты вызова для 32-х и 64-х битной версий Windows, то необходимо импортировать оба и явно вызывать нужный вариант функции с помощью переменной _IsX64.

Пример:

#import "user32.dll"
//--- для 32-х битной системы
int    MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- для 64-х битной системы
int    MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//|  MessageBox_32_64_bit использует нужный вариант  MessageBoxW()   |
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
  {
   int res=-1;
   //--- если у нас 64-битная Windows
   if(_IsX64)
     {
      ulong hwnd=0;
      res=MessageBoxW(hwnd,"Пример вызова 64-битной версии MessageBoxW","MessageBoxW 64 bit",MB_OK|MB_ICONINFORMATION);
     }
   else  // у нас 32-битная Windows
     {
      uint hwnd=0;
      res=MessageBoxW(hwnd,"Пример вызова 32-битной версии 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);
  }

 

Импорт функций из .NET библиотек

Для работы с функциями .NET библиотеки достаточно импортировать саму DLL без указания конкретных функций. MetaEditor автоматически импортирует все функции, с которыми возможна работа:

  • Простые структуры (POD, plain old data) – структуры, которые содержат только простые типы данных.
  • Публичные статические функции, в параметрах которых используются только простые типы и структуры POD или их массивы

Для вызова функций из библиотеки просто импортируйте ее:

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

C# код функции Inc класса TestClass выглядит следующим образом:

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

В результате выполнения скрипт вернет значение 42.

Смотри также

Включение файлов