임포트 함수 (#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의 값을 반환합니다.
더 보기
파일 포함