FreeLibrary
От: SDS Россия www.cadsofttools.com
Дата: 05.05.05 18:32
Оценка:
можно ли запретить выгрузку DLL после вызова FreeLibrary, до некоторого момента? про счетчики использования и т.д.объяснять пожалуйста не надо, DLL загружает приложение LoadLibrary использует ее и тут же выгружает FreeLibrary, больше ее не использует не кто Windows ее выгружает из памяти, мне бы хотелось узнать можно ли сделать так чтобы DLL осталась в память и до завершения работы вызвавшего ее приложения?
Re: FreeLibrary
От: Slesh  
Дата: 05.05.05 22:24
Оценка:
Здравствуйте, SDS, Вы писали:

Глупо конечно, но может не делать FreeLibrary?
А вообще не плохо бы знать причину такого желания(если это конечно возможно), тогда и способ искать легче.

SDS>можно ли запретить выгрузку DLL после вызова FreeLibrary, до некоторого момента? про счетчики использования и т.д.объяснять пожалуйста не надо, DLL загружает приложение LoadLibrary использует ее и тут же выгружает FreeLibrary, больше ее не использует не кто Windows ее выгружает из памяти, мне бы хотелось узнать можно ли сделать так чтобы DLL осталась в память и до завершения работы вызвавшего ее приложения?
... << RSDN@Home 1.1.3 stable >>
Re: FreeLibrary
От: Кодёнок  
Дата: 06.05.05 05:29
Оценка:
SDS>можно ли запретить выгрузку DLL после вызова FreeLibrary, до некоторого момента? про счетчики использования и т.д.объяснять пожалуйста не надо, DLL загружает приложение LoadLibrary использует ее и тут же выгружает FreeLibrary, больше ее не использует не кто Windows ее выгружает из памяти, мне бы хотелось узнать можно ли сделать так чтобы DLL осталась в память и до завершения работы вызвавшего ее приложения?

Где-нибудь в одной из функций своей DLL (кроме DllMain и конструкторов статических объектов) один раз сделать LoadLibrary самого себя. После чего библиотека будет оставаться в памяти до завершения приложения.
Re[2]: FreeLibrary
От: FRAGman Россия  
Дата: 06.05.05 05:43
Оценка:
Здравствуйте, Slesh, Вы писали:

S>Здравствуйте, SDS, Вы писали:


S>Глупо конечно, но может не делать FreeLibrary?

S>А вообще не плохо бы знать причину такого желания(если это конечно возможно), тогда и способ искать легче.

И действительно зачем делать FreeLibrary если ее не надо выгружать? Можно ведь подержать список хэндлов (если библиотек много) до завершения приложения а потом их разом грохнуть...

Может ты хочешь таким способом сделать что-то типа кэширования модулей?
May the source be with you, stranger ...
---------------------------------------------------
May the source be with you, stranger ;)
Re: FreeLibrary
От: aik Австралия  
Дата: 06.05.05 06:08
Оценка:
Здравствуйте, SDS, Вы писали:

SDS>можно ли запретить выгрузку DLL после вызова FreeLibrary, до некоторого момента? про счетчики использования и т.д.объяснять пожалуйста не надо, DLL загружает приложение LoadLibrary использует ее и тут же выгружает FreeLibrary, больше ее не использует не кто Windows ее выгружает из памяти, мне бы хотелось узнать можно ли сделать так чтобы DLL осталась в память и до завершения работы вызвавшего ее приложения?



Если вообще — то скорее всего никак. А если твою DLL грузит кто ни попадя и освобождает когда он считает нужным, но тебе для каких то целей нужно чтобы твоя DLL не выгружалась, то можно сделать LoadLibrary на самого себя в DllMain, и тогда DLL будет болтаться в процессе до смерти.
Re[2]: FreeLibrary
От: Кодёнок  
Дата: 06.05.05 06:19
Оценка: +1
aik>Если вообще — то скорее всего никак. А если твою DLL грузит кто ни попадя и освобождает когда он считает нужным, но тебе для каких то целей нужно чтобы твоя DLL не выгружалась, то можно сделать LoadLibrary на самого себя в DllMain, и тогда DLL будет болтаться в процессе до смерти.

Можно везде кроме DllMain. В ней одной нельзя
Re[3]: FreeLibrary
От: aik Австралия  
Дата: 06.05.05 06:23
Оценка:
Здравствуйте, Кодёнок, Вы писали:

aik>>Если вообще — то скорее всего никак. А если твою DLL грузит кто ни попадя и освобождает когда он считает нужным, но тебе для каких то целей нужно чтобы твоя DLL не выгружалась, то можно сделать LoadLibrary на самого себя в DllMain, и тогда DLL будет болтаться в процессе до смерти.

Кё>Можно везде кроме DllMain. В ней одной нельзя

Это не технически нельзя, а просто неприлично. Единственное что надо учесть — чтоб рекурсии не возникло, статическуй переменную флажок надо будет завести.
Re[4]: FreeLibrary
От: Andrew S Россия http://alchemy-lab.com
Дата: 06.05.05 11:00
Оценка:
aik>>>Если вообще — то скорее всего никак. А если твою DLL грузит кто ни попадя и освобождает когда он считает нужным, но тебе для каких то целей нужно чтобы твоя DLL не выгружалась, то можно сделать LoadLibrary на самого себя в DllMain, и тогда DLL будет болтаться в процессе до смерти.
Кё>>Можно везде кроме DllMain. В ней одной нельзя

