Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DLL
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
muravei
Можно ли в длл(свою) загрузить другую длл.
Оно , конечно, не долго попробовать...
Но , может , этого не стоит и делать. laughing.gif
jcxz
Цитата(muravei @ Jul 26 2016, 16:44) *
Можно ли в длл(свою) загрузить другую длл.
Оно , конечно, не долго попробовать...
Но , может , этого не стоит и делать. laughing.gif

А что значит "в длл загрузить длл"?
Как я понимаю: при вызове функции DLL, она отображается в память вызвавшего процесса, и продолжается собственно выполнение этого же процесса.
Если изнутри этой функции вызвать другую функцию DLL - ну и что? Таких вызовов полно. Произойдёт опять отображение той второй DLL на память этого же процесса.
У каждого процесса своя копия образа всех отображённых в него DLL.
Т.е. - у DLL нет своей памяти и "грузить", соответственно, туда невозможно. Память есть у процесса. Туда и отображаются DLL.
muravei
Цитата(jcxz @ Jul 26 2016, 16:25) *
. Память есть у процесса. Туда и отображаются DLL.

Естественно, но , например, при завершении процесса, кто ее выгрузит из памяти?
Процесс , то не знает...
k155la3
Возможно имеется ввиду не загрузка, а "зависимые" DLL
когда одно DLL тянет за собой целый парвоз-состав.
Посмотрите утилиту из MS VC walker - смотрельщик этого всего.
SlavaV
Операционная система загружает библиотеку единственный раз в память и проецирует её каждому вызывающему процессу. При каждом запросе библиотеки (запуск приложения использующего данную библиотеку) увеличивается счетчик ссылок, при завершении процесса счетчик уменьшается и когда он равен 0 библиотека выгружается из память.
muravei
Нет , я как раз про загрузку, естественно, в память процесса. Почему нельзя в каждой экспортируемой функции, проверять: была ли загружена вторая длл, и если нет , то - LoadLibrary, GetProcAddress.
jcxz
Цитата(muravei @ Jul 26 2016, 19:52) *
Естественно, но , например, при завершении процесса, кто ее выгрузит из памяти?
Процесс , то не знает...

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

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

В любом случае: выполняется не DLL, а процесс и только у него есть контекст. А при вызове функции DLL данным процессом, она отображается в память процесса. Неважно - вызвана эта функция из кода процесса или из кода функции другой DLL, уже отображенной в памятть процесса - для системы она вызвана из процесса, так как вызвана из его памяти.
alexeyv
ТС, уточни! Ты имеешь ввиду статическое связывание ДЛЛ или динамическую загрузку во время работы? При статическом связывании загрузкой/выгрузкой занимается операционка. А при динамической загрузке - программа.
Kabdim
Статического связывания ДЛЛ вроде как не бывает. sm.gif Если конечно не считать за такую вспомогательную либу которая генерится студиевскими компиляторами и требуется только ими же.
alexeyv
Цитата(Kabdim @ Aug 1 2016, 11:33) *
Статического связывания ДЛЛ вроде как не бывает. sm.gif Если конечно не считать за такую вспомогательную либу которая генерится студиевскими компиляторами и требуется только ими же.


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


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


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

Что Вы имели в виду - понятно. Только называется я думаю это не "статическим связыванием", а как-то по-другому. Ибо DLL она сама по себе: "dynamically linked library".
muravei
То что меня интересовало называется явная загрузка длл, через лоад лайбруари.
Больше не интересует, как и ответы некоторых " специалистов" азбучными истинами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.