Методы деинсталяции.
Один из проблемных моментов - это корректное удаление установленного приложения.
Первое, что нужно сделать - это еще при установке приложения добавить строку в реестр для удаления приложения с указанием сеции, отвечающей за деинсталяцию:
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 для удаления непустых директорий.
Будем продолжать работать с предыдущим примером:
[Uninstall]
DelFiles=files
RunPostSetupCommand=Del.Folders
[Del.Folders]
rundll32.exe advpack,DelNodeRunDLL32 "%11%, APPDIR"
Важно! Нужно учитывать, что в случае, когда файлы в удаляемой папке заняты системой или выполняются, DelNodeRunDLL32 не сработает. В следующем способе вы увидите метод решения этой проблемы с помощью консольной команды
TASK KILL.
Способ 3. "Готовый шаблон"
Данный способ предложил
Jameszero.
[Version]
Signature="$Windows NT$"
AdvancedINF=2.5
[Optional Components]
Uninst7
[Uninst7]
OptionDesc =%PROG_NAME%
Modes =0,1,2,3
AddReg =PROG.AddReg
ProfileItems =PROG.AddShortcut
Uninstall =mUninst.Uninstall
[DefaultInstall]
OptionDesc =%PROG_NAME%
Modes =0,1,2,3
AddReg =PROG.AddReg
ProfileItems =PROG.AddShortcut
Uninstall =mUninst.Uninstall
[Uninstall]
BeginPrompt =BeginUnInsPrompt
RunPreSetupCommands =Close.Prog:1
RunPostSetupCommands =Dir.Delete
EndPrompt =EndUnInsPrompt
DelReg =PROG.DelReg
ProfileItems =PROG.DelShortcut
[BeginUnInsPrompt]
Title=Деинсталляция %PROG_NAME%
Prompt=Вы действительно хотите удалить %PROG_NAME% и все компоненты программы?
ButtonType=YESNO
[Close.Prog]
TASKKILL /F /IM %PROG_1%
TSKILL %PROG_2%
[Dir.Delete]
rundll32.exe advpack.dll,DelNodeRunDLL32 %16422%\%PROG_DIR%
[EndUnInsPrompt]
Prompt=Программа %PROG_NAME% удалена.
[PROG.AddReg]
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%PROG_NAME%_addon","DisplayIcon",0,"%16422%\%PROG_DIR%\%PROG_1%"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%PROG_NAME%_addon","DisplayName",,%PROG_NAME%"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%PROG_NAME%_addon","DisplayVersion",,"v%PROG_VERS%"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%PROG_NAME%_addon","Publisher",,"%PROG_MADE%"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%PROG_NAME%_addon","URLInfoAbout",,"%PROG_URL%"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%PROG_NAME%_addon","UninstallString",,"rundll32.exe advpack.dll,LaunchINFSection %17%\%PROG_INF%,Uninstall"
[PROG.DelReg]
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%PROG_NAME%_addon"
[PROG.AddShortcut]
Name =%SRTC_NAME%
CmdLine =16422,%PROG_DIR%,%PROG_1%
WorkingDir =16422,%PROG_DIR%
SubDir =%PROG_SDIR%
InfoTip =%PROG_INFO%
[PROG.DelShortcut]
Name =%SRTC_NAME%,0x00000002
SubDir =%PROG_SDIR%
[Strings]
PROG_DIR ="Miranda IM"
PROG_NAME ="Miranda IM"
SRTC_NAME ="Miranda IM"
PROG_VERS ="0.7"
PROG_MADE ="oszone.net"
PROG_URL ="http://forum.oszone.net/forum-62.html"
PROG_INF ="Uninst7.inf"
PROG_1 =miranda32.exe
PROG_2 =miranda32
PROG_SDIR =""
PROG_INFO =" Программа для общения по ICQ протоколу"
При редактировании только одной секции [String] и переименовании секции инсталляции, можно использовать этот INF-файл для установки/удаления других аддонов. Аддоны должны быть комбинированные, т. е. сначала из Sysoc срабатывает данный INF-файл, а затем из SVCPACK запускается SFX-архив, созданый любым доступным способом, при этом SFX-архив должен просто распаковать файлы в нужную директорию.
Создание ярлыков, внесение информации в реестр (в том числе о деинсталляции) реализовано в INF-файле.
Деинсталляция перенесена из привычного для sysoc аддонов места "Установка компонентов Windows" в "Установку и удаление программ". При деинсталляции будет выдан запрос "Вы действительно хотите удалить такую-то программу?". Если программа в данный момент запущена, она будет выгружена из памяти, далее произойдёт удаление директории с программой, ярлыков и записей реестра.По окончании деинсталляции будет сообщено "Программа такая-то удалена".
К содержанию
Содержание раздела