Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-45479
Сергей Ф
2002-07-05 16:51
2002.10.14
Как узнать, доступен ли компьютер с заданным ip-адресом в LAN?


7-45598
Avenger
2002-07-01 19:15
2002.10.14
Ресурсы


14-45571
Ketmar
2002-09-18 14:19
2002.10.14
господа, а как зовут книжечку, по мотивам которой Half-Life...


7-45599
Doctor Deejay
2002-06-28 18:43
2002.10.14
Прога на другом компе не работает. В проге 3 строчки :(


1-45323
Alexander
2002-10-05 09:52
2002.10.14
В ImageList есть 2 битмапа с белым фоном, как мне в этот





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский