УЧЕБНИК ПО АВТОУСТАНОВКЕ WINDOWS

       

Методы деинсталяции.


Один из проблемных моментов - это корректное удаление установленного приложения.

Первое, что нужно сделать - это еще при установке приложения добавить строку в реестр для удаления приложения с указанием сеции, отвечающей за деинсталяцию:

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" в "Установку и удаление программ". При деинсталляции будет выдан запрос "Вы действительно хотите удалить такую-то программу?". Если программа в данный момент запущена, она будет выгружена из памяти, далее произойдёт удаление директории с программой, ярлыков и записей реестра.По окончании деинсталляции будет сообщено "Программа такая-то удалена".

 К содержанию


Содержание раздела