реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> DLL, Глупый вопрос. :)
muravei
сообщение Jul 26 2016, 10:44
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Можно ли в длл(свою) загрузить другую длл.
Оно , конечно, не долго попробовать...
Но , может , этого не стоит и делать. laughing.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 26 2016, 12:25
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(muravei @ Jul 26 2016, 16:44) *
Можно ли в длл(свою) загрузить другую длл.
Оно , конечно, не долго попробовать...
Но , может , этого не стоит и делать. laughing.gif

А что значит "в длл загрузить длл"?
Как я понимаю: при вызове функции DLL, она отображается в память вызвавшего процесса, и продолжается собственно выполнение этого же процесса.
Если изнутри этой функции вызвать другую функцию DLL - ну и что? Таких вызовов полно. Произойдёт опять отображение той второй DLL на память этого же процесса.
У каждого процесса своя копия образа всех отображённых в него DLL.
Т.е. - у DLL нет своей памяти и "грузить", соответственно, туда невозможно. Память есть у процесса. Туда и отображаются DLL.
Go to the top of the page
 
+Quote Post
muravei
сообщение Jul 26 2016, 13:52
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(jcxz @ Jul 26 2016, 16:25) *
. Память есть у процесса. Туда и отображаются DLL.

Естественно, но , например, при завершении процесса, кто ее выгрузит из памяти?
Процесс , то не знает...
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 26 2016, 13:54
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Возможно имеется ввиду не загрузка, а "зависимые" DLL
когда одно DLL тянет за собой целый парвоз-состав.
Посмотрите утилиту из MS VC walker - смотрельщик этого всего.
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Jul 26 2016, 14:01
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Операционная система загружает библиотеку единственный раз в память и проецирует её каждому вызывающему процессу. При каждом запросе библиотеки (запуск приложения использующего данную библиотеку) увеличивается счетчик ссылок, при завершении процесса счетчик уменьшается и когда он равен 0 библиотека выгружается из память.
Go to the top of the page
 
+Quote Post
muravei
сообщение Jul 26 2016, 14:08
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Нет , я как раз про загрузку, естественно, в память процесса. Почему нельзя в каждой экспортируемой функции, проверять: была ли загружена вторая длл, и если нет , то - LoadLibrary, GetProcAddress.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 27 2016, 06:58
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(muravei @ Jul 26 2016, 19:52) *
Естественно, но , например, при завершении процесса, кто ее выгрузит из памяти?
Процесс , то не знает...

Это дело системы - выгружать или нет. Эта DLL может использоваться и другими процессами.
Система может, например, завести счётчик использования, инкрементировать его при каждом отображении в память процесса, декрементировать при завершении такого процесса. И когда счётчик станет ==0 - значит DLL больше не нужна, можно её выгрузить.

Цитата(k155la3 @ Jul 26 2016, 19:54) *
Возможно имеется ввиду не загрузка, а "зависимые" DLL
когда одно DLL тянет за собой целый парвоз-состав.

В любом случае: выполняется не DLL, а процесс и только у него есть контекст. А при вызове функции DLL данным процессом, она отображается в память процесса. Неважно - вызвана эта функция из кода процесса или из кода функции другой DLL, уже отображенной в памятть процесса - для системы она вызвана из процесса, так как вызвана из его памяти.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Aug 1 2016, 04:36
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



ТС, уточни! Ты имеешь ввиду статическое связывание ДЛЛ или динамическую загрузку во время работы? При статическом связывании загрузкой/выгрузкой занимается операционка. А при динамической загрузке - программа.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Aug 1 2016, 06:33
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Статического связывания ДЛЛ вроде как не бывает. sm.gif Если конечно не считать за такую вспомогательную либу которая генерится студиевскими компиляторами и требуется только ими же.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Aug 1 2016, 08:42
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата(Kabdim @ Aug 1 2016, 11:33) *
Статического связывания ДЛЛ вроде как не бывает. sm.gif Если конечно не считать за такую вспомогательную либу которая генерится студиевскими компиляторами и требуется только ими же.


Не правильно выразился. Есть два типа связывания DLL - статическое и динамическое.
Первый используется на этапе компиляции/линковки программы. Например, загружая программу, загрузчик программ операционки сам проверяет связи программы, обновляет указатели на ф-ции и подгружает недостающие DLL и запускает программу.
Второй используется на этапе выполнения программы. Он используется, например, при добавлении различных плагинов к программе. Программа в определенном каталоге сканирует файлы DLL и пытается их загрузить, тем самым добавляя новые ф-ции в программу. Здесь, соответственно, программы сама должна позаботится о выгрузке неиспользуемых DLL (то есть программист должен написать соответствующий код)


Это статическое связывание:




Сообщение отредактировал alexeyv - Aug 1 2016, 08:45
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 2 2016, 04:08
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(alexeyv @ Aug 1 2016, 14:42) *
Не правильно выразился. Есть два типа связывания DLL - статическое и динамическое.
...
Это статическое связывание:

Что Вы имели в виду - понятно. Только называется я думаю это не "статическим связыванием", а как-то по-другому. Ибо DLL она сама по себе: "dynamically linked library".
Go to the top of the page
 
+Quote Post
muravei
сообщение Aug 2 2016, 04:35
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



То что меня интересовало называется явная загрузка длл, через лоад лайбруари.
Больше не интересует, как и ответы некоторых " специалистов" азбучными истинами.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 20:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016