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

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

Вопрос О DLL


Демонов Е.В. ©   (2002-10-03 12:06:00) 

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

Но вот не могу понять. Есть код.

Library pr1

var p:PChar;

function asd:PCHar;export;
begin
result:=p;
end;

exports
asd;

begin
p:=allocmem(200);
strPCopy(p,TimeToSTr(Now));
end.

Т.е. ф-ия asd возвращает момент загрузки DLL в память.

Есть програма:

procedure OnButton1Click(Sender:TOnject);
var s:function:PCHar;
h:tHandle;
begin
h:=LoadLibrary("pr1");
if h<32
then
raise Exception.Create("Not Loadede")
else
@s:=GetProcAddres("asd")

Label.Caption:=asd;

//но библиотеку я не выгружаю т.е. не делаю FreeLibrary

end;

Запускаю две копии программы - выполняю код OnButton1Click для одной программы она показывает время например 13:20:00 потом для второй 13:20:05 , потом опять для первой
13:20:00 и для второй опять 13:20:05.

Я так понимаю что разное время говорит о том что библиотека как минимум два раза загрузилась и ТО ЧТО ДЛЯ каждой программы возвражается свое значение переменной P значит что два раза загрузилось в разное адресное пространство.

Так как это согласуется с тем что Dll один раз грузится в память.
Я что то не понимаю - разталкуйте.


Игорь Шевченко   (2002-10-03 13:26:00) [1]

Le Taon (03.10.02 13:19)

Совершенно верно :-)


Le Taon   (2002-10-03 13:19:00) [2]

Игорь Шевченко ©
это если ДЛЛ загружается по желательному адресу.


Игорь Шевченко   (2002-10-03 13:04:00) [3]

Aleksey Pavlov © (03.10.02 12:32)

Строго говоря, при первом обращении к DLL создается объект FileMapping. Из которого, затем, по мере надобности, страницы подкачиваются в адресное пространство целевого процесса.

Кстати, диск от RSDN #0 я тебе и сам могу откопировать. Если интересно, свяжись по аське.

С уважением,


Aleksey Pavlov   (2002-10-03 12:32:00) [4]

Игорь Шевченко © (03.10.02 12:18) +
механизм функционирования DLL поддерживает подсчёт ссылок, т.е. при первом обращении к DLL она загружается в физическуюпамять и счётчик ссылок увеличивается на единицу.
При последующих обращениях происходит отображения данной DLL на АП вызывающего процесса и счётчик увеличивается ещё на еденицу.
Когда процесс, использующий данную DLL вызывает FreeLibrary или же просто оканчивает свою работу, счётчик ссылок уменьшается на 1.
Когда счётчик обнуляется библиотека выгружается из памяти.
(строго говоря, это не всегда так :)


Digitman   (2002-10-03 12:29:00) [5]

Вкратце - так :

Кодовые секции DLL действительно грузятся в ФАП однократно и м.б. использованы в последствии многими вызывающими процессами без повторной их загрузки.

Секции же данных (к коим относится и секция, в которой компилятор/линкер разместят твою var p:PChar) индивидуальны для каждого процесса в отдельности


Игорь Шевченко   (2002-10-03 12:18:00) [6]

DLL грузится в память (если пользоваться вашей терминогией) один раз, а отображается на адресные пространства процессов столько раз, сколько процессов ее используют. При каждом отображении вызывается ваш код с TimeToStr(Now)


Наверх

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