можно ли запретить выгрузку DLL после вызова FreeLibrary, до некоторого момента? про счетчики использования и т.д.объяснять пожалуйста не надо, DLL загружает приложение LoadLibrary использует ее и тут же выгружает FreeLibrary, больше ее не использует не кто Windows ее выгружает из памяти, мне бы хотелось узнать можно ли сделать так чтобы DLL осталась в память и до завершения работы вызвавшего ее приложения?
Глупо конечно, но может не делать FreeLibrary?
А вообще не плохо бы знать причину такого желания(если это конечно возможно), тогда и способ искать легче.
SDS>можно ли запретить выгрузку DLL после вызова FreeLibrary, до некоторого момента? про счетчики использования и т.д.объяснять пожалуйста не надо, DLL загружает приложение LoadLibrary использует ее и тут же выгружает FreeLibrary, больше ее не использует не кто Windows ее выгружает из памяти, мне бы хотелось узнать можно ли сделать так чтобы DLL осталась в память и до завершения работы вызвавшего ее приложения?
SDS>можно ли запретить выгрузку DLL после вызова FreeLibrary, до некоторого момента? про счетчики использования и т.д.объяснять пожалуйста не надо, DLL загружает приложение LoadLibrary использует ее и тут же выгружает FreeLibrary, больше ее не использует не кто Windows ее выгружает из памяти, мне бы хотелось узнать можно ли сделать так чтобы DLL осталась в память и до завершения работы вызвавшего ее приложения?
Где-нибудь в одной из функций своей DLL (кроме DllMain и конструкторов статических объектов) один раз сделать LoadLibrary самого себя. После чего библиотека будет оставаться в памяти до завершения приложения.
Здравствуйте, Slesh, Вы писали:
S>Здравствуйте, SDS, Вы писали:
S>Глупо конечно, но может не делать FreeLibrary? S>А вообще не плохо бы знать причину такого желания(если это конечно возможно), тогда и способ искать легче.
И действительно зачем делать FreeLibrary если ее не надо выгружать? Можно ведь подержать список хэндлов (если библиотек много) до завершения приложения а потом их разом грохнуть...
Может ты хочешь таким способом сделать что-то типа кэширования модулей?
May the source be with you, stranger ...
---------------------------------------------------
May the source be with you, stranger ;)
Здравствуйте, SDS, Вы писали:
SDS>можно ли запретить выгрузку DLL после вызова FreeLibrary, до некоторого момента? про счетчики использования и т.д.объяснять пожалуйста не надо, DLL загружает приложение LoadLibrary использует ее и тут же выгружает FreeLibrary, больше ее не использует не кто Windows ее выгружает из памяти, мне бы хотелось узнать можно ли сделать так чтобы DLL осталась в память и до завершения работы вызвавшего ее приложения?
Если вообще — то скорее всего никак. А если твою DLL грузит кто ни попадя и освобождает когда он считает нужным, но тебе для каких то целей нужно чтобы твоя DLL не выгружалась, то можно сделать LoadLibrary на самого себя в DllMain, и тогда DLL будет болтаться в процессе до смерти.
aik>Если вообще — то скорее всего никак. А если твою DLL грузит кто ни попадя и освобождает когда он считает нужным, но тебе для каких то целей нужно чтобы твоя DLL не выгружалась, то можно сделать LoadLibrary на самого себя в DllMain, и тогда DLL будет болтаться в процессе до смерти.
Здравствуйте, Кодёнок, Вы писали:
aik>>Если вообще — то скорее всего никак. А если твою DLL грузит кто ни попадя и освобождает когда он считает нужным, но тебе для каких то целей нужно чтобы твоя DLL не выгружалась, то можно сделать LoadLibrary на самого себя в DllMain, и тогда DLL будет болтаться в процессе до смерти. Кё>Можно везде кроме DllMain. В ней одной нельзя
Это не технически нельзя, а просто неприлично. Единственное что надо учесть — чтоб рекурсии не возникло, статическуй переменную флажок надо будет завести.
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... Очень удивлялся странным глюкам на некоторых системах.
AS>Вы не правы. Технически это может быть неосуществимо за счет неявных циклических связей:
Но в данном конкретном случае речь идёт о библиотеке, которая УЖЕ загружена и все связи тоже. Речь идёт просто об увеличении счетчика ссылок на единицу с помощью LoadLibrary. Не знаю, попадёт ли она опять в PROCESS_ATTACH, если предыдущий ещё не закончился?
AS>>Вы не правы. Технически это может быть неосуществимо за счет неявных циклических связей:
Кё>Но в данном конкретном случае речь идёт о библиотеке, которая УЖЕ загружена и все связи тоже. Речь идёт просто об увеличении счетчика ссылок на единицу с помощью LoadLibrary. Не знаю, попадёт ли она опять в PROCESS_ATTACH, если предыдущий ещё не закончился?
Это, очевидно, зависит от реализации лоадера. Опять же — если мне сказано "не делай этого" явно в официальной документации — то во избежание феерических глюков лучше воздержаться от таких действий... тем более что варианты всегда есть.
Здравствуйте, 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... Очень удивлялся странным глюкам на некоторых системах.
Тут вообще много всякого народу, который удивляется простым вещам, считая их странными Что за глюки то могут быть?
Здравствуйте, Alex Alexandrov, Вы писали:
aik>>Тут вообще много всякого народу, который удивляется простым вещам, считая их странными Что за глюки то могут быть? AA>Re: Опять насчет потоков
Даже если загрузка уже загруженной библиотеки из DllMain окажется безопасна, все равно это грязный хак, основанный на недокументированных знаниях о системе. В документации ясно сказано — не использовать LoadLibrary. Лучше не стоит.