Решение часто возникающих проблем с использованием 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 всего хватает