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

 
OneDepo >>:

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

Кто мешает (кроме некоторых участников этой ветки) Вам при работающем терминале сделать:

#import "kernel32.dll"

int GetModuleHandleA ( string sss);
void FreeLibrary(int hhh);
#import


deinit()

{

handlissimo=GetModuleHandleA("test-dll.dll");

FreeLibrary(handlissimo) ;

}


???

Параметры функций допишете сами. Для удаления СОВСЕМ ИЗ ПАМЯТИ освобождённой таким образом DLL - ввиду ограничений metatrader.exe и ввиду указанного мной ранее СИЛЬНОГО КЭШИРОВАНИЯ в винде, (которое включает и подстановку защищённых dll файлов из dllcache) - используйте далее regsvr32.

Чёта я вижу, что TheExpert имеет отношение к MetaQuotes.

 

Примечание: иногда даже regsvr32 не выгружает DLL-ку, и винда подставляет старую версию. Практика показывает что одинокая DLL может валяться в памяти НЕДЕЛЮ. В этом случае помогает только перегруз компьютера. Если не хочется перегружать, то помогут полу-хакерсие способы, например прога Process Explorer. Она умеет выгружать из памяти что угодно и откуда угодно - в отличие от того, что утверждают ПТУшники на этом форуме (и кстати загружать тоже, ха-ха, но вам это не надо).

http://www.softpedia.com/get/System/System-Info/Process-Explorer.shtml

краткое описание и плагин:

http://rootkits.su/app/ShowApp.aspx?id_a=36

 

Я смотрю, вы всё не уймётесь. Хорошо. Вот что нам говорит о regsvr32 сам MS:


Средство Regsvr32: использование и сообщения об ошибках


"Средство Regsvr32 (Regsvr32.exe) предназначено для регистрации и отмены регистрации элементов управления OLE, например автоматически регистрируемых DLL- или OCX-файлов. Это может быть необходимо при устранении некоторых неполадок в системе Windows, обозревателе Microsoft Internet Explorer и других программах. Например, согласно указанной ниже статье базы знаний Майкрософт средство Regsvr32.exe необходимо использовать для отмены регистрации элемента управления Wuv3is.dll перед его переустановкой с веб-узла Центра обновления Windows."


ещё:

"Служебная программа Regsvr32.exe служит для регистрации библиотек DLL и элементов управления ActiveX в системном реестре Windows. Также ее можно использовать для устранения несоответствий между DLL-файлами."

 
HideYourRichess >>:

Я смотрю, вы всё не уймётесь. Хорошо. Вот что нам говорит о regsvr32 сам MS:


Средство Regsvr32: использование и сообщения об ошибках


"Средство Regsvr32 (Regsvr32.exe) предназначено для регистрации и отмены регистрации элементов управления OLE, например автоматически регистрируемых DLL- или OCX-файлов. Это может быть необходимо при устранении некоторых неполадок в системе Windows, обозревателе Microsoft Internet Explorer и других программах. Например, согласно указанной ниже статье базы знаний Майкрософт средство Regsvr32.exe необходимо использовать для отмены регистрации элемента управления Wuv3is.dll перед его переустановкой с веб-узла Центра обновления Windows."


ещё:

"Служебная программа Regsvr32.exe служит для регистрации библиотек DLL и элементов управления ActiveX в системном реестре Windows. Также ее можно использовать для устранения несоответствий между DLL-файлами."

Ну дык, дядя хакер, Вы должны были ужЕ сами догадаться из своей же последней фразы, как работает для нас regsvr32:


http://support.microsoft.com/kb/207132

RegSvr32.exe calls the following Win32 functions in this order:

* OleInitialize
* LoadLibrary to load the DLL
* DllRegisterServer or DllUnregisterServer
* FreeLibrary
* OleUninitialize

http://msdn.microsoft.com/en-us/library/ms683152(VS.85).aspx
FreeLibrary Function

Frees the loaded dynamic-link library (DLL) module and, if necessary, decrements its reference count.
When the reference count reaches zero, the module is unloaded from the address space of the calling
process and the handle is no longer valid.

То есть regsvr32 загружает и освобождает библиотеку. Но в отличие от terminal.exe, который сам или с помощью простого и элегантного решения, которое я предложил выше, освобождает библиотеку, НО САМ ПРОДОЛЖАЕТ ОСТАВАТЬСЯ В ПАМЯТИ, (что даёт основания для Винды покаместь не выгружать библиотеку и предоставлять ея любому другому процессу) - в отличие от висящего в памяти метатрейдера, утилита командной строки regsvr32.exe ЗАВЕРШАЕТ СВОЙ ПРОЦЕСС и ВЫГРУЖАЕТСЯ ИЗ ПАМЯТИ, что даёт основания Винде для полной выгрузки библиотеки из памяти.

