関数のインポート (#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を返します。

参照

ファイルの読み込み