Перейти к содержанию
    

Можно ли в длл(свою) загрузить другую длл.

Оно , конечно, не долго попробовать...

Но , может , этого не стоит и делать. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно ли в длл(свою) загрузить другую длл.

Оно , конечно, не долго попробовать...

Но , может , этого не стоит и делать. :laughing:

А что значит "в длл загрузить длл"?

Как я понимаю: при вызове функции DLL, она отображается в память вызвавшего процесса, и продолжается собственно выполнение этого же процесса.

Если изнутри этой функции вызвать другую функцию DLL - ну и что? Таких вызовов полно. Произойдёт опять отображение той второй DLL на память этого же процесса.

У каждого процесса своя копия образа всех отображённых в него DLL.

Т.е. - у DLL нет своей памяти и "грузить", соответственно, туда невозможно. Память есть у процесса. Туда и отображаются DLL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

. Память есть у процесса. Туда и отображаются DLL.

Естественно, но , например, при завершении процесса, кто ее выгрузит из памяти?

Процесс , то не знает...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно имеется ввиду не загрузка, а "зависимые" DLL

когда одно DLL тянет за собой целый парвоз-состав.

Посмотрите утилиту из MS VC walker - смотрельщик этого всего.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Операционная система загружает библиотеку единственный раз в память и проецирует её каждому вызывающему процессу. При каждом запросе библиотеки (запуск приложения использующего данную библиотеку) увеличивается счетчик ссылок, при завершении процесса счетчик уменьшается и когда он равен 0 библиотека выгружается из память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет , я как раз про загрузку, естественно, в память процесса. Почему нельзя в каждой экспортируемой функции, проверять: была ли загружена вторая длл, и если нет , то - LoadLibrary, GetProcAddress.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Естественно, но , например, при завершении процесса, кто ее выгрузит из памяти?

Процесс , то не знает...

Это дело системы - выгружать или нет. Эта DLL может использоваться и другими процессами.

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

 

Возможно имеется ввиду не загрузка, а "зависимые" DLL

когда одно DLL тянет за собой целый парвоз-состав.

В любом случае: выполняется не DLL, а процесс и только у него есть контекст. А при вызове функции DLL данным процессом, она отображается в память процесса. Неважно - вызвана эта функция из кода процесса или из кода функции другой DLL, уже отображенной в памятть процесса - для системы она вызвана из процесса, так как вызвана из его памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ТС, уточни! Ты имеешь ввиду статическое связывание ДЛЛ или динамическую загрузку во время работы? При статическом связывании загрузкой/выгрузкой занимается операционка. А при динамической загрузке - программа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Статического связывания ДЛЛ вроде как не бывает. :) Если конечно не считать за такую вспомогательную либу которая генерится студиевскими компиляторами и требуется только ими же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Статического связывания ДЛЛ вроде как не бывает. :) Если конечно не считать за такую вспомогательную либу которая генерится студиевскими компиляторами и требуется только ими же.

 

Не правильно выразился. Есть два типа связывания DLL - статическое и динамическое.

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

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

 

 

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

 

static_link.jpg

 

Изменено пользователем alexeyv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не правильно выразился. Есть два типа связывания DLL - статическое и динамическое.

...

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

Что Вы имели в виду - понятно. Только называется я думаю это не "статическим связыванием", а как-то по-другому. Ибо DLL она сама по себе: "dynamically linked library".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То что меня интересовало называется явная загрузка длл, через лоад лайбруари.

Больше не интересует, как и ответы некоторых " специалистов" азбучными истинами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...