![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Domoffou |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Здравствуйте.
Каким образом можно выгрузить из памяти чужую DLL? Моя DLL работает самостоятельно =) При скачивании более новой версии, моя программа (updater) должна заменять старый длл на новый, а вот как это сделать без выгрузки - не знаю, возможно обмен данными между "чужим" процессом (апдейтером) и местной длл, и выгрузка в последствии из самой себя? (если такое вообще возможно). Это сообщение отредактировал(а) Domoffou - 26.6.2008, 00:42 |
|||
|
||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
||||
|
||||
Domoffou |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Ну вообще свою ![]() Но, получается, выгрузка своей библиотеки, запущенной от своей же (но другой) программы, которая уже не работает ![]() Библиотека загружается посредством Loadlibrary в одной программе, далее программы выходит БЕЗ FeeeLibrary. DLL остается в памяти. Мне необходимо заменить длл, находящийся на диске, но, соответственно, изменить его не могу, пока не будет перезагружен комп, а его перезагружать не желательно. FreeLibraryAndExitThread - не помогает :( Подскажите любой способ, я думаю подойдет тут выгрузка длл другой программой (как я понимаю, нужно уменьшить каким-то образом число глобальных счетчиков использования библиотеки) либо послать сообщение ДЛЛ, а она в свою очередь сама самостоятельно отсоединится от всех процессов и завершит работу и с файлом можно будет делать все что угодно. Это сообщение отредактировал(а) Domoffou - 26.6.2008, 09:19 |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 16 Всего: 89 |
Эту фичу стоило бы назвать: "случайным образом обрушь программы, использующие мою DLL". Вы представляете, что будет, если приложение попробует воспользоваться DLL после того, как вы её выгрузили? -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Riply |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Вот это сформулировал - так сформулировал ! ![]() Я поняла так: 1. есть твоя библиотека, которую загрузил некий процесс. 2. у тебя есть возможность общения с ней (библиотекой) Ну и отлично: сообщаем ей, что пора выгружаться и она делает это, например, при помощи FreeLibraryAndExitThread. P.S. Сама использовать эту ф-ю не пробовала ( в те поры не знала о ее существовании). Выгружалась "вручную": сообщала библиотеке, что пора закругляться, и создавала нить, в которой вызывала FreeLibrary. Добавлено через 4 минуты и 17 секунд
Так перед выгрузкой надо пресечь данные, совершенно наглые попытки в корне ![]() Иными словами вежливо попросить целевой процесс самостоятельно выгрузить нас ![]() |
||||
|
|||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 16 Всего: 89 |
Совершенно верно. Но я сказал это только для того, чтобы уточнить, понимает ли это автор вопроса. P.S. А то с некоторых станется и вызвать в бесконечном цикле FreeLibraryAndExitThread из главного потока. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Domoffou |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Как я понимаю, DLL фактически работает со всеми процессами в системе?
Т.е. при Loadlibrary он присоединяется ко всем процессам (в DLL висит хук). Пробовал ставить DLL_PROCESS_DETACH, но эта функция запускается каждый раз при закрытии какого-либо приложения (жаль, что ей нельзя воспользоваться глобально) :( Riply, я попробовал функцию, которую Вы мне предложили. Программа, вызывающая эту функцию, попросту закрывается, а DLL продолжает работать и записывать тестовый лог. Возможно, я не очень понимаю, но мне нужно вызвать FreeLibraryAndExitThread столько раз, сколько процессов в системе? Вся проблема в том, что программа, загружающая длл и программа, которая должна ее выгружать - это д.б. разные процессы, причем работа второго должна производиться без деятельности первого (1 процесс закрыт, ДЛЛ висит в памяти). Если я правильно понимаю - целевой процесс, это программа, загрузившая ДЛЛ? Ну дык она уже и не работает ![]() Это сообщение отредактировал(а) Domoffou - 26.6.2008, 11:09 |
|||
|
||||
Domoffou |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Сделал выводы из умной литературы
![]() Первый раз, при загрузке DLL она помещается в память, выполняются действия при инициализации ДЛЛ, глобальный счетчик юзания этой длл становится 1. Программа закрывается, длл висит в памяти. Счетчик по-прежнему 1. Запускается другая программа, подсоединяется к моей ДЛЛ, счетчик становится 2, хотя действия при инициализации не выполняются, т.к. длл уже в памяти. Делаю из 2 программы FREELIBRARY, длл отсоединяется от 2 процесса, счетчик становится 1. А выгрузка производится при длл равной 0. Правильно ли я понимаю? ![]() И что делать, как говорится, в такой ситуации. P.S. FreeLibraryAndExitThread д.б. в библиотеке? Это сообщение отредактировал(а) Domoffou - 26.6.2008, 11:45 |
|||
|
||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Надо бы тебе еще почитать "умной литературы" ![]() Я поступала так (это не руководство к действию, а просто рассказ ![]() 1. Делаем невозможной продгрузку Dll-ки новыми процессами (зависит от способа, которым ты подгружал) 2. Сообщаем уже подгруженным, что пора закругляться. (Они должны подчистить за собой все, что напакостили в процессе) ![]() 3. Опять зависит от способа загрузки, но попробуй так: Каждая Dll-ка (подчистив за собой) создает нить, в которой вызывается FreeLibraryAndExitThread (эта нить не должна использовать ничего из DLL) По поводу: не уверена, что это возможно (ну, скажем так: лего реализуемо) ![]() |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 16 Всего: 89 |
Вы что-то не то нам говорите. Если вы закрыли все приложения, использующие вашу DLL, то она не может "ещё работать". Ей просто негде это делать. Значит, у вас есть ещё процессы, использующие вашу DLL.
Вот с этого и надо было начинать. Вы, кстати, ловушку перед выходом снимаете? http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=62697 http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=58060 Да, правильно. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Domoffou |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Перед выходом чего? ДЛЛ остается в памяти. Я то как раз и пытаюсь сделать выход. Несколько вопросов: 1. Хук в длл "присоединяется" к памяти всех процессов, с кем работает юзер? Т.е. чтобы выгрузить библиотеку, нужно заставить каждую прогу снять с нее хук или попросту закрыть? 2. При первой загрузке ДЛЛ происходит инициализация. При второй - происходит или нет? Моя программа работает полностью в длл (мож, кто знает) ![]() т.е. загружает ее другой проц (LoadLibrary) и выходит. в ДЛЛ при инициализации стоит SetHook. При закрытии каждой программы (например блокнота) вызывается DLL_PROCESS_DETACH В идеале я бы сделал по этому событию UnHook, но в таком случае придется закрывать все окна, к которым присоединился хук фактически, а это нереально.
хук, как я понимаю, подгружается автоматически хмм... это как? |
|||
|
||||
bartram |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1606 Регистрация: 22.2.2004 Где: Russia, Samara Репутация: 3 Всего: 29 |
Делай Unhook при выгрузке какого-нибудь системного процесса например Explorer.exe. Если Explorer выгрузился, значит винда завершает работу, а значит снимаем хук ![]() |
|||
|
||||
Riply |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
А зачем закрывать все окна ? Ты что там (в процессах) дополнительно делаешь что-то необратимое ? Если так, то меняй идеологию.
Ты же сам сказал:
а теперь спрашиваешь "как" ? |
||||||
|
|||||||
Domoffou |
|
||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Приведу код.
DLL:
Программа, загружающая длл:
Хорошая идея, будет полезна при сохранении данных при перезагрузке или выключении ПК. Каким образом следить? Пробегать по списку процессов?
Нет, процедура хука простая - принимает клавишу и записываем его в файл (для теста). Ну совсем не догоняю как это реализовать ![]() пробовал так в программе (уже другой):
программа завершается а логи продолжаются делать. P.S. Секцию DLLProc пока не подключал. Нужно ли? Это сообщение отредактировал(а) Domoffou - 26.6.2008, 15:06 |
||||||||||
|
|||||||||||
bartram |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1606 Регистрация: 22.2.2004 Где: Russia, Samara Репутация: 3 Всего: 29 |
Нет, в событии DLL_PROCESS_DETACH смотрим к какому процессу прицеплены, если это Explorer то снимаем хук. Это сообщение отредактировал(а) bartram - 26.6.2008, 16:09 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |