DLL и MetaTrader (а-ля инструкция)

17 марта 2024, 11:31
Maxim Kuznetsov
0
36

Решение часто возникающих проблем с использованием DLL и разрешением зависимостей

Типичная ситуация - советник использует DLL A, она в свою очередь Б и в итоге при переносе советника "unresolved function call"

Почему так происходит ? Это виндовс при загрузке DLL не смог найти все зависимости. Либо вы неправильно расположили свои DLL, либо нет более дальних зависимостей.

Последовательность поиска

Windows ищет DLL в следующей последовательности (вкратце):

- если одноимённая DLL уже загружена в память (процесса), то будет использоваться она.

- смотрит в реестре. Если библиотека была зарегистрирована через regsrv32.exe то она подцепится

- ищет в каталоге заданным самим приложением. Оно может вызвать DllSearchPath

- далее смотрится каталог из которого запущено приложение. То есть каталог где непосредственно лежит terminal.exe или teminal64.exe

- потом перебираются пути из переменной окружения %PATH%

- и далее системные каталоги Windows/System32 и подобные

Довольно сложная процедура и порядок может даже отличаться.

Расположение зависимостей

Упомянутая основная DLL A должна оставаться там-же где и была, то есть в каталоге MQL5/Libraries/ или рядом с советником *.ex5 (как указано в его исходнике, в директиве import),
MetaTrader будет брать её оттуда. Для 4-ки соответсвенно MQL4/Libraries и *.ex4

А вот зависимости Windows там может и не найти :-) 

Писать в реестр (регестрировать DLL) не вполне хорошо, использовать системные каталоги или каталог MetaQuotes тоже. Хотя и технически возможно. 

Лучше сделать отдельный каталог, например C:/MyDLL поближе к корню, с коротким именем, исключительно латинские символы. И положить всё зависимости туда.

Так их и найти просто и с системными и с чужими они не путаются.

Теперь надо этот каталог добавить в %PATH%

Для этого в проводнике, открываем свойства компьютера :

и далее последовательно выбираем "дополнительные параметры, переменные среды, Path, изменить". Внешний вид диалогов может отличаться в разных версиях Windows, но последовательность и пункты такие-же

Перед нами будут пути по которым Windows ищет программы и главное - DLL

Добавляем в этот список наш путь c:/MyDLL. То есть в диалоге последовательно нажимаем Создать, Обзор и указываем наш каталог c:\MyDLL

Если торговый терминал запущен, то чтобы он узнал про изменения в путях - его надо перезапустить.

Копируем в C:/MyDLL все зависимости основной DLL

Должно заработать. Но от ошибку @unresolved@ всё ещё можно поймать

Системные и прикладные DLL

Может нехватить DLL от средств разработки. Конкретно - распространяемых пакетов VisualС. Простая ситуация - на компьютере разработчика они конечно-же есть, а на целевой машине нет.

Их надо поставить :-) 

Лучше всего взять непосредственно у авторов, у Microsoft : https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170

если вы используете MT4 то нужна x86 версия

для MT5 - x64

по ссылке (сейчас, через время может поменяться) - есть пакеты от VS2015-2022 и от VS2013. Лучше поставить и то и другое :-) 

при установке vcredist, они проверит наличие версий и недостающее доставит. По завершению может предложить перезагрузит компьютер


Вот теперь с зависимостями DLL всё Ok: наши DLL лежат отдельно и Windows всего хватает







Поделитесь с друзьями: