|
|
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
В оснастке "Установка и удаление программ" зарегистрирован .exe - файл. Который после запуска выполняет некоторые действия по деинсталляции, в соответствии со сценарием. Как деинсталлятор в итоге удаляет сам себя? Посмотрел, как сделано в NSIS и в Inno - жуть. Создается копия деинсталлятора в темп - директории, эта копия запускается и отрабатывает сценарий. А оригинал живет и радует имитацией активности вышеупомянутую оснастку, ждет завершения отработки сценария деинсталляции копией. Получив сигнал о завершении, оригинал завершается, оснастка фиксирует момент завершения. На самом деле, копия продолжает работать, дождавшись завершения работы оригинала, копия удаляет оригинал и директорию, в которой то размещается. Масса забавных телодвижений и мутного когда, ну да ладно. А удаление копии (и хлама, используемого ею - плагинов. например) вешается на систему: в реестр, в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager, в переменную PendingFileRenameOperations заносится список файлов для удаления при перезагрузке. Удаление иногда выполняется, иногда - нет. В темп - директории - масса мусора, в итоге. Вопрос: почему не всегда удаляются файлы из списка PendingFileRenameOperations и как сделать, чтобы они удалялись всегда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 12:13 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
18.06.2019 12:13, ёёёёё пишет: > как сделать, чтобы они удалялись всегда? не использовать Win Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 12:40 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
ёёёёё> Вопрос: почему не всегда удаляются файлы Мало ли что в винде могло пойти не так. Лежат себе в Темре и лежат, всё равно удалятся с очередной "чисткой файлов". > как сделать, чтобы они удалялись всегда? Забей. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 13:49 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
ёёёёё, 1. Можно попробовать создавать temp-файл с флагом FILE_FLAG_DELETE_ON_CLOSE, правда я не знаю получится ли его запустить потом - там есть условия для его повторного открытия. 2. Можно написать деинсталлятор на .NET и потом запустить его из оперативки , соответственно он сможет удалить всё что угодно. 3. Удалить самого себя, после удаления приложения, через cmd-файл (они могут удалять сами себя). .... ёёёёёВопрос: почему не всегда удаляются файлы из списка PendingFileRenameOperations и как сделать, чтобы они удалялись всегда? Они не удаляются при некорректном завершении работы системы или при запуске какой-нибудь "особо умной" программы, которая использует этот список в своих целях и просто перезаписывает его, наплевав на то что там что-то было. Соответственно исправить это нельзя никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 14:48 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
18.06.2019 14:48, alekcvp пишет: > Можно попробовать создавать temp-файл с флагом FILE_FLAG_DELETE_ON_CLOSE, правда я не знаю получится ли его запустить потом - там есть условия для его повторного открытия. не взлетит. для того чтоб система его грохнула при закрытии, нужно чтоб заинтересованный процесс открывал этот файл с флагом FILE_SHARE_READ или FILE_SHARE_WRITE или FILE_SHARE_DELETE. а винда сама по себе, по доброй воле, при запуске экзешников этого не делает. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 15:00 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
alekcvp, FILE_FLAG_DELETE_ON_CLOSE - к сожалению, нельзя. В соответствии с мсдн такой файл должен открываться с опцией FILE_SHARE_DELETE, а запуск процессов из образов с такой опцией не делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 15:02 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
наверное, дешевле всего в темп-директорию выбрасывать крошечный файл-икзешник, который запускать по завершении инсталлятора, для подчистки. А сам файлик-чистильщик помечать на последующее удаление при перезагрузке, а если не сработает - то и да, фик с ним, пара килобайт в мусорке будет валяться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 15:07 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
ёёёёё, Можно ещё перед завершением деинсталлера вызвать "cmd.exe /c timeout /t 5 && del /q <exefile>" со скрытым окном и сразу завершить свой процесс. Через 5 секунд cmd-шник его удалит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 15:25 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
alekcvpМожно ещё перед завершением деинсталлера вызвать "cmd.exe /c timeout /t 5 && del /q <exefile>" со скрытым окном и сразу завершить свой процесс. Через 5 секунд cmd-шник его удалит. Правда в старых виндах (XP точно) работать не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 15:26 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
ёёёёё, был ещё фокус с файловыми потоками, не проверял правда давно, будет ли на той же 10-ке работать и как на него антивирусы агрятся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 15:35 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
alekcvpМожно ещё перед завершением деинсталлера вызвать "cmd.exe /c timeout /t 5 && del /q <exefile>" со скрытым окном и сразу завершить свой процесс. Через 5 секунд cmd-шник его удалит. Правда в старых виндах (XP точно) работать не будет. timeout можно заменить на ping ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 16:24 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
x1ca4064timeout можно заменить на ping Нельзя, при отсутствии сетевых адаптеров она моментально вылетит с ошибкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 16:27 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
ёёёёё... Вопрос: почему не всегда удаляются файлы из списка PendingFileRenameOperations и как сделать, чтобы они удалялись всегда? Вроде как победил. Дело в следующем. Значение REG_MULTI_SZ есть список юникодных строк, разделенных символом с кодом #0. В конце файла должен быть еще один (можно и больше, чем один) символ #0 (можно и больше, чем один). Строки в PendingFileRenameOperations должны начинаться с последовательности символом "\??\", затем - имя файла или директории, которую следует удалить или переименовать при перезагрузке ОС. В конце строки должен находиться символ #0. Далее должна размещаться строка с именем, в которое файл переименовывается. Если файл/директория не переименовываются, а удаляются, то строка должна быть пустой, то есть состоять из одного символа #0. Значение PendingFileRenameOperations имеет тип REG_MULTI_SZ. Delphi с ним "искаропки" не умеет работать. Как минимум - Delphi 2007 не умеет. Написал пару хелперов: хелперы для REG_MULTI_SZ Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Как пользоваться. Например, добавляем себя и свою директорию в список PendingFileRenameOperations: Как пользоваться Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. Проверено в WinXP, Win7 и Win10. х32 и x64. Естественно, приложение должно иметь права записи в HKLM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 11:48 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
Можно еще задействовать ветку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce. Занести в нее, например, значение Код: powershell 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 12:34 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
ёёёёёёёёёё... Вопрос: почему не всегда удаляются файлы из списка PendingFileRenameOperations и как сделать, чтобы они удалялись всегда? Вроде как победил. Дело в следующем. .... Естественно, приложение должно иметь права записи в HKLM. На что только не идут люди, чтобы не читать справку по WinAPI MoveFileEx : If dwFlags specifies MOVEFILE_DELAY_UNTIL_REBOOT and lpNewFileName is NULL, MoveFileEx registers the lpExistingFileName file to be deleted when the system restarts. If lpExistingFileName refers to a directory, the system removes the directory at restart only if the directory is empty. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:05 |
|
||
|
Деинсталлятор
|
|||
|---|---|---|---|
|
#18+
alekcvp, точно. "Для бешеной собаки семь вёрст не крюк" - (с). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:29 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39827793&tid=2039349]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
180ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 506ms |

| 0 / 0 |
