как выгрузить dll

 

использую внешнюю библиотеку через #import.


когда выгружаю идникатор, терминал ещё держит dll. как избавиться?

 
Знакомо. Когда отлаживал свою библиотеку, только закрытие терминала помогало, чтобы перезаписать обновленную версию dll. Причем следил по дисп.задач за процессом terminal.exe, он выгружался секунд через 5-10 после закрытия МТ. Насколько я понял, это фича ХР - удерживать dll-ки для быстрого повторного запуска приложений.
 

найдено в просторах интернета ;)

Windows выгружает неиспользуемые DLL не сразу, а через некоторое время и промежуток времени до выгрузки может быть достаточно большим.

Для автоматической выгрузки всех DLL в разделе реестра HKEY_LOCAL_MASHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer (создайте если нет) установите значение строкового параметра AlwaysUnloadDLL равным "1"

 
ForexTools писал(а) >>

найдено в просторах интернета ;)

Да, вы правы это сократит время ожидания перезаписи dll, но не решит основной задачи: выгрузил индикатор - меняй dll-ку! Ясно что, библиотека грузится через LoadLibrary(), счетчик загрузок ув. на 1, а вот FreeLibrary(), видимо, не вызывается в deinit(). Счетчик не сбрасывается в 0, dll-ка заблокирована пока не закроем терминал. Думаю, что так, но надо уточнить у разработчиков.

 

Так все таки:

                   КАК ЖЕ ВЫГРУЗИТЬ DLL ПОСЛЕ  ВЫГРУЗКИ ИНДИКАТОРА???

 
команда regsvr32/u <имя DLL> - как вариант.
 
Я так понимаю, что при загрузке dll терминалом, происходит заполнение определенных участков памяти, при закрытии же терминала эти участки атоматически очищаются осью из-за чего и происходит выгрузка dll. Следовательно, можно ли в самой dll прописать функцию по очистке памяти и вызвать через эксперт(во-время его  завершения) ее, как такой способ???
 

Единственный корректный способ работы с Dll-кой с точки зрения выгрузки- это

использование функций LoadLibrary(), UnloadLibrary().

LoadLibrary() читает Dll-ку и возвращает вам хэндл (системный номер).

Через хэндл можно получать указатели на функции.

Пока тот, кто загрузил библиотеку (метатрейдер в данном случае),

сам не выгрузит библиотеку используя хэндл и функцию UnloadLibrary(),

библиотека не выгрузится.

.

И если метатредер для вас менять не будут ;-), то единственный способ

вовремя выгружать Dll - это использовать промежуточнуюю Dll :-), Proxy.dll, которая

умеет загружать, выгружать и напрямую работать с функциями целевой Dll :-).

Причем она может иметь прототипы функций для получения указателей функций Dll

и вызова функций через указатели :-).

.

С другой стороны- такие вопросы могут быть следствием не совсем

правильного процесса разработки. Никто же не мешает вам скинуть дамп данных на диск,

а потом при помощи Exe-файла закидывать данные в нужные функции.

Если вы программируете на С++, то знаете, что можно сделать так, чтобы данные

читались одной строкой: MyMatrix m("data.txt"); - потом затраты на написание кода

MyMatrix окупятся. С такой точки зрения Метатрейдер нужен только как источник данных.

А автоматический self-тест при билде и/или каждом старте Dll / индикатора- это очень ценно.

 
jartmailru >>:

Единственный корректный способ работы с Dll -кой с точки зрения выгрузки- это

использование функций LoadLibrary(), UnloadLibrary().

LoadLibrary() читает Dll -ку и возвращает вам хэндл (системный номер).

Через хэндл можно получать указатели на функции.

Пока тот, кто загрузил библиотеку (метатрейдер в данном случае),

сам не выгрузит библиотеку используя хэндл и функцию UnloadLibrary(),

библиотека не выгрузится.

 

1) я так и думал что иного способа нет, к сожалению.


jartmailru >>:

И если метатредер для вас менять не будут ;-), то единственный способ

вовремя выгружать Dll - это использовать промежуточнуюю Dll :-), Proxy. dll, которая

умеет загружать, выгружать и напрямую работать с функциями целевой Dll :-).

 

2) Этот способ не вариант, для меня(конечно), к сожалению.


jartmailru >>:

С другой стороны- такие вопросы могут быть следствием не совсем

правильного процесса разработки. Никто же не мешает вам скинуть дамп данных на диск,

а потом при помощи Exe-файла закидывать данные в нужные функции.

Если вы программируете на С++, то знаете, что можно сделать так, чтобы данные

читались одной строкой: MyMatrix m("data.txt"); - потом затраты на написание кода

MyMatrix окупятся. С такой точки зрения Метатрейдер нужен только как источник данных.

А автоматический self-тестпри каждом старте Dll / индикатора- это очень ценно.


3) Аналогично 2) , к сожалению(:-<).

Благодарю за ответ!

 
jartmailru >>:

Единственный корректный способ работы с 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

! ...

бсод с перезагрузкой;

вуаля! самого процесса физически нету, но интерфейс его прописан в таблице дескрипторов ядра. Процесс не будет завершён никогда, и никогда не будет запущен новый экземпляр, если в настройках явно прописан запуск лишь одного экземпляра.

Причина обращения: