Удаление файлов
Как такое реализовать в своей программе?
В конце концов,в Windows линейки NT выполняемые файлы,если они не заблокированы,можно просто взять и…не просто переименовать,а даже переместить!Вот и всё
Это происходит потому-что процесс находится в памяти. Есть деинсталляторы которые проверяют работу процессов этой программы, если процесс работает деинсталлятор удаляет процесс(ы), а потом удаляет файлы. Но есть процессы которые удаляются только при перезагрузке т.е иначе рухнет ОС.
Вы как программист должны знать:
1) все пути катологов и файлов
2) все пути веток реестра
3) при удалении проверить работает ваша программа, если да, тогда удалить процесс из памяти
1) все пути катологов и файлов
2) все пути веток реестра
3) при удалении проверить работает ваша программа, если да, тогда удалить процесс из памяти
Зачем мне проверять работает моя программа или нет???
Я знаю что она завершается, но при этом она не может удалить например длл внедрённую в explorer.exe.
Пути каталогов и файлов я разумеется знаю. Реестр не используется(вообще не люблю его использовать, где возможно обойтись не использую).
Да, всё верно. Но я специально баловался с Revo Uninstaller. Установил маленькую прогу, запустил и потом пытался деинсталлировать. Мне было предложенно завершить процесс, но у меня как раз была задача справоцировать ситуацию о которой я писал, и я отказался и продолжил удаление. Мне было сказанно что оставшиеся файлы будут удалены при перезагрузке.
Я пытался найти что нибудь в автозагрузке. Посмотрел в пуске "Все программы->Автозагрузка", в msconfig и нигде ничего не добавилось.
Тутже после перезагрузки вызвал диспетчер задач, но никаких новых для себя процессов не увидел(или уже слишком поздлно, или всё это делает какой нибудь до боли знакомый процесс).
Не знаю что и куда прописывает Revo Uninstaller, но работает как часы(несколько раз проверял).
Вот методы и интересуют.
Из вопроса по моему понятно что задача сформулированна, но как раз методы не известны.
Тутже после перезагрузки вызвал диспетчер задач, но никаких новых для себя процессов не увидел(или уже слишком поздлно, или всё это делает какой нибудь до боли знакомый процесс).
На сколько я понял Вы хотите посмотреть, что происходит при перезагрузке. Думаю Вам поможет Process Monitor он может создать log-файл загрузки
Не упомянул операционку, наверное в наши дни подразумевается 7-ка. Всё это безобразие происходит в ХР.
Желательно сразу с этим покончить, без всяких перезагрузок. Честно говоря ни разу не удалял загруженную в память длл и не знаю как на это будут реагировать процессы.
По логике она уже в памяти и ничего страшного произойти не должно. Но при этом по логике она зачем то блокируется и без спецсредств не удаляется.
Но в любом случае спасибо, буду пробовать разные варианты.
На сколько я понял Вы хотите посмотреть, что происходит при перезагрузке. Думаю Вам поможет Process Monitor он может создать log-файл загрузки
Тоже полезная информация. Разумеется у меня есть эта прога, но ни разу не использовал функционал о котором вы написали.
Этой прогой очень удобно проверять внедрилась длл или нет. Всяких процесс мониторов и менеджеров пруд пруди, а вот такую инфу показывают далеко не все.
Вот методы и интересуют.
Из вопроса по моему понятно что задача сформулированна, но как раз методы не известны.
В системном реестре есть симпатичная ветка - программы, запускаемые РАЗОВО. По-моему, самое то, нет?
http://support.microsoft.com/kb/179365/ru
Написал маленькую тестовую прогу. В ней я выбираю заранее подготовленный фаил, потом его блокирую вот так:
var
FS: TFileStream;
begin
FS := TFileStream.Create(Путь к моему файлу, fmOpenRead, fmShareDenyNone);
end;
DeleteFileW тоже после блокировки не проканывает.
Унлокер же справляется с таким файлом запросто.
...
Получилось что обманул. Заполнил второй параметр не верно. Нужно путь вместе с именем файла.
При перезагрузке фаил переместился куда было указано.
Ежели очень хочется удалить запущенный модуль,то его прежде надо выгрузить.Правда,я не знаю,насколько проста в реализации будет выгрузка определённого модуля изо всех процессов,в которые он загружен(и насколько стабильно это будет,ибо функции из модуля могут быть вызваны в самый неподходящий момент)
А DLL блокируется с целью извлечения из неё ресурсов в дальнейшем,да и не все секции сразу подгружаются в память при загрузке оной
Разбираться как его удалить сразу не буду(не к чему это).
Просто не люблю писать программы которые гадят после себя, и хотел подчистить. Презераю программы которые "забывают" почистить при удалении за собой реестр, временные папки(куда например инсталлятор распаковывается при установке), в документах и настройках и т.д.
Проблема решена, и даже нет ощущения как иногда бывает что как то криво.
то @pixo $of
Ваш пост который я пометил плюсом можно считать ответом на вопрос.
Всем спасибо.