임포트 함수 (#import)

기능은 컴파일된 MQL5 모듈(*.ex5 파일) 및 운영 체제 모듈(*.dll 파일)에서 가져옵니다. 모듈 이름은 #import 명령어에 지정되어 있습니다. 컴파일러에서 가져온 함수 호출을 올바르게 구성하고 적절한 전송 매개변수를 구성하기 위해서는 함수에 대한 전체 설명이 필요합니다. 함수 설명은 #import "module name" 명렁문을 바로 따릅니다. 새 명령 #import(매개변수 없이 가능)는 가져온 함수 설명 블록을 완료합니다.

#import "file_name"
   func1 정의;
   func2 정의;
    ...
   funcN 정의;
#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비트 윈도우를 사용 중인 경우
   if(_IsX64)
     {
      ulong hwnd=0;
      res=MessageBoxW(hwnd,"64-bit MessageBoxW 호출 예제","MessageBoxW 64 bit",MB_OK|MB_ICONINFORMATION);
    }
   else  // 32비트 윈도우를 사용 중인 경우
     {
      uint hwnd=0;
      res=MessageBoxW(hwnd,"32-bit MessageBoxW 호출 예제","MessageBoxW 32 bit",MB_OK|MB_ICONINFORMATION);
    }
   return (res);
  }
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int ans=MessageBox_32_64_bit();
   PrintFormat("MessageBox_32_64_bit returned %d",ans);
  }

.NET 라이브러리에서의 임포트 함수

.NET 라이브러리 함수로 작업하려면 특정 함수를 정의하지 않고 DLL 자체를 임포트하면 됩니다. MetaEditor는 다음 작업을 수행할 수 있는 모든 기능을 자동으로 가져옵니다:

  • 단순 구조(POD, 평범한 오랜 데이터) — 단순 데이터 유형만 포함하는 구조.
  • 단순 유형 및 POD 구조 또는 해당 어레이만 사용되는 매개변수가 있는 공용 정적 함수

라이브러리에서 함수를 호출하려면 다음과 같이 하면 됩니다:

#import "TestLib.dll"
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

TestClass의 Inc 함수의 C# 코드는 다음과 같습니다:

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

실행 결과 스크립트는 42의 값을 반환합니다.

더 보기

파일 포함