Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.14;
Скачать: CL | DM;

Вниз

Вопрос О DLL   Найти похожие ветки 

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

Я так понимаю что 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 12:18) [1]

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


 
Digitman ©   (2002-10-03 12:29) [2]

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

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

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


 
Aleksey Pavlov ©   (2002-10-03 12:32) [3]

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


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

Aleksey Pavlov © (03.10.02 12:32)

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

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

С уважением,


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

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


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

Le Taon (03.10.02 13:19)

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



Страницы: 1 вся ветка

Текущий архив: 2002.10.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
1-45306
DaTak
2002-10-02 17:00
2002.10.14
Вычисления???Как правильно вычислять??


1-45261
совсем Новенький
2002-10-04 11:23
2002.10.14
Компоненты InDy


1-45251
ded_di
2002-10-01 15:20
2002.10.14
скроллеры у TTreeView


4-45655
AntonV
2002-09-01 10:06
2002.10.14
Вопрос о BeginThread


1-45423
Kacnep
2002-10-03 13:08
2002.10.14
Цвет в TreeView