MQL4 プログラムの実行中に関数をインポートするために、いわゆる遅延バインディングが使用されます。これは、インポートされた関数が呼び出されるまでは、対応するモジュール(ex4 または DLL)が読み込まれないことを意味します。MQL4 と DLL ライブラリは、呼び出し元ののモジュールのスレッドで実行されます。
\Directory\FileName.Ext のように読み込まれるモジュールの完全修飾名を使用することは推奨できません。MQL4 ライブラリは terminal_dir\experts\libraries フォルダから読み込まれます。ライブラリが見つからない場合は、terminal_dir\experts フォルダから、ライブラリの読み込みを試みます。
システム ライブラリ(DLL)は、オペレーティング システムの規則によって読み込まれます。もし、ライブラリが既に(別のエキスパート、例えば、同時に起動した、別のクライアント ターミナルによって)読み込まれている場合は、すでに読み込まれたライブラリが参照されます。それ以外の場合、検索は次の順序で実施されます。
- The terminal_dir\experts\libraries directory.
The terminal_dir\experts\libraries のディレクトリ
- The directory from which the terminal_dir client terminal was launched.
クライアント ターミナルが起動した terminal_dir ディレクトリ
- The current directory.
現在のディレクトリ
- The system directory of windows_dir\SYSTEM32 (or windows_dir\SYSTEM for Win98).
windows_dir\SYSTEM32(またはWin98のwindows_dir\SYSTEM)のシステム ディレクトリ
- The directory where windows_dir operation system was installed.
オペレーティング システムがインストールされた windows_dir ディレクトリ
- Directories listed in the PATH environment system variable.
PATH 環境システム変数に設定されているディレクトリ
もし DLL がその動作中にもう1つの DLL を使うなら、後者のものが使用できない場合、以前のものも読み込まれません。
システム ライブラリと異なり、カスタム ライブラリ(MQL4)は各呼び出し元のモジュールを個別に読み込み、他のモジュールで読み込まれたライブラリであっても独立して読み込みます。たとえば、caller.ex4 モジュールは lib1.ex4 および lib2.ex4 のライブラリから関数を呼び出します。lib1.ex4 ライブラリは、そのターンで lib2.ex4 ライブラリから関数を呼び出します。この場合、もう1つの lib1.ex4 ライブラリのコピーと、2つの lib2.ex4 ライブラリのコピーが読み込まれ、いずれにしても、すべての呼び出しは同じ caller.ex4 から派生します。
DLL から MQL4 プログラムに読み込まれた関数は、Windows API 関数に容認されたリンケージ規約を備える必要があります。このような規約を備えるには、Micorsoft(R)社のコンパイラで C または C++ の言語で記述されたプログラムの ソース コードで使用される特定のキーワード _ _stdcall を使用します。上記のリンケージ規約は次のように特徴づけられます。
- – calling function (in our case, it is an mql4 program) must “see” the called (imported from DLL) function prototype in order to put parameters onto the stack in a proper way;
呼び出しをしている関数(この場合、MQL4 プログラム)は、適切な方法でストックにパラメータを設定する指示のために、呼び出された(DLLからインポートされた)関数プロトタイプを「見なくて」はならない。
- – calling function (in our case, it is an mql4 program) puts parameters onto the stack in the reversed order, i.e., from right to left; it is this order in which the imported function reads parameters passed to it;
呼び出しをしている関数(この場合、MQL4 プログラム)は、スタックに逆順の指示でパラメータを設定します。すなわち、右から左へ。それは、インポートされた関数がそれに渡されたパラメータを読む指示です。
- -parameters are passed by their values, except for those explicitely passed by a link (in our case, these are lines);
パラメータは、リンクによって明確に渡されたそれら(この場合、これらは行です)以外は、それらの値によって渡されます。
- – on reading the parameters passed to it, the imported function will flush the stack by itself.
渡されたパラメータを読み込むとき、インポートされた関数のスタック自体がフラッシュされます。
インポートされた関数プロトタイプを記述することにおいて、すべてのパラメータを明確にインポートした関数に渡す必要があるとき、規定値でパラメータを使うことは役に立ちません。
もし、インポート関数の呼び出しが失敗した(エキスパートの設定が DLL の読み込みを許さないか、あるいは、対応するライブラリが、なんらかの理由で読み込むことができなった)場合、エキスパートは “expert stopped” ジャーナルに該当するメッセージを出して、処理を終了します。さらに、エキスパートは再初期化されるまで、起動されません。エキスパートは、再コンパイルを決定したとき、もしくは、エキスパートのプロパティ一覧を開いた先の OK ボタンを押したときに、再初期化することができます。