Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Функция UnloadLibrary() отсутствует в WinAPI, имеется FreeLibrary().
Вы правы :-). У меня MSDN почему-то не грузился :-).
.
ОС выгружает любую dll только при нулевом значении счетчика загрузок.
В данном случае единственное приложение, которое грузит dll-ку- это метатрейдер.
В данном случае единственное приложение, которое грузит dll-ку- это метатрейдер.
использую внешнюю библиотеку через #import.
когда выгружаю идникатор, терминал ещё держит dll. как избавиться?
Написать dll без ошибок. Обычно dll сами выгружаются, если не возникло ни каких непредвиденных ситуаций.
Если не считать всяких "хакерских" способов - это единственное что возможно.
Написать dll без ошибок. Обычно dll сами выгружаются, если не возникло ни каких непредвиденных ситуаций.
Ну что же, уважаемый.
У меня под рукой оказалась свеженькая Dll и я на полном серьезе решил доказать что Вы не правы :-).
Оказалось, что после выхода из скрипта- равно как после выхода из индикатора
(закрытием окна или удалением индикатора), Dll выгружается...
А что касается "грамотности"... то DllMain у меня всегда тупо возвращает TRUE.
Но я помню, что где-то год назад для замены Dll из метатрейдера приходилось выходить.
OS = WinXP SP3, MT = 225
Ребята, вы какие то странные, что ли. У меня таких проблем, что бы не выгружалось, было всего несколько раз, и всегда это было связано с ошибками в коде. Это первое. Второе. Напоминаю, микрософт этот механизм, неявной загрузки\выгрузки - специально придумал, что упростить работу с Dll.
Откуда вы эти странные проблемы берете - понимать отказываюсь.
Да, и это, лично я DllMain не пользую, на прямую.
Ребята, вы какие то странные, что ли. У меня таких проблем, что бы не выгружалось, было всего несколько раз, и всегда это было связано с ошибками в коде.
Откуда вы эти странные проблемы берете - понимать отказываюсь.
Да, и это, лично я 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- должно быть всё замечательно.
Винда кэширует любую DLL. Сильно кэширует.
В связи с вышесказанным, получается достаточно близко к реальности. Т.е. если Dll-ина цепляет зависимости -
то операционная система уже не может ее выгрузить без выгрузки приложения, которое загрузило эту Dll.
Вот вам, "странный вы наш", цитата из 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.
Но раз уж вы считаете себя профи, то, вероятно, можете посоветовать начинающим вместо подколок-
я не вижу, чтобы вы что-то написали по существу- убирать из проекта динамическую линковку,
зависимости от runtime-packages, аккуратно организовать работу со связанными Dll-ями- врядли они
там используются, конечно, и, возможно, работу с COM-подсистемой, где один вызов типа OleInitialize может поднять
несколько десятков системных Dll-ин. Поскольку все эти зависимости подгружаются на раз... то со стартом все легко,
а вот с деинициализацией- например, если и Dll и метатрейдер зацепят одинаковые системные библиотеки-
могут быть проблемы- кто его знает, что там в глубине OS наверчено.
Почитайте Рихтера, очень рекомендую. Станет понятно, что никакой магии в работе с dll нет, и библиотеки всегда выгружаются, как только в них отпадает надобность для текущего адресного пространства процесса. Надобность эта определяется по счетчику. Если счетчик не обнулился к моменту выгрузки MQL-программы - значит где то произошла ошибка, причем грубая.
Так что по факту- мы- как юзера API, которые цепляют все Dll функции- обычно- через .h / .lib, причем загрузка библиотек,
скорее всего, происходит на момент инициализации приложения, сделать *ничего* не можем.
Или все библиотеки мы бы грузили сами и все функции динамически линковали бы руками.
А вот на голой математике- или на некоторых функциях API- должно быть всё замечательно.
В связи с вышесказанным, получается достаточно близко к реальности. Т.е. если Dll-ина цепляет зависимости -
то операционная система уже не может ее выгрузить без выгрузки приложения, которое загрузило эту Dll.
Очень привильно разработчики MT4 сделали, не дав пользователям в руки механизм Load\FreeLibrary. Очень правильно. Всё дело в уровне культуры программирования трейдеров.
И последнее, читайте рекомендации самого майкрософта, - там черным по белому указано, что хоть и возможно делать сложные зависимости dll между собой - у всего этого есть свои ограничения.
Винда кэширует любую DLL. Сильно кэширует.
Я бы не стал называть механизм отображения dll на адресное пространство процесс - маханизмом кеширования. Это совершенно самостоятельный процесс.
Я бы не стал называть механизм отображения dll на адресное пространство процесс - маханизмом кеширования. Это совершенно самостоятельный процесс.
Странный Вы какой-то. В директории Windows\system32 есть даже директория dllcache, все сисадмины в мире выгружают принудительно все dll спомощью regsvr32, а Вы рассказываете тут басни народу. На кого Вы рассчитываете? Тут же не лохи собрались.