Выгрузка библиотеки может произойти и БЕЗ применения regsvr32, но это рулетка. Кому-то нравится рулетка, большинству профи не нравится, это дело уровня развития.

Если библиотека простая и не цепляет МНОГО других библиотек, она МОЖЕТ выгрузиться быстро. Но если библиотека сложная, со связкой с базой данных, с экзотическими элементами управления, то её выгрузка может сильно затянуться - на минуты и даже часы.

Кстати, по поводу параметра AlwaysUnloadDLL - сама Мирософт утверждает, что это работало только до 2000 (далее и теперь применяются сложные алгоритмы подсчёта "нужности DLL-ки"):

http://msdn.microsoft.com/en-us/library/bb776795(VS.85).aspx

Unloading the DLL

The Shell automatically unloads a DLL when its usage count is zero, but only after the DLL has not been used for a period of time. This inactive period might be unacceptably long at times, especially when a Shell extension DLL is being debugged. For operating systems prior to Windows 2000, you can shorten the inactive period by adding the following information to the registry.

  • HKEY_LOCAL_MACHINE
  • Software
  • Microsoft
  • Windows
  • CurrentVersion
  • Explorer
  • AlwaysUnloadDll
 

Поскольку я всё равно сражён сильной простудой (но заметьте, даже лёжа в постели с температурой помогаю совершенно забесплатно решать людям проблемы с terminal.exe, то есть решать их исключительно денежные проблемы), могу рассказать интересующимся (а также и несведующим ПТУ-шникам) как нелегко работать сисадминами в больших междугородних компаниях.

Любая крупная компания использует ЕДИНООБРАЗНЫЕ средства. Это означает, что на всех серверах - локальных и глобальных крутится Ёракл, на всех рабочих станциях используется одна и та же программа одной и той же версии связки Офиса, Excel-а али аналитической программы с Ёраклом или с MS SQL Server, какая-нибудь "dbconnect.dll". И вот в один "замечательный" для сисадминов день разработчики наконец отлаживают новую версию этой проги и всем локальным сиадминам (в компании из первой сотни - сисадминов может быть 500-800, 1.250 Terabyte hard disc memory, 130 NCR nodes, 145 Unix server systems and 2600 Windows servers, 80,000 mail users in more than 2,000 corporate locations) поступает приказ ЗАМЕНИТЬ "на завтра" эту прогу. Прога сложная, использует много чего, просто переписать её на компе - не сработает. И нужно обязательно после regsvr32 перегружать комп - если у сисадмина есть на это время.

При этом замену можно произвести только с 18-00 до 24-00, поскольку до 18-00 офисные люди всё ещё работают за компами, а в 24-00 на серваках начинаются сервисные работы на Ёраклах, на станциях начинаются авто-обновления Винды и авто-обновления антивирусов. Существуют средства для УДАЛЁННОГО ЗАПУСКА regsvr32 и перегруза станции, не подходя к станции, но они срабатывают не всегда, (включённый фаервол, неза-логоф-леный юзер и т.д.). А компов у локального сисадмина может быть 50-100, далеко друг от друга, и на разных этажах, и в ужЕ закрытых офисах.

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

 

Regsvr32 предназначена для регистрации и удаления регистрации COM-серверов в реестре.

Это далеко не все дллки. Это длл специального вида. Вызывать Regsvr32 нет никакой необходимости.

Достаточно вызвать FreeLibrary, как было показано выше, или не использовать "#import", а использовать пару:

LoadLibrary, FreeLibrary.

Кстати у меня дллки почему-то освобождаются сразу после удаления индикатора.

 

Вообще-то лично я пишу для тех, кто умеет читать по-русски и по-английски. Странные люди, они в десятый раз повторяют тут ЗАЧЕМ СОЗДАНА regsvr32. Они долбят это как мантру, как заклинание, а другие типа не знают зачем. А какое это имеет значение, если regsvr32 делает то, что нам нужно и не имеет побочных эффектов?

Это всё равно, как врач скорой помощи или реанимации приписывает алкашу ("продвинутому" такому) гипосульфит натрия

http://drugslist.ru/drugs/antichlor-sodium-thiosulfate/

а тот начинает орать, что он его пить не будет, потому что ..... это фото-закрепитель и его хотят отравить!

http://www.rwwc.ru/recipe/index6.php

