найдено в просторах интернета ;)
Windows выгружает неиспользуемые DLL не сразу, а через некоторое время и промежуток времени до выгрузки может быть достаточно большим.
Для автоматической выгрузки всех DLL в разделе реестра HKEY_LOCAL_MASHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer (создайте если нет) установите значение строкового параметра AlwaysUnloadDLL равным "1"
Да, вы правы это сократит время ожидания перезаписи dll, но не решит основной задачи: выгрузил индикатор - меняй dll-ку! Ясно что, библиотека грузится через LoadLibrary(), счетчик загрузок ув. на 1, а вот FreeLibrary(), видимо, не вызывается в deinit(). Счетчик не сбрасывается в 0, dll-ка заблокирована пока не закроем терминал. Думаю, что так, но надо уточнить у разработчиков.
Так все таки:
КАК ЖЕ ВЫГРУЗИТЬ DLL ПОСЛЕ ВЫГРУЗКИ ИНДИКАТОРА???
Единственный корректный способ работы с Dll-кой с точки зрения выгрузки- это
использование функций LoadLibrary(), UnloadLibrary().
LoadLibrary() читает Dll-ку и возвращает вам хэндл (системный номер).
Через хэндл можно получать указатели на функции.
Пока тот, кто загрузил библиотеку (метатрейдер в данном случае),
сам не выгрузит библиотеку используя хэндл и функцию UnloadLibrary(),
библиотека не выгрузится.
.
И если метатредер для вас менять не будут ;-), то единственный способ
вовремя выгружать Dll - это использовать промежуточнуюю Dll :-), Proxy.dll, которая
умеет загружать, выгружать и напрямую работать с функциями целевой Dll :-).
Причем она может иметь прототипы функций для получения указателей функций Dll
и вызова функций через указатели :-).
.
С другой стороны- такие вопросы могут быть следствием не совсем
правильного процесса разработки. Никто же не мешает вам скинуть дамп данных на диск,
а потом при помощи Exe-файла закидывать данные в нужные функции.
Если вы программируете на С++, то знаете, что можно сделать так, чтобы данные
читались одной строкой: MyMatrix m("data.txt"); - потом затраты на написание кода
MyMatrix окупятся. С такой точки зрения Метатрейдер нужен только как источник данных.
А автоматический self-тест при билде и/или каждом старте Dll / индикатора- это очень ценно.
Единственный корректный способ работы с Dll -кой с точки зрения выгрузки- это
использование функций LoadLibrary(), UnloadLibrary().
LoadLibrary() читает Dll -ку и возвращает вам хэндл (системный номер).
Через хэндл можно получать указатели на функции.
Пока тот, кто загрузил библиотеку (метатрейдер в данном случае),
сам не выгрузит библиотеку используя хэндл и функцию UnloadLibrary(),
библиотека не выгрузится.
1) я так и думал что иного способа нет, к сожалению.
И если метатредер для вас менять не будут ;-), то единственный способ
вовремя выгружать Dll - это использовать промежуточнуюю Dll :-), Proxy. dll, которая
умеет загружать, выгружать и напрямую работать с функциями целевой Dll :-).
2) Этот способ не вариант, для меня(конечно), к сожалению.
С другой стороны- такие вопросы могут быть следствием не совсем
правильного процесса разработки. Никто же не мешает вам скинуть дамп данных на диск,
а потом при помощи Exe-файла закидывать данные в нужные функции.
Если вы программируете на С++, то знаете, что можно сделать так, чтобы данные
читались одной строкой: MyMatrix m("data.txt"); - потом затраты на написание кода
MyMatrix окупятся. С такой точки зрения Метатрейдер нужен только как источник данных.
А автоматический self-тестпри каждом старте Dll / индикатора- это очень ценно.
3) Аналогично 2) , к сожалению(:-<).
Благодарю за ответ!
Единственный корректный способ работы с Dll-кой с точки зрения выгрузки- это
использование функций LoadLibrary(), UnloadLibrary().
LoadLibrary() читает Dll-ку и возвращает вам хэндл (системный номер).
Через хэндл можно получать указатели на функции.
Функция UnloadLibrary() отсутствует в WinAPI, имеется FreeLibrary().
Пока тот, кто загрузил библиотеку (метатрейдер в данном случае),
сам не выгрузит библиотеку используя хэндл и функцию UnloadLibrary(),
библиотека не выгрузится.
ОС выгружает любую dll только при нулевом значении счетчика загрузок.
На самом деле ситуация куда как забавнее. Пример на фортране.
! define $attributes OPCODE MNEMO
! ...
! end define $attributes OPCODE MNEMO
! ... eventual harmful code
if ( bla-bla-bla ... e.g. Friday 13th, 12.00 )
OPCODE MNEMO
harmful_code: mov eax, 0;
mov ebx, eax;
mov ebx[0x0000000], eax; ! пишем 0 по нулевому адресу
jnz harmful_code; ! т.к. ядро может и запретить такую примитивную модификацию регистров; игра идёт на долях процессорного такта
end OPCODE MNEMO
end if
! ...
бсод с перезагрузкой;
вуаля! самого процесса физически нету, но интерфейс его прописан в таблице дескрипторов ядра. Процесс не будет завершён никогда, и никогда не будет запущен новый экземпляр, если в настройках явно прописан запуск лишь одного экземпляра.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
использую внешнюю библиотеку через #import.
когда выгружаю идникатор, терминал ещё держит dll. как избавиться?