Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

FreeLibrary


bc0113 ©   (2005-05-05 22:34:00) 

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


default   (2005-05-05 23:42:00) [1]

в принципе LoadLibrary можно просто вставить в каждой функции
хоть счётчик и не резиновый, когда наступить предел LoadLibrary просто вернёт False, а после завершения чужого приложения винда всё подчистит, но лучше сделать через булев флаг
в секции реализации DLL
var
 F: Boolean = False;
...
а в ф-ях писать типа
if not F then begin
  LoadLibrary(...);
  F := True;
 end;
так производительней будет


bc0113   (2005-05-05 23:30:00) [2]

ну что спасибо за совет, буду копать в этом направлении


default   (2005-05-05 23:25:00) [3]

bc0113   (05.05.05 23:22) [4]
да, после линковки DLL она становится куском процесса вызвавшего LoadLibrary
поэтому можно считать что LoadLibrary вызвал сам процесс


bc0113   (2005-05-05 23:22:00) [4]

я думал об этом, спасибо, за совет, надо будет это попробывать, единственное что меня смущает это будет ли увеличен счетчик ссылок на DLL если я из нее вызову LoadLibrary самой себя?


default   (2005-05-05 23:19:00) [5]

ну "вражеское приложение" же обязательно будет какие-то ф-ции Вашей DLL вызывать? можно в них закинуть вызов LoadLibrary чтобы увеличить счётчик ссылок на 1(ну и использовать глобальную переменную DLL для того чтобы не увеличивать счётчик при вызовах ф-ий DLL неограничено) всё-равно когда "враж-ое прилож-ие" будет выгружаться винда всё подчистит за Вами


bc0113   (2005-05-05 23:11:00) [6]

если я чего не ясно объяснил тогда еще раз. DLL моя вызывающее ее приложение не мое. Приложение загружает dll путем вызова LoadLibrary, динамической линковки, использует некоторые функции а затем выгружает вызывлм FreeLibrary. Мне бы очень хотелось чтобы после этого DLL осталась в памяти, я пытался перехватить вызов FreeLibrary методом предложенным Рихтером, т.е. путем изменения таблицы импорта, но оказалось что приложения, которое загружает DLL упаковано, и в таблице импорта нет FreeLibrary, т.е. этот метод не очень подходит, может кто посоветует другой?


default   (2005-05-05 22:59:00) [7]

обычно, когда нужно использование DLL до конца работы приложения их статически линкуют(на этапе компиляции)
если DLL можно не обнаружить и нужно линковать динамически и надо держать DLL до конца работы приложения что мешает до конца работы приложения не вызывать FreeLibrary?
windows только может выгрузить DLL из памяти после всех FreeLibrary, хотя есть вроде нештатные приёмы выгрузки


Наверх

Титульная страница Поиск, карта сайта Написать письмо