Деинсталлятор

ёёёёё
Дата: 18.06.2019 12:13:56
В оснастке "Установка и удаление программ" зарегистрирован .exe - файл.
Который после запуска выполняет некоторые действия по деинсталляции, в соответствии со сценарием.

Как деинсталлятор в итоге удаляет сам себя?

Посмотрел, как сделано в NSIS и в Inno - жуть. Создается копия деинсталлятора в темп - директории, эта копия запускается и отрабатывает сценарий. А оригинал живет и радует имитацией активности вышеупомянутую оснастку, ждет завершения отработки сценария деинсталляции копией. Получив сигнал о завершении, оригинал завершается, оснастка фиксирует момент завершения. На самом деле, копия продолжает работать, дождавшись завершения работы оригинала, копия удаляет оригинал и директорию, в которой то размещается. Масса забавных телодвижений и мутного когда, ну да ладно.
А удаление копии (и хлама, используемого ею - плагинов. например) вешается на систему: в реестр, в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager, в переменную PendingFileRenameOperations заносится список файлов для удаления при перезагрузке. Удаление иногда выполняется, иногда - нет.
В темп - директории - масса мусора, в итоге.

Вопрос: почему не всегда удаляются файлы из списка PendingFileRenameOperations и как сделать, чтобы они удалялись всегда?
Мимопроходящий
Дата: 18.06.2019 12:40:42

18.06.2019 12:13, ёёёёё пишет:
> как сделать, чтобы они удалялись всегда?

не использовать Win

Posted via ActualForum NNTP Server 1.5

Гаджимурадов Рустам
Дата: 18.06.2019 13:49:24
ёёёёё> Вопрос: почему не всегда удаляются файлы

Мало ли что в винде могло пойти не так.
Лежат себе в Темре и лежат, всё равно
удалятся с очередной "чисткой файлов".

> как сделать, чтобы они удалялись всегда?

Забей.

Posted via ActualForum NNTP Server 1.5

alekcvp
Дата: 18.06.2019 14:48:04
ёёёёё,

1. Можно попробовать создавать temp-файл с флагом FILE_FLAG_DELETE_ON_CLOSE, правда я не знаю получится ли его запустить потом - там есть условия для его повторного открытия.

2. Можно написать деинсталлятор на .NET и потом запустить его из оперативки, соответственно он сможет удалить всё что угодно.

3. Удалить самого себя, после удаления приложения, через cmd-файл (они могут удалять сами себя).

....

ёёёёё
Вопрос: почему не всегда удаляются файлы из списка PendingFileRenameOperations и как сделать, чтобы они удалялись всегда?


Они не удаляются при некорректном завершении работы системы или при запуске какой-нибудь "особо умной" программы, которая использует этот список в своих целях и просто перезаписывает его, наплевав на то что там что-то было. Соответственно исправить это нельзя никак.
Мимопроходящий
Дата: 18.06.2019 15:00:14

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:02:53
alekcvp,

FILE_FLAG_DELETE_ON_CLOSE - к сожалению, нельзя. В соответствии с мсдн такой файл должен открываться с опцией FILE_SHARE_DELETE, а запуск процессов из образов с такой опцией не делается.
ёёёёё
Дата: 18.06.2019 15:07:30
наверное, дешевле всего в темп-директорию выбрасывать крошечный файл-икзешник, который запускать по завершении инсталлятора, для подчистки. А сам файлик-чистильщик помечать на последующее удаление при перезагрузке, а если не сработает - то и да, фик с ним, пара килобайт в мусорке будет валяться.
alekcvp
Дата: 18.06.2019 15:25:33
ёёёёё,

Можно ещё перед завершением деинсталлера вызвать "cmd.exe /c timeout /t 5 && del /q <exefile>" со скрытым окном и сразу завершить свой процесс. Через 5 секунд cmd-шник его удалит.
alekcvp
Дата: 18.06.2019 15:26:34
alekcvp
Можно ещё перед завершением деинсталлера вызвать "cmd.exe /c timeout /t 5 && del /q <exefile>" со скрытым окном и сразу завершить свой процесс. Через 5 секунд cmd-шник его удалит.

Правда в старых виндах (XP точно) работать не будет.
kealon(Ruslan)
Дата: 18.06.2019 15:35:00
ёёёёё,

был ещё фокус с файловыми потоками, не проверял правда давно, будет ли на той же 10-ке работать и как на него антивирусы агрятся