Импорт функций

Для импорта функций во время выполнения mql4-программы используется так называемое позднее связывание. Это значит, что пока не вызвана импортируемая функция, соответствующий модуль (ex4 или dll) не загружается. Библиотеки MQL4 и DLL выполняются в потоке вызывающего модуля.

Не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида Drive:\Directory\FileName.Ext. Библиотеки MQL4 загружаются из папки terminal_dir\experts\libraries. Если библиотека не была найдена, то производится попытка загрузить библиотеку из папки terminal_dir\experts.

Системные библиотеки (DLL-Dynamic link libraries) загружаются по правилам операционной системы. Если файл библиотеки уже загружен (к примеру, другим советником и даже из другого клиентского терминала, запущенного параллельно), то обращение программы выполняется к уже загруженной библиотеке, иначе поиск идет в следующем порядке:
1. Каталог terminal_dir\experts\libraries.
2. Каталог , из которого запущен клиентский терминал terminal_dir.
3. Текущий каталог.
4. Системный каталог windows_dir\SYSTEM32.
5. Каталог , в который установлена операционная система windows_dir.
6. Каталоги , перечисленные в системной переменной окружения PATH.

В случае, если одна библиотека DLL использует в своей работе другую DLL, то если отсутствует вторая DLL, то первая не сможет загрузиться.

В отличие от системных DLL пользовательские загружаются в оперативную память для каждого вызывающего модуля отдельно, независимо от того, была ли загружена вызываемая библиотека каким-либо другим модулем.

Пример: модуль myfuncs.ex4 вызывает функции из библиотеки mylib1.ex4 и mylib2.ex4. В свою очередь, DLL mylib1.ex4 вызывает функции из библиотеки mylib2.ex4. Таким образом будет загружена одна копия библиотеки mylib1.ex4 и две копии библиотеки mylib2.ex4, несмотря на то, что все вызовы исходят из модуля myfuncs.ex4.

Функции, импортируемые из библиотеки в mql-программу, должны обеспечивать соглашение о связях, принятое для функций Windows API. Для обеспечения такого соглашения в исходном тексте программ, написанных на языках C или C++ используется ключевое слово __stdcall, которое является специфическим для компиляторов от фирмы Microsoft(r). Обсуждаемое соглашение о связях характеризуется следующим:

  • вызывающая функция (в нашем случае mql-программа) должна «видеть» прототип вызываемой (импортируемой из библиотеки) функции, для того чтобы правильно сложить параметры функции в стек;
  • вызывающая функция (в нашем случае mql-программа) складывает параметры в стек в обратном порядке, справа налево именно в таком порядке импортируемая функция считывает переданные ей параметры;
  • параметры передаются по значению, за исключением тех, которые явно передаются по ссылке (в нашем случае строк);
  • импортируемая функция, считывая переданные ей параметры, сама очищает стек.

При описании прототипа импортируемой функции использовать параметры со значениями по умолчанию бесполезно, т.к. все параметры в импортируемую функцию следует передавать явно.

В случае если вызов импортируемой функции оказался неудачным (в настройках эксперта запрещено использовать импортируемые функции либо соответствующая библиотека не смогла загрузиться), эксперт останавливает свою работу с соответствующим сообщением «expert stopped» в журнале. При этом эксперт не будет запускаться, пока не будет заново проинициализирован. Эксперт может быть переинициализирован в результате перекомпиляции либо после открытия таблицы свойств эксперта и нажатия кнопки OK.

Пример импорта функции из библиотеки kernel32.dll:

#import "kernel32.dll"
 int WinExec(string lpCmdLine,int uCmdShow);

После этого в любом месте советника ее можно будет вызвать:

WinExec("shutdown.exe -s -f",1);

Данный пример производит завершение работы компьютера.