Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Гарантированная выгрузка Dll из памяти если ошибка, Как??? 
:(
    Опции темы
ivan219
  Дата 11.10.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



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

procedure TForm1.FormCreate(Sender: TObject);
begin
 LibreyHandle; // Загрузка DLL
end;

Выгрузка.
Код

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FreeHandle; // Выгрузка DLL
end;


Вопрос: как зедлать так чтоб вовремя появления ошибки т.е. когда приложение закрылось не через  Destroy а както иначе или вобще повисло и закрыть его можно только через Диспетчер задачь то Dll выгружалась smile 
PM MAIL ICQ   Вверх
Snowy
Дата 11.10.2006, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



При уничтожении программы автоматически освобождаются все занятые ею хэндлы.
Следовательно dll по любому будет выгружена, т.к. больше нет владельцев хэндла.
PM MAIL   Вверх
ivan219
Дата 11.10.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



А зачемже тогда везде пишут что надо незабывать освобождать память да и вот такие конструкции для чего
Код

 try
  if LibHandle=0 then MessageBox(0,'Библиотека не загрузилась','сообщение',MB_OK)
  else
   begin
    Plugin := GetProcAddress(LibHandle, 'Plugin');
    if Assigned(Plugin) and Plugin('Calculator',Caption) then
     begin
      CaptionPlugin:=Caption;
      Result:=True;
     end;
   end;
 finally
  FreeLibrary(LibHandle);
 end;

Этоже гарантированно выгружает Dll при ошибке.

Что то я не пойму smile 
PM MAIL ICQ   Вверх
Snowy
Дата 12.10.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Разумеется по хорошему нужно выгружать.
А по плохому - это за тебя сделает винда.
Кроме того, такие обработчики нужны обязательно, если программа не завершается, а выгрузить нужно.
Но в твоём случае она завершается.
Так что выгружай, как обычно.
Если вдруг что-то и произойдёт, и твоя программа не сможет ничего сделать, что маловероятно, то у тебя и выбора-то нет.
Но винда всё сделает за тебя. Не будет она держать в памяти бесхозную дллину.

Добавлено @ 00:05 
Цитата(ivan219 @  11.10.2006,  23:51 Найти цитируемый пост)
А зачемже тогда везде пишут что надо незабывать освобождать память да и вот такие конструкции для чего
Ну это скорее для старых виндов - чтобы корректно освободить занятую dll-кой память.
Для XP не актуально, но злоупотреблять не стОит.
То есть по возможности нужно выгружать.
А, если уж аварийная ситуация, тут ничего не поделаешь - пусть винда её разруливает, раз твой процесс больше не рулит.
PM MAIL   Вверх
Alexeis
Дата 12.10.2006, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Вообще для успешного программирования нужно следовать определеным принципам, один из которых "захватил - освободи" или "открыл - закрой". Их надо соблюдать всегда это структурирует програму и делает ее однообразной. Однообразие дает предсказуемость, и как следствие прозрачность кода. Уникальный код как правило сложен в понимании и трудно изменяем, так как для его коректирования требуется держать в голове все его особенности. При однообразном програмировании этого не нужно делать, поскольку ты и так знаешь как у тебя должно быть сделано по правилам, и если правила соблюдены, то все работает именно так как ты и предпологал. 
  Система принципов програмирования позволяет минимизировать число логических ошибок и оставить поле для модификаций. Это оправдано по крайней мере экономически, поскольку выигрыш двух десятков строк обернется в будущем двумя десятками проблем при поиске сложных ошибок. 
  После того как проект превысит определенное число строк, то он неизбежно зайдет в тупик (если написан не по правилам), это произойдет потому как исправление ошибок начнет приводить к появлению новых ошибок, а это уже труба smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
Дата 12.10.2006, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



alexeis1, тут ты прав уменя действительно труба в старом проекте но сейчас я его переделываю на новый лад может проще выйдет smile 
Цитата(alexeis1 @  12.10.2006,  01:30 Найти цитируемый пост)
"захватил - освободи" или "открыл - закрой"

А это правило невсегда можно соблюсти.
Вот мой проект прямое этому докозательство (на данный момент) хотя может и смогу обойти и зделать как надо smile 

Snowy, моей прогой будут пользоватся нетолько в XP но ещё и 98 так что надо думать smile

Добавлено @ 03:21 
А ведь когда окно закрывается Windows то сам Windows посылает ему какоето сообщение может можно как то через это вурулить smile 
PM MAIL ICQ   Вверх
Yanis
Дата 12.10.2006, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(ivan219 @  12.10.2006,  04:09 Найти цитируемый пост)
А ведь когда окно закрывается Windows то сам Windows посылает ему какоето сообщение может можно как то через это вурулить

А чем тебя не устраивает выгрузка библиотек виндой?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
ivan219
Дата 12.10.2006, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Snowy, говорит что для старых Windows это проблематично smile 
PM MAIL ICQ   Вверх
Alexeis
Дата 12.10.2006, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(ivan219 @  12.10.2006,  03:09 Найти цитируемый пост)
А ведь когда окно закрывается Windows то сам Windows посылает ему какоето сообщение

WM_CLOSE


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 12.10.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Может быть проблематично, если ты там выделяешь память в больших количествах.
Но ты ведь этого не делаешь...
Что касается сообщения... Да, по этому сообщению и вызывается деструктор формы.
Если он не вызвался, то ничего ты сделать не сможешь - значит твоя программа не отвечает.
PM MAIL   Вверх
bazzzman
  Дата 16.10.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 24.7.2006

Репутация: 0
Всего: 2



Цитата(Snowy @ 11.10.2006,  23:27)
При уничтожении программы автоматически освобождаются все занятые ею хэндлы.
Следовательно dll по любому будет выгружена, т.к. больше нет владельцев хэндла.

по любому будет выгружена - не правда.

У меня программа ставит хуки (LL и SHELL) из dll.

Так вот (иногда и не всех экземплярах Windows XP, но баг есть и он регулярно напоминает о себе) при закрытии приложения dll остается в памяти. Т.е. ее невозможно перезаписать.

Причем видно ее processexplorer'ом у чужих приложений. Это наверное из-за SetWindowsHookEx(WH_SHELL).

Проходит около 1 минуты и dll выгружается сама, без моей помощи  smile 

Думаю это связано c кэшем dll в Windows XP. Даже в NullSoft Install System (инсталлятор) есть команды в скриптах для принудительной выгрузки таких dll перед перезаписью.

Получается WIndows XP не моментально выгружает все dll, а некоторые из них оставляет в памяти на некоторое время.

Не важно почему это происходит. Как гарантировано выгрузить dll из памяти?
PM MAIL WWW   Вверх
tnt17
Дата 16.10.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.10.2006

Репутация: нет
Всего: нет



Цитата(bazzzman @  16.10.2006,  10:16 Найти цитируемый пост)
Получается WIndows XP не моментально выгружает все dll, а некоторые из них оставляет в памяти на некоторое время.

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

Это сообщение отредактировал(а) tnt17 - 16.10.2006, 10:38
PM   Вверх
bazzzman
Дата 17.10.2006, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 24.7.2006

Репутация: 0
Всего: 2



Интересно... Хук снимаю. И что еще могут обрабатывать чужие процессы в моей длл в течении минуты?

Это кэш 100%. Винда это делает чтобы не тратить время на загрузку часто используемых длл в память.

Вопрос не в том почему это происходит, а как от этого избавится?

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.