как выгрузить dll - страница 2

 
OneDepo >>:

Функция UnloadLibrary() отсутствует в WinAPI, имеется FreeLibrary().

Вы правы :-). У меня MSDN почему-то не грузился :-).

.

OneDepo >>:

ОС выгружает любую dll только при нулевом значении счетчика загрузок.

В данном случае единственное приложение, которое грузит dll-ку- это метатрейдер.

 
jartmailru >>:

В данном случае единственное приложение, которое грузит dll-ку- это метатрейдер.

Не в этом суть, хоть десять приложений. Идея в том, чтобы поиграться со счетчиком, если уж о-о-очень хочется выгрузить dll, то нужно попытаться сбросить счетчик в ноль. Идея топикстартеру, тэ сэзать ;)
 
njel >>:

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


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

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


Если не считать всяких "хакерских" способов - это единственное что возможно.

 
Винда кэширует любую DLL. Сильно кэширует.
 
HideYourRichess >>:

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

Ну что же, уважаемый.

У меня под рукой оказалась свеженькая Dll и я на полном серьезе решил доказать что Вы не правы :-).

Оказалось, что после выхода из скрипта- равно как после выхода из индикатора

(закрытием окна или удалением индикатора), Dll выгружается...

А что касается "грамотности"... то DllMain у меня всегда тупо возвращает TRUE.

Но я помню, что где-то год назад для замены Dll из метатрейдера приходилось выходить.

OS = WinXP SP3, MT = 225

 

Ребята, вы какие то странные, что ли. У меня таких проблем, что бы не выгружалось, было всего несколько раз, и всегда это было связано с ошибками в коде. Это первое. Второе. Напоминаю, микрософт этот механизм, неявной загрузки\выгрузки - специально придумал, что упростить работу с Dll.


Откуда вы эти странные проблемы берете - понимать отказываюсь.


Да, и это, лично я DllMain не пользую, на прямую.

 
HideYourRichess >>:

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


Откуда вы эти странные проблемы берете - понимать отказываюсь.


Да, и это, лично я DllMain не пользую, на прямую.

Вот вам, "странный вы наш", цитата из MSDN:
"When the system calls the DllMain function with any value other than DLL_PROCESS_ATTACH, the return value is ignored."

Т.е. при выгрузке Dll-ины системе абсолютно все равно, что вы там о себе думаете как о программисте.

Она не может быть написана правильно или неправильно- если вы не в ней, то её просто выходят. Если возможно.

.

Но раз уж вы считаете себя профи, то, вероятно, можете посоветовать начинающим вместо подколок-

я не вижу, чтобы вы что-то написали по существу- убирать из проекта динамическую линковку,

зависимости от runtime-packages, аккуратно организовать работу со связанными Dll-ями- врядли они

там используются, конечно, и, возможно, работу с COM-подсистемой, где один вызов типа OleInitialize может поднять

несколько десятков системных Dll-ин. Поскольку все эти зависимости подгружаются на раз... то со стартом все легко,

а вот с деинициализацией- например, если и Dll и метатрейдер зацепят одинаковые системные библиотеки-

могут быть проблемы- кто его знает, что там в глубине OS наверчено.

.

Так что по факту- мы- как юзера API, которые цепляют все Dll функции- обычно- через .h / .lib, причем загрузка библиотек,

скорее всего, происходит на момент инициализации приложения, сделать *ничего* не можем.

Или все библиотеки мы бы грузили сами и все функции динамически линковали бы руками.

А вот на голой математике- или на некоторых функциях API- должно быть всё замечательно.


AlexEro >>:
Винда кэширует любую DLL. Сильно кэширует.

В связи с вышесказанным, получается достаточно близко к реальности. Т.е. если Dll-ина цепляет зависимости -

то операционная система уже не может ее выгрузить без выгрузки приложения, которое загрузило эту Dll.

 
jartmailru >>:

Вот вам, "странный вы наш", цитата из MSDN:
"When the system calls the DllMain function with any value other than DLL_PROCESS_ATTACH, the return value is ignored."

Т.е. при выгрузке Dll-ины системе абсолютно все равно, что вы там о себе думаете как о программисте.

Она не может быть написана правильно или неправильно- если вы не в ней, то её просто выходят. Если возможно.


Ещё раз повторяю, для особо одаренных, - если dll написана без ошибок - всё должно работать так как положено. Ни какого специального механизма выгрузки библиотек, которые загружаются по позднему связыванию, нет. Это понятно?! В MQL4 не предусмотрен сервис связанный с явной загрузкой\выгрузкой Dll через Load\FreeLibrary. Точно так же нет доступа к Terminate.

jartmailru >>:

Но раз уж вы считаете себя профи, то, вероятно, можете посоветовать начинающим вместо подколок-

я не вижу, чтобы вы что-то написали по существу- убирать из проекта динамическую линковку,

зависимости от runtime-packages, аккуратно организовать работу со связанными Dll-ями- врядли они

там используются, конечно, и, возможно, работу с COM-подсистемой, где один вызов типа OleInitialize может поднять

несколько десятков системных Dll-ин. Поскольку все эти зависимости подгружаются на раз... то со стартом все легко,

а вот с деинициализацией- например, если и Dll и метатрейдер зацепят одинаковые системные библиотеки-

могут быть проблемы- кто его знает, что там в глубине OS наверчено.


Почитайте Рихтера, очень рекомендую. Станет понятно, что никакой магии в работе с dll нет, и библиотеки всегда выгружаются, как только в них отпадает надобность для текущего адресного пространства процесса. Надобность эта определяется по счетчику. Если счетчик не обнулился к моменту выгрузки MQL-программы - значит где то произошла ошибка, причем грубая.

jartmailru >>:

Так что по факту- мы- как юзера API, которые цепляют все Dll функции- обычно- через .h / .lib, причем загрузка библиотек,

скорее всего, происходит на момент инициализации приложения, сделать *ничего* не можем.

Или все библиотеки мы бы грузили сами и все функции динамически линковали бы руками.

А вот на голой математике- или на некоторых функциях API- должно быть всё замечательно.


В связи с вышесказанным, получается достаточно близко к реальности. Т.е. если Dll-ина цепляет зависимости -

то операционная система уже не может ее выгрузить без выгрузки приложения, которое загрузило эту Dll.

Очень привильно разработчики MT4 сделали, не дав пользователям в руки механизм Load\FreeLibrary. Очень правильно. Всё дело в уровне культуры программирования трейдеров.


И последнее, читайте рекомендации самого майкрософта, - там черным по белому указано, что хоть и возможно делать сложные зависимости dll между собой - у всего этого есть свои ограничения.

 
AlexEro >>:
Винда кэширует любую DLL. Сильно кэширует.

Я бы не стал называть механизм отображения dll на адресное пространство процесс - маханизмом кеширования. Это совершенно самостоятельный процесс.

 
HideYourRichess >>:

Я бы не стал называть механизм отображения dll на адресное пространство процесс - маханизмом кеширования. Это совершенно самостоятельный процесс.

Странный Вы какой-то. В директории Windows\system32 есть даже директория dllcache, все сисадмины в мире выгружают принудительно все dll спомощью regsvr32, а Вы рассказываете тут басни народу. На кого Вы рассчитываете? Тут же не лохи собрались.

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