muravei 3 26 июля, 2016 Опубликовано 26 июля, 2016 · Жалоба Можно ли в длл(свою) загрузить другую длл. Оно , конечно, не долго попробовать... Но , может , этого не стоит и делать. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 26 июля, 2016 Опубликовано 26 июля, 2016 · Жалоба Можно ли в длл(свою) загрузить другую длл. Оно , конечно, не долго попробовать... Но , может , этого не стоит и делать. :laughing: А что значит "в длл загрузить длл"? Как я понимаю: при вызове функции DLL, она отображается в память вызвавшего процесса, и продолжается собственно выполнение этого же процесса. Если изнутри этой функции вызвать другую функцию DLL - ну и что? Таких вызовов полно. Произойдёт опять отображение той второй DLL на память этого же процесса. У каждого процесса своя копия образа всех отображённых в него DLL. Т.е. - у DLL нет своей памяти и "грузить", соответственно, туда невозможно. Память есть у процесса. Туда и отображаются DLL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
muravei 3 26 июля, 2016 Опубликовано 26 июля, 2016 · Жалоба . Память есть у процесса. Туда и отображаются DLL. Естественно, но , например, при завершении процесса, кто ее выгрузит из памяти? Процесс , то не знает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 26 июля, 2016 Опубликовано 26 июля, 2016 · Жалоба Возможно имеется ввиду не загрузка, а "зависимые" DLL когда одно DLL тянет за собой целый парвоз-состав. Посмотрите утилиту из MS VC walker - смотрельщик этого всего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaV 0 26 июля, 2016 Опубликовано 26 июля, 2016 · Жалоба Операционная система загружает библиотеку единственный раз в память и проецирует её каждому вызывающему процессу. При каждом запросе библиотеки (запуск приложения использующего данную библиотеку) увеличивается счетчик ссылок, при завершении процесса счетчик уменьшается и когда он равен 0 библиотека выгружается из память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
muravei 3 26 июля, 2016 Опубликовано 26 июля, 2016 · Жалоба Нет , я как раз про загрузку, естественно, в память процесса. Почему нельзя в каждой экспортируемой функции, проверять: была ли загружена вторая длл, и если нет , то - LoadLibrary, GetProcAddress. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 27 июля, 2016 Опубликовано 27 июля, 2016 · Жалоба Естественно, но , например, при завершении процесса, кто ее выгрузит из памяти? Процесс , то не знает... Это дело системы - выгружать или нет. Эта DLL может использоваться и другими процессами. Система может, например, завести счётчик использования, инкрементировать его при каждом отображении в память процесса, декрементировать при завершении такого процесса. И когда счётчик станет ==0 - значит DLL больше не нужна, можно её выгрузить. Возможно имеется ввиду не загрузка, а "зависимые" DLL когда одно DLL тянет за собой целый парвоз-состав. В любом случае: выполняется не DLL, а процесс и только у него есть контекст. А при вызове функции DLL данным процессом, она отображается в память процесса. Неважно - вызвана эта функция из кода процесса или из кода функции другой DLL, уже отображенной в памятть процесса - для системы она вызвана из процесса, так как вызвана из его памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 1 августа, 2016 Опубликовано 1 августа, 2016 · Жалоба ТС, уточни! Ты имеешь ввиду статическое связывание ДЛЛ или динамическую загрузку во время работы? При статическом связывании загрузкой/выгрузкой занимается операционка. А при динамической загрузке - программа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 1 августа, 2016 Опубликовано 1 августа, 2016 · Жалоба Статического связывания ДЛЛ вроде как не бывает. :) Если конечно не считать за такую вспомогательную либу которая генерится студиевскими компиляторами и требуется только ими же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 1 августа, 2016 Опубликовано 1 августа, 2016 (изменено) · Жалоба Статического связывания ДЛЛ вроде как не бывает. :) Если конечно не считать за такую вспомогательную либу которая генерится студиевскими компиляторами и требуется только ими же. Не правильно выразился. Есть два типа связывания DLL - статическое и динамическое. Первый используется на этапе компиляции/линковки программы. Например, загружая программу, загрузчик программ операционки сам проверяет связи программы, обновляет указатели на ф-ции и подгружает недостающие DLL и запускает программу. Второй используется на этапе выполнения программы. Он используется, например, при добавлении различных плагинов к программе. Программа в определенном каталоге сканирует файлы DLL и пытается их загрузить, тем самым добавляя новые ф-ции в программу. Здесь, соответственно, программы сама должна позаботится о выгрузке неиспользуемых DLL (то есть программист должен написать соответствующий код) Это статическое связывание: Изменено 1 августа, 2016 пользователем alexeyv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 2 августа, 2016 Опубликовано 2 августа, 2016 · Жалоба Не правильно выразился. Есть два типа связывания DLL - статическое и динамическое. ... Это статическое связывание: Что Вы имели в виду - понятно. Только называется я думаю это не "статическим связыванием", а как-то по-другому. Ибо DLL она сама по себе: "dynamically linked library". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
muravei 3 2 августа, 2016 Опубликовано 2 августа, 2016 · Жалоба То что меня интересовало называется явная загрузка длл, через лоад лайбруари. Больше не интересует, как и ответы некоторых " специалистов" азбучными истинами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться