Форум: "Основная";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
ВнизВопрос О 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.059 c