Один из проблемных моментов - это корректное удаление установленного приложения.
Первое, что нужно сделать - это еще при установке приложения добавить строку в реестр для удаления приложения с указанием сеции, отвечающей за деинсталяцию:
HKLM,"%Key%","DisplayName",,"SOMEAPP"
HKLM,"%Key%","DisplayIcon",,"16422,"SOMEAPP",0
HKLM,"%Key%","UninstallString",,"rundll32.exe advpack,LaunchINFSectionEx %17%\SOMEONE.inf,Uninstall"
HKLM,"%Key1%","SOMEAPP",0x00020000,"C:\Program Files\SOMEAPP\SOMEAPP.exe"
HKLM,"%Key2%","Start Minimized",0x10001,01,00,00,00
Способ 1. "По учебнику"
Используем инструкции DelDirs и DelFile.
[DefaultInstall]
CopyFiles=files
[files]
filename.ext
[DestinationDirs]
files= 11, APPDIR
; из секции деинсталяции сначала запускаем удаление всех файлов, для этого желательно
; создавать отдельную секцию со списком удаляемых файлов, хотя допустимо и использование секции
; со списком для копирования (если нет переименования, специальных флагов)
[Uninstall]
DelFiles=files
RunPostSetupCommand=SOMEAPP.AdinfCall
; затем запускаем через RunPostSetupCommand библиотеку advpack для обработки команды Deldirs
[SOMEAPP.AdinfCall]
Commandline="""%11%\rundll32.exe"" advpack,LaunchINFSection ""%17%\SOMEONE.inf"",Del.Folders,4"
[Del.Folders]
Deldirs=dirs
;передаем список директорий для удаления
[dirs]
%11%, APPDIR
Важно! Нужно учитывать, что в случае, когда не все файлы удалены из папок, DelDirs не сработает. Если вы удаляете папку содержащую подпапки (даже пустые), DelDirs не сработает.
Так что сначала надо удалить файлы, затем подпапки, начиная с наиболее глубоко вложенной, и только затем корневую папку приложения.
Способ 2. "Радикальный"
Используется внутреняя команда библиотеки rundll32 DelNodeRunDLL32 для удаления непустых директорий.