Если тут так много умников, то пусть укажут ДРУГУЮ стандартную утилиту, которая есть под рукой на любом компе, которая бы загружала и тут же выгружала бы ЛЮБУЮ ЖЕЛАЕМУЮ БИБЛИОТЕКУ, чтобы таким образом сбрасывала кэширование DLL-ек Виндой.

 
AlexEro >>:

...

они в десятый раз повторяют тут ЗАЧЕМ СОЗДАНА regsvr32. А какое это имеет значение, если regsvr32 делает то, что нам нужно и не имеет побочных эффектов? Они долбят это как мантру, как заклинание.

Это всё равно, как врач скорой помощи или реанимации приписывает алкашу ("продвинутому" такому) гипосульфит натрия

...

Всё это имеет очень большое значение. Если уж пошли медицинские аналогии, то то что вы тут пишите, - это всё равно что лечить больную голову с помощью топора.


AlexEro >>:

...

Выгрузка библиотеки может произойти и БЕЗ применения regsvr32, но это рулетка. Кому-то нравится рулетка, большинству профи не нравится, это дело уровня развития.

Если библиотека простая и не цепляет МНОГО других библиотек, она МОЖЕТ выгрузиться быстро. Но если библиотека сложная, со связкой с базой данных, с экзотическими элементами управления, то её выгрузка может сильно затянуться - на минуты и даже часы.

...


Вы просто не понимаете как в принципе функционирует механизм загрузки\выгрузки dll, от сюда у вас такие больные фантазии на эту тему. Не нужно использовать regsvr32, она не для этого предназначена.Так же не нужно пытаться выгружать в deinit библиотеку с помощью FreeLibrary, библиотека должна сама выгружаться, если в ней конечно нет грубых ошибок. Ваше "простое и элегантное решение" - ерунда. Оно не будет работать во многих случаях, особенно если возникают deadlock-ки в пределах DllMain.


Повторяю, единственный нормальный и правильный путь выгрузки dll - это написание самой dll без ошибок. Если dll не выгружается штатно - значит у кодера кривые руки (именно у кодера, в самом терминале всё сделано грамотно), - всё. У меня всегда, повторяю, всегда dll выгружается штатно, сразу же после удаления индикатора. И это правильно, именно так задумано в терминале.


И вы зря пытаетесь придать вес своим выдумкам ссылаясь на свой сисадминский опыт. Мы уже выяснили что сисадмин из вас не очень толковый, по этому выглядит это очень по детски, смешно.

 
HideYourRichess >>:
Вы просто не понимаете как в принципе функционирует механизм загрузки\выгрузки dll, от сюда у вас такие больные фантазии на эту тему.... (тут были опять мантры).Так же не нужно пытаться выгружать в deinit библиотеку с помощью FreeLibrary, библиотека должна сама выгружаться, если в ней конечно нет грубых ошибок. Ваше "простое и элегантное решение" - ерунда. Оно не будет работать во многих случаях, особенно если возникают deadlock-ки в пределах DllMain.
Дядя хакер, в Ваших словах нет никакой логики: если библиотека САМА и ВСЕГДА выгружается, то почему "мой" вызов FreeLibrary по Вашим словам "не будет работать во многих случаях"? Какой может быть вред от лишнего вызова FreeLibrary в блоке deinit()? Может, вызов FreeLibrary() по-Вашему как-то заблокирует освобождение библиотеки, что-ли? Неувязочка, дядя кул хацкер, причём явная.
 
AlexEro >>:
Дядя хакер, в Ваших словах нет никакой логики

1-й вопрос на засыпку -- как система узнает из каких процессов выгружать дллку?

2-й вопрос на засыпку -- как без загрузки дллки найти точку входа в оной?


Теперь по существу. Дллка закружается и выгружается в процессе regsvr для корректной регистрации. И естественно это никак не сказывается на выгрузке ее из других процессов.

Не пытайтесь казаться глупее, чем вы есть. Хотя один плюс все же есть -- маны читать вы можете.

если библиотека САМА и ВСЕГДА выгружается, то почему "мой" вызов FreeLibrary по Вашим словам "не будет работать во многих случаях"? Какой может быть вред от лишнего вызова FreeLibrary в блоке deinit()? Может, вызов FreeLibrary() по-Вашему как-то заблокирует освобождение библиотеки, что-ли? Неувязочка, дядя кул хацкер, причём явная.

Это очевидно. Кроме выгрузки дллки в имплементации деинициализации индикатора (эксперта) может быть что угодно, непосредственно с этим связанное, что переводит самовольное освобождение дллки в разряд хаков, что в свою очередь не гарантирует корректной работы терминала.


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

2All: не вздумайте его в админы взять.

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