Порядок поиска файлов библиотек
Если имя библиотеки указано без пути или с относительным путем, поиск производится по различным правилам в зависимости от типа библиотеки.
Системные библиотеки (DLL) загружаются по правилам операционной системы. Если библиотека уже загружена (например, другим экспертом и даже из другого клиентского терминала, запущенного параллельно), то обращение идет к уже загруженной библиотеке. В противном случае поиск идет в следующей последовательности:
- Папка, из которой была запущена откомпилированная EX5-программа, импортирующая DLL;
- Папка MQL5/Libraries;
- Папка, где находится запущенный терминал MetaTrader 5;
- Системная папка (обычно внутри Windows);
- Каталог Windows;
- Текущая рабочая папка процесса терминала (может отличаться от папки размещения терминала);
- Папки, перечисленные в системной переменной PATH.
В директивах #import не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида Drive:/Directory/FileName.dll.
Если библиотека DLL использует в своей работе другую DLL, то в случае отсутствия второй DLL первая не сможет загрузиться.
Поиск импортируемой библиотеки EX5 производится в следующей последовательности:
- Папка запуска импортирующей EX5-программы;
- Папка MQL5/Libraries конкретного экземпляра терминала;
- Папка MQL5/Libraries в общей папке всех терминалов MetaTrader 5 (Common/MQL5/Libraries).
Перед загрузкой MQL-программы формируется общий список всех библиотечных модулей EX5, которые предполагается использовать как из самой программы, так и из библиотек из этого списка. Он называется списком зависимостей и может стать очень разветвленным "деревом".
Для EX5-библиотек терминалом также обеспечивается однократная загрузка многократно используемых модулей.
Вне зависимости от типа библиотеки, в каждом её экземпляре идет работа с собственными данными, относящимися к контексту вызвавшего эксперта, скрипта, сервиса или индикатора. Библиотеки не являются инструментом для разделяемого доступа к переменным или массивам MQL5.
Библиотеки EX5 и DLL выполняются в потоке вызывающего модуля.
Не предусмотрено штатных средств, чтобы выяснить в коде библиотеки, откуда она загружена.