aik>Это не технически нельзя, а просто неприлично. Единственное что надо учесть — чтоб рекурсии не возникло, статическуй переменную флажок надо будет завести.


Вы не правы. Технически это может быть неосуществимо за счет неявных циклических связей:

Warning On attach, the body of your DLL entry-point function should perform only simple initialization tasks, such as setting up thread local storage (TLS), creating objects, and opening files. You must not call LoadLibrary in the entry-point function, because you may create dependency loops in the DLL load order.


Тут недавно только был человек, использующий LoadLibrary в DllMain... Очень удивлялся странным глюкам на некоторых системах.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: FreeLibrary
От: Кодёнок  
Дата: 06.05.05 11:22
Оценка:
AS>Вы не правы. Технически это может быть неосуществимо за счет неявных циклических связей:

Но в данном конкретном случае речь идёт о библиотеке, которая УЖЕ загружена и все связи тоже. Речь идёт просто об увеличении счетчика ссылок на единицу с помощью LoadLibrary. Не знаю, попадёт ли она опять в PROCESS_ATTACH, если предыдущий ещё не закончился?
Re[6]: FreeLibrary
От: Andrew S Россия http://alchemy-lab.com
Дата: 06.05.05 11:28
Оценка: +1
AS>>Вы не правы. Технически это может быть неосуществимо за счет неявных циклических связей:

Кё>Но в данном конкретном случае речь идёт о библиотеке, которая УЖЕ загружена и все связи тоже. Речь идёт просто об увеличении счетчика ссылок на единицу с помощью LoadLibrary. Не знаю, попадёт ли она опять в PROCESS_ATTACH, если предыдущий ещё не закончился?


Это, очевидно, зависит от реализации лоадера. Опять же — если мне сказано "не делай этого" явно в официальной документации — то во избежание феерических глюков лучше воздержаться от таких действий... тем более что варианты всегда есть.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: FreeLibrary
От: aik Австралия  
Дата: 06.05.05 12:07
Оценка:
Здравствуйте, Andrew S, Вы писали:

aik>>>>Если вообще — то скорее всего никак. А если твою DLL грузит кто ни попадя и освобождает когда он считает нужным, но тебе для каких то целей нужно чтобы твоя DLL не выгружалась, то можно сделать LoadLibrary на самого себя в DllMain, и тогда DLL будет болтаться в процессе до смерти.

Кё>>>Можно везде кроме DllMain. В ней одной нельзя
aik>>Это не технически нельзя, а просто неприлично. Единственное что надо учесть — чтоб рекурсии не возникло, статическуй переменную флажок надо будет завести.
AS>Вы не правы. Технически это может быть неосуществимо за счет неявных циклических связей:
AS>

AS>Warning On attach, the body of your DLL entry-point function should perform only simple initialization tasks, such as setting up thread local storage (TLS), creating objects, and opening files. You must not call LoadLibrary in the entry-point function, because you may create dependency loops in the DLL load order.


Если прервать эту самую "loops" сразу, то косяков не будет. Ну т. е. в теории, конечно, можно было бы по всякому реализовывать загрузку модулей, но по факту — она устойчива к таким фокусам.

AS>Тут недавно только был человек, использующий LoadLibrary в DllMain... Очень удивлялся странным глюкам на некоторых системах.


Тут вообще много всякого народу, который удивляется простым вещам, считая их странными Что за глюки то могут быть?
Re[6]: FreeLibrary
От: Alex Alexandrov США  
Дата: 10.05.05 12:09
Оценка: -1
Здравствуйте, aik, Вы писали:

aik>Тут вообще много всякого народу, который удивляется простым вещам, считая их странными Что за глюки то могут быть?


Re: Опять насчет потоков
Автор: Alex Alexandrov
Дата: 17.04.05
[ Posted via RSDN@Home 1.1.4 beta 5 (395) listening to silent ]
It's kind of fun to do the impossible (Walt Disney)
Re[7]: FreeLibrary
От: aik Австралия  
Дата: 11.05.05 05:58
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

aik>>Тут вообще много всякого народу, который удивляется простым вещам, считая их странными Что за глюки то могут быть?

AA>Re: Опять насчет потоков
Автор: Alex Alexandrov
Дата: 17.04.05


Статья СОВСЕМ не о том.
Re[8]: FreeLibrary
От: Аноним  
Дата: 11.05.05 08:31
Оценка: -1
Здравствуйте, aik, Вы писали:

aik>Статья СОВСЕМ не о том.


Именно о том. О том, что можно и чего нельзя делать в DllMain. И самое главное — почему этого нельзя делать.
Re[8]: FreeLibrary
От: Кодёнок  
Дата: 11.05.05 10:27
Оценка:
aik>>>Тут вообще много всякого народу, который удивляется простым вещам, считая их странными Что за глюки то могут быть?
AA>>Re: Опять насчет потоков
Автор: Alex Alexandrov
Дата: 17.04.05


aik>Статья СОВСЕМ не о том.


Даже если загрузка уже загруженной библиотеки из DllMain окажется безопасна, все равно это грязный хак, основанный на недокументированных знаниях о системе. В документации ясно сказано — не использовать LoadLibrary. Лучше не стоит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.