関数のインポート (#import)
関数はコンパイル済みの MQL5 モジュール( *.ex5 ファイル )及びオペレーティングシステムモジュール( *.dll ファイル )からインポートされます。モジュール名は #import ディレクティブで指定されます。コンパイラがインポートされた関数の呼び出しを正しく形成し、適切な伝達パラメータを整理するには、関数 の完全な記述が必要とされています。関数の記述は #import "モジュール名" ディレクティブの直後に続きます。新しいコマンド#import(パラメータなし)がインポートされた関数の記述ブロックを完了します。
#import "file_name"
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-bit MessageBoxW call example","MessageBoxW 64 bit",MB_OK|MB_ICONINFORMATION);
}
else // 32 ビット Windows 使用の場合
{
uint hwnd=0;
res=MessageBoxW(hwnd,"32-bit MessageBoxW call example","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、plain old data) — 単純なデータ型のみを含む構造体
- 単純な型とPOD構造体またはその配列のみが使用されるパラメータを持つpublic static関数
ライブラリからの関数を呼び出すには、単にインポートします。
#import "TestLib.dll"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
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を返します。
参照
ファイルの読み込み