Справочник MQL4 Программы MQL4 Вызов импортируемых функций
Вызов импортируемых функцийДля импорта функций во время выполнения mql4-программы используется раннее связывание. Это значит, что если в программе есть вызов импортируемой функции, то соответствующий модуль (ex4 или dll) загружается в процессе загрузки программы. Библиотеки MQL4 и DLL выполняются в потоке вызывающего модуля. Не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида Drive:\Directory\FileName.Ext. Библиотеки MQL4 загружаются из папки terminal_dir\MQL4\Libraries. Если библиотека не была найдена, то производится попытка загрузить библиотеку из папки terminal_dir\experts. Системные библиотеки (DLL) загружаются по правилам операционной системы. Если библиотека уже загружена (например, другим экспертом и даже из другого клиентского терминала, запущенного параллельно), то обращение идет к уже загруженной библиотеке. В противном случае поиск идет в следующей последовательности:
Если библиотека DLL использует в своей работе другую DLL, то в случае отсутствия второй DLL первая не сможет загрузиться. Перед загрузкой эксперта (скрипта, индикатора) формируется общий список всех библиотечных модулей EX4, которые предполагается использовать как из загружаемого эксперта (скрипта, индикатора), так и из библиотек из этого списка. Таким образом обеспечивается однократная загрузка многократно используемых библиотечных модулей EX4. Библиотеки пользуются предопределенными переменными вызвавшего их эксперта (скрипта, индикатора). Поиск импортируемой библиотеки EX4 производится в следующей последовательности:
Функции, импортируемые из DLL в mql4-программу, должны обеспечивать соглашение о связях, принятое для функций Windows API. Для обеспечения такого соглашения в исходном тексте программ, написанных на языках C или C++, используется ключевое слово __stdcall, которое является специфическим для компиляторов от фирмы Microsoft(r). Обсуждаемое соглашение о связях характеризуется следующим:
При описании прототипа импортируемой функции можно использовать параметры со значениями по умолчанию. В случае если соответствующая библиотека не смогла загрузиться, либо установлен запрет на использование DLL, либо импортируемая функция не была найдена – эксперт останавливает свою работу с соответствующим сообщением "expert stopped" в журнале. При этом эксперт не будет запускаться, пока не будет заново проинициализирован. Эксперт может быть переинициализирован в результате перекомпиляции либо после открытия таблицы свойств эксперта и нажатия кнопки OK. Передача параметровВсе параметры простых типов передаются по значению, если явно не указано, что они передаются по ссылке. При передаче строки передается адрес буфера скопированной строки; если строка передается по ссылке, то в функцию, импортируемую из DLL, передается адрес буфера именно этой строки без копирования. Структуры, содержащие динамические массивы, строки, классы, другие сложные структуры, а также статические либо динамические массивы перечисленных объектов, не могут быть переданы в качестве параметра в импортируемую функцию. При передаче в DLL массива всегда (независимо от флага AS_SERIES) передается адрес начала буфера данных. Функция внутри DLL ничего не знает о флаге AS_SERIES, переданный массив является статическим массивом неизвестной длины, для указания размера массива используйте дополнительный параметр. |