1

Тема: AHK: Как реализовать uninstall

1. У меня скрипт довольно объёмный.
2. Часто делаю новые версии.

И меня попросили сделать деинсталятор.

Я в виде примера написал.

;-----Инициализация
;Скрипт не выгружается до явного определения
#Persistent
;Запрет повторного запуска
#SingleInstance  Ignore

;Тут чтение с реестра
vdir := "C:\sasa"
FileRemoveDir, C:\sasa, 1
;Тут чтение очистка реестра
;MsgBox 123
;Return
ExitApp

Ну и получился облом, т.е. запущенный uninstall.exe не удалят сам себя, как файл.

С пропиской в реестре я вроде разобрался, достаточно создать:
- раздел;
- два параметра DisplayName и UninstallString;
- заполнить их;
- можно больше параметров, но этих двух хватает.

Но это удаление извне, а вот как запустить uninstall.exe по линку и произвести то же удаление, как и через деинсталятор, ну скажем стандартный от Windows?

P.S. Сейчас выглядит так структура. Папка C:\sasa в ней лежит один файл uninstall.exe

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

2

Re: AHK: Как реализовать uninstall

Была такая тема.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3

Re: AHK: Как реализовать uninstall

Тема то была, но решения нет... там перешли на использование BAT-файлов.

Плюс вопрос был поставлен так - самоуничтожение откомпилированного файла средствами AHK.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

4

Re: AHK: Как реализовать uninstall

Без временного скрипта не получится. На VBScript №4.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5

Re: AHK: Как реализовать uninstall

А может проще - выполнить control.exe appwiz.cpl... вот только бы туда параметры передать бы.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

6 (изменено: wisgest, 2015-07-17 05:01:38)

Re: AHK: Как реализовать uninstall

Indomito пишет:

А может проще - выполнить control.exe appwiz.cpl

Чтобы выполнить строку, записанную в UninstallString?

Как я понимаю, исполняемый файл стирающий последние штрихи всегда остаётся не удалённым. Он может создаваться установщиком в WINDOWS или %CommonProgramFiles% и вызываться при удалении всех установок созданных однотипными установщиками (по-моему, так поступает InstalShield), или копировать и перезапускать себя из %TEMP% или присутсвовать в системе, как MsiExec.exe (хотя, по большому счёту это то же самое, что и первый случай).

Так почему не воспользоваться другими обычно присутствующими в системе программами?

Menu Tray, NoIcon
EnvSet A_ScriptFullPath, %A_ScriptFullPath%
Process Exist
RunWait %ComSpec% /d /v:off /c tskill.exe %ErrorLevel%& del "`%A_ScriptFullPath`%",, Hide

— ключ /V:OFF предначначен для избежания неприятностей со знаками «!» в пути,
а использование A_ScriptFullPath через переменную окружения — со знаками «%».

7 (изменено: wisgest, 2015-07-17 05:03:03)

Re: AHK: Как реализовать uninstall

Можно обойтись и без TSKILL.EXE

#SingleInstance force
IfEqual 1, /X, ExitApp
/*
. . .
*/
EnvSet A_ScriptFullPath, %A_ScriptFullPath%
Run %ComSpec% /d /v:off /c start "" /wait "`%A_ScriptFullPath`%" /X& del "`%A_ScriptFullPath`%",, Hide
ExitApp

8 (изменено: Indomito, 2015-07-16 09:20:45)

Re: AHK: Как реализовать uninstall

Немного запутанно, я просто не понял кто вызывается в последнем скрипте.
1.  Читаю данные из реестра.
1. Удаляю то что мне нужно,   с этим разберусь, там инвариантность.
2.  Чищу "свои хвосты" в реестре.
3. Скажем остаётся папка C:\sasa в ней лежит один файл uninstall.exe + процесс.

Что написать в последних строчках файла uninstall.exe?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

9 (изменено: wisgest, 2015-07-17 05:45:42)

Re: AHK: Как реализовать uninstall

Что написать в последних строчках файла uninstall.exe?

Если в последнем скрипте, то я написал, что написать в первых и последних строках.
Вызывается обработчик командной строки, путь к которому прописан в переменной среды ComSpec, обычно это CMD.EXE, и выполняет две команды, которые следуют за ключом «/c» и разделены знаком «&»…

3. Скажем остаётся папка C:\sasa в ней лежит один файл uninstall.exe + процесс.

Да, про папку я и забыл. Значит надо исправить

del "`%A_ScriptFullPath`%"

на

rd /s /q "`%A_ScriptFullPath`%\.."

и  в команде Run установить рабочий каталог отличный от каталога содержащего файл скрипта (например, корневой каталог диска, т.е. указав вторым параметром «\»).

10

Re: AHK: Как реализовать uninstall

Спасибо, буду реализовывать на практике - посмотрим что выйдет.

Кстати.
А если я реестр почистил, а этот скрипт сбойнул... я про ошибку Window, то извернуться?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

11 (изменено: wisgest, 2015-07-17 05:03:45)

Re: AHK: Как реализовать uninstall

Indomito пишет:

А если я реестр почистил

В смысле разделы

HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

?
Ну, тогда деинсталлятор нельзя уже будет вызвать из Панели управления.

Кстати, а почему в качестве деинсталлятора не использовать командный файл, прописав путь к нему в UninstallString — это вполне работает.

12

Re: AHK: Как реализовать uninstall

wisgest я в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\sasa кучу инфы, может лучше не туда, а в...

HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

Просто так как то повелось.

wisgest пишет:

Кстати, а почему в качестве деинсталлятора не использовать командный файл, прописав путь к нему в UninstallString — это вполне работает.

это как... я ни разу не делал.

P.S. Я в OS Windows считай "полный ноль", у меня рабочие, т.е. для работы это *NIX OS

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

13

Re: AHK: Как реализовать uninstall

может лучше не туда

Зависит от разрядности (32/64) системы.

это как

Ну, прописать все действия по очистке системы от установки в командном файле, который в конце работы самоудалится.

14

Re: AHK: Как реализовать uninstall

wisgest пишет:

Зависит от разрядности (32/64) системы.

Мне нужна универсальность для всех Windows OS - куда лучше прописать?

В строке UninstallString пишется адрес bat-файла.
Да так можно, да только там много что проверять перед стиранием.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

15 (изменено: teadrinker, 2015-07-16 23:50:20)

Re: AHK: Как реализовать uninstall

Ради интереса, самоудаляющийся exe без использования сторонних приложений (ну, практически без использования ):

if 0 = 2
{
   ParentPID = %1%
   ParentPath = %2%
   Process, WaitClose, %ParentPID%
   FileDelete, % ParentPath
   CreateProcess("notepad", DEBUG_ONLY_THIS_PROCESS := 2)
   ExitApp
}

if !A_IsCompiled  {
   MsgBox, Скомпилируйте скрипт!
   ExitApp
}

TmpFilePath := A_Temp "\AHK_KILL_" A_TickCount ".exe"
FileCopy, % A_ScriptFullPath, % TmpFilePath, 1

hFile := CreateTmpFile(TmpFilePath)
ChildPID := CreateProcess(TmpFilePath " " DllCall("GetCurrentProcessId") " """ A_ScriptFullPath """", 0)
Process, Wait, % ChildPID
DllCall("CloseHandle", Ptr, hFile)
ExitApp

CreateProcess(CommandLine, flag)
{
   VarSetCapacity(STARTUPINFO, size := 4*A_PtrSize + 8*4 + 5*A_PtrSize, 0)
   NumPut(size, STARTUPINFO)
   VarSetCapacity(PROCESS_INFORMATION, 2*A_PtrSize + 8, 0)
   
   DllCall("CreateProcess", UPtr, 0, Str, CommandLine
                          , UPtr, 0, Ptr, 0
                          , UInt, bInheritHandles := 1, UInt, flag, Ptr, 0, Ptr, 0
                          , UPtr, &STARTUPINFO, Ptr, &PROCESS_INFORMATION)
                          
   DllCall("CloseHandle", Ptr, hThread := NumGet(PROCESS_INFORMATION, "UInt"))
   DllCall("CloseHandle", Ptr, hProcess := NumGet(&PROCESS_INFORMATION + A_PtrSize, "UInt"))
   Return PID := NumGet(&PROCESS_INFORMATION + 2*A_PtrSize, "UInt")
}

CreateTmpFile(FilePath)
{
   static GENERIC_READ := 0x80000000, FILE_SHARE_READ := 1, FILE_SHARE_DELETE := 4
        , OPEN_EXISTING := 3, FILE_FLAG_DELETE_ON_CLOSE := 0x4000000
        , FILE_ATTRIBUTE_TEMPORARY := 0x100
   
   VarSetCapacity(SECURITY_ATTRIBUTES, size := 2*A_PtrSize + 4, 0)
   NumPut(size, SECURITY_ATTRIBUTES), NumPut(bInheritHandle := 1, &SECURITY_ATTRIBUTES + 2*A_PtrSize)
   Return DllCall("CreateFile",  Str, FilePath
                              , UInt, GENERIC_READ
                              , UInt, FILE_SHARE_READ|FILE_SHARE_DELETE
                              , UPtr, &SECURITY_ATTRIBUTES
                              , UInt, OPEN_EXISTING
                              , UInt, FILE_FLAG_DELETE_ON_CLOSE|FILE_ATTRIBUTE_TEMPORARY
                              , UPtr, 0)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Как реализовать uninstall

Единственное я не понял, а зачем блокнот, т.е. этот код.

if 0 > 0
{
   ParentPID = %1%
   ParentPath = %2%
   Process, WaitClose, %ParentPID%
   FileDelete, % ParentPath
   CreateProcess("notepad", DEBUG_ONLY_THIS_PROCESS := 2)
   ExitApp
}
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

17

Re: AHK: Как реализовать uninstall

Так всё-таки, не поняли, зачем блокнот, или зачем приведенный кусок кода?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18 (изменено: Indomito, 2015-07-16 21:01:40)

Re: AHK: Как реализовать uninstall

Если, честно, то я понял только этот фрагмент кода.

if !A_IsCompiled  {
   MsgBox, Скомпилируйте скрипт!
   ExitApp
}

C остальным надо разбираться.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

19 (изменено: teadrinker, 2015-07-17 00:13:20)

Re: AHK: Как реализовать uninstall

Если вкратце, здесь происходит следующее.
Сначала проверяется, переданы ли скрипту два параметра. Наш скомпилированный скрипт запускается без параметров, поэтому блок кода в скобках пропускается. Затем мы создаём копию нашего файла в директории A_Temp, и открываем копию файла с флагом FILE_FLAG_DELETE_ON_CLOSE. В этом случае файл будет самоудаляться, как только все его хэндлы будут закрыты, и если он не будет занят каким-либо процессом. Теперь создаём процесс, запускающий копию файла, передав ей в качестве параметров родительский PID и путь к основному файлу. Затем закрываем полученный хэндл копии (при этом ещё одна копия этого хэндла сохраняется, будучи унаследованной при создании нового процесса) и завершаем основной процесс.

Новый процесс запускается с двумя параметрами, поэтому выполняется только первый блок кода. Здесь мы ожидаем, когда родительский процесс завершится и после этого удаляем наш основной файл. Если теперь закрыть процесс копии, то, как я понимаю, его хэндл закроется раньше, чем процесс будет прекращён, и файл не удалится. Чтобы обойти это, мы создаём дочерний процесс, который сохраняет копию хендла родительского (для этого и нужен notepad в качестве "костыля"), завершаем процесс копии, в след за этим завершается дочерний процесс, последняя копия хендла уничтожается, и файл копии самоудаляется.

Как видите, ничего сложного.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20 (изменено: Indomito, 2015-07-17 00:59:32)

Re: AHK: Как реализовать uninstall

Ндя...
Надо смотреть, а то условия прикольные.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

21 (изменено: wisgest, 2015-07-17 05:19:55)

Re: AHK: Как реализовать uninstall

Indomito пишет:

Мне нужна универсальность для всех Windows OS - куда лучше прописать?

Не имел дела с 64-разрядными системами, поэтому могу сказать что знаю понаслышке. Если нужна всеохватность, то скрипт должен компилироваться в 32-разрядный EXE. 32-разрядные приложения как обычно пишут-читают разделы реестра без «Wow6432Node», а уже система их перенаправляет в Wow6432Node и при просмотре 64-разрядным редактором реестра их данные видны там.


Про способ предложенный teadrinker'ом как раз вчера читал, не скажу, что разобрался, но по общим впечатлениям — он самый.
Я только сомневаюсь, что notepad — подходящий костыль для общего случая, — многие (если не все) текстовые редакторы, чтобы не менять сопоставления разных типов файлов по отдельности, предоставляют возможность заменить notepad.exe собой или промежуточным загрузчиком (!), при этом они могут поддерживать многооконный режим, т.е. новый процесс может сразу же завершиться (сопровождаясь созданием новой вкладки в окне ранее запущенного).

22

Re: AHK: Как реализовать uninstall

wisgest пишет:

они могут поддерживать многооконный режим, т.е. новый процесс может сразу же завершиться (сопровождаясь созданием новой вкладки в окне ранее запущенного).

Вряд ли, наличие окна у процесса должно быть прописано при его создании в STARTUPINFO. Во всяком случае, если заменить notepad на, например, C:\Program Files (x86)\Mozilla Firefox\firefox.exe, то тоже работает, независимо от того, запущен ли firefox.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: Как реализовать uninstall

Альтернативные варианты — calc, taskmgr, explorer.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24 (изменено: wisgest, 2015-07-17 07:39:46)

Re: AHK: Как реализовать uninstall

teadrinker пишет:
if 0 = 2
Indomito пишет:
if 0 > 0

А не

if 0 = %2%

?
Добавлено. Понял свою ошибку: перемення 0 — количество аргументов к.с., а не 0-й параметр команандной строки

teadrinker пишет:

Альтернативные варианты — calc, taskmgr, explorer.

Ну calc — довольно бесполезная вещь, от которой не зависит жизнеспособность системы, так что может быть выпилена напрочь (кто-то считает в Excel, кто-то — в MathCad, кто-то — в чём-то наподобие JavaScript-консоли).
taskmgr, explorer — если процесс существует, новый гасится.
Лучше что-то наподобие rundll32…

25

Re: AHK: Как реализовать uninstall

wisgest пишет:

А не

if 0 = %2%

?

В переменной %0% содержится количество параметров, переданных скрипту. Соответственно

if 0 = 2

означает «если передано два параметра». Синтаксис разбора параметров можно здесь посмотреть (Script Parameters). У Indomito по-другому потому, что я позже отредактировал.

taskmgr, explorer — если процесс существует, новый гасится.

Это смотря, как запускать. Проверял, оба работают, даже если уже запущены. rundll32 тоже вполне подойдёт — он есть в Windows 10.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26 (изменено: Indomito, 2015-07-17 15:04:47)

Re: AHK: Как реализовать uninstall

"Дорогая передача! Во субботу, чуть не плача,
  Вся Канатчикова дача к телевизору рвалась,
  Вместо чтоб поесть, помыться у колодца и забыться,
  Вся безумная больница у экрана собралась...
"   (Владимир Высоцкий)
----------------------------------------------------------------------------------------------------------------------------------------------------------
Так, спецы - погодите.

1.    Что notepad - "кикается" как файл?
2.    Про любимый наш реестр,  myTEST - это мой раздел.
2.1  Оба раздела заполнять в реестре?

HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\myTEST
HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\myTEST

2.2   Одинаковой информацией оба?
2.3   Какие переменные должны быть там? Имя, тип и информация(просто описать).

3.     В папка C:\sasa в ней лежит файл uninstall.exe и не только он.
3.1   teadrinker ты учёл, что удаляется папка со всем её содержимым,  а не только один файл uninstall.exe
3.2   В uninstall.exe что можно писать, а что нельзя? Я его уже побаиваюсь.
3.3   При запуске uninstall.exe из денисталятора и автозапуск - есть разница в алгоритме? Должна быть - IMHO.
3.4   teadrinker зачем uninstall.exe входные параметры (именно два, а не один и не более), чую, не доброе дело замыслил.


Понимаю, что задал сразу кучу вопросов, просто у меня в голове всё запуталось, уж позабыл, с чего всё началось.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

27 (изменено: Alectric, 2015-07-17 12:30:59)

Re: AHK: Как реализовать uninstall

2.1:
HKLM - это для всех пользователей (требует права администратора).
HKCU (CURRENT USER) - только для текущего пользователя, т.е. в других учетных записях, записанной тут информации видно не будет.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

28 (изменено: Indomito, 2015-07-17 15:06:51)

Re: AHK: Как реализовать uninstall

Думаю хватит и HKLM, а то я сдвинусь.

Хотя, если нет прав... то лучше два варианта.

А про пункты 2.2 и 2.3 ничего не подскажешь?
Я делаю по аналогии с другим ПО, т.е. наугад.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

29 (изменено: Indomito, 2015-07-17 15:22:27)

Re: AHK: Как реализовать uninstall

Да, тут попутный вопросик.
Я прочёл ЭТО и что использовать NSIS 2.46 rus(Nullsoft Scriptable Install System) или  что иное?

Ведь деинсталятор предполагает наличие инсталятора, а самому писать его с нуля не очень хочется.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

30

Re: AHK: Как реализовать uninstall

Indomito пишет:

1.    Что notepad - "кикается" как файл?

Не понял, переведите. Безопаснее, видимо, всё-таки использовать rundll32, он уж наверняка есть.

3.1   teadrinker ты учёл, что удаляется папка со всем её содержимым,  а не только один файл uninstall.exe

Замените первый блок на

if 0 = 2
{
   ParentPID = %1%
   ParentPath = %2%
   Process, WaitClose, %ParentPID%
   SplitPath, ParentPath,, Folder
   FileRemoveDir, % Folder, 1
   CreateProcess("rundll32", DEBUG_ONLY_THIS_PROCESS := 2)
   ExitApp
}

3.2   В uninstall.exe что можно писать, а что нельзя?

Всё, что угодно на месте блока

if !A_IsCompiled  {
   MsgBox, Скомпилируйте скрипт!
   ExitApp
}

3.4   teadrinker зачем uninstall.exe входные параметры (именно два, а не один и не более)

Читайте здесь.

3.3   При запуске uninstall.exe из денисталятора и автозапуск - есть разница в алгоритме?

Никакой разницы.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

31

Re: AHK: Как реализовать uninstall

Indomito пишет:

"Дорогая передача! Во субботу, чуть не плача,
  Вся Канатчикова дача к телевизору рвалась,
  Вместо чтоб поесть, помыться у колодца и забыться,
  Вся безумная больница у экрана собралась...
"   (Владимир Высоцкий)

У какого ещё колодца? Уколоться и забыться.

32

Re: AHK: Как реализовать uninstall

YMP, угу, «я драчистый изумруд».

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

33 (изменено: Indomito, 2015-07-17 15:53:15)

Re: AHK: Как реализовать uninstall

teadrinker пишет:

Не понял, переведите. Безопаснее, видимо, всё-таки использовать rundll32, он уж наверняка есть.

Ясно, просто выше написано было.

wisgest пишет:

Ну calc — довольно бесполезная вещь, от которой не зависит жизнеспособность системы, так что может быть выпилена напрочь (кто-то считает в Excel, кто-то — в MathCad, кто-то — в чём-то наподобие JavaScript-консоли).
taskmgr, explorer — если процесс существует, новый гасится.
Лучше что-то наподобие rundll32…

почему то решил, что это относится к файлу - я ведь не прав?
Это к процессу, верно?

По остальному вопросов нет, только пункты 2.2 и 2.3 мне до конца не ясны, т.е. что на 100% необходимо там иметь место.
Особенно пункт 2.3

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

34

Re: AHK: Как реализовать uninstall

wisgest пишет:

2.2   Одинаковой информацией оба?

Однотипной информацией один из двух (или для всех пользователей, или только для текущего).

35

Re: AHK: Как реализовать uninstall

Так, с этим я разберусь, а пункт 2.3?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

36

Re: AHK: Как реализовать uninstall

Посмотрите какие параметры есть для уже установленных приложений и как они влияют на отображение в appwiz.cpl, почти все из них необязательные, например ссылка на сайт производителя, некоторые «фирменные» — используются самими установщиками и никак не учитываются в appwiz.cpl.

37 (изменено: Indomito, 2015-07-17 18:30:37)

Re: AHK: Как реализовать uninstall

Я сам заполнил только две переменных DisplayName и UninstallString этого достаточно для appwiz.cpl.
Просто я не уверен - первый раз так делаю.

Есть ещё DisplayIcon и ей подобные, ну я просто сомневаюсь что бы "не с глючило" в не подходящий момент... ну как всегда это бывает.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

38

Re: AHK: Как реализовать uninstall

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

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

39 (изменено: wisgest, 2015-07-17 21:07:53)

Re: AHK: Как реализовать uninstall

Indomito пишет:

2.3   Какие переменные должны быть там? Имя, тип и информация(просто описать).

Пароль к архиву — «notepad»:

Информация о каждой программе храниться в отдельном разделе. В каждом разделе обязательно должны присутствовать два параметра:

STRING DisplayName, значение - имя, которое отображается в списке удаляемых программ

STRING UninstallString, значение - путь к программе удаления

также могут присутствовать другие пункты, их обычно добавляют современные инсталляторы:

STRING DisplayIcon - иконка, соответствующая приложению в диалоге Установка и удаление программ
STRING ModifyPath - Путь инсталлятора для изменения установочных параметров программы. Еcли этот ключ установлен, то Кнопка Заменить/Удалить распадается на две - Заменить (выполняется ModifyPath) и Удалить(выполняется UninstallString)

Следующие параметры относятся к диалоговому окну Поддержка

STRING Publisher - Издатель продукта
STRING Readme - Путь к файлу Readme для данного продукта
STRING Comments - Комментарии к продукту
STRING Contact - Контактное лицо (e-mail и т.п.)
STRING DisplayVersion - Номер версии
STRING ProductID - Код продукта
STRING RegCompany - Зарегистрированная компания
STRING RegOwner - Зарегистрированный владелец
STRING URLInfoAbout - Домашняя страничка производителя (параметр Publisher становится ссылкой)
STRING URLUpdateInfo - URL обновления продукта
STRING HelpLink - URL сведений о поддержке

40 (изменено: teadrinker, 2015-07-20 03:28:16)

Re: AHK: Как реализовать uninstall

Так работает:

Clean := new Uninstall

MsgBox, 52, Деинсталляция, Этот код удалит папку`n`n%A_ScriptDir%`n`n`со всеми файлами!`nПродолжить?
IfMsgBox, No
   ExitApp,, Clean.cancel := 1
/*
Здесь код деинсталляции
*/
ExitApp

class Uninstall
{
   __New()  {
      if !A_IsCompiled  {
         MsgBox, Скомпилируйте скрипт!
         ExitApp
      }
      
      for k, param in ["ParentPID", "ParentPath"]
         %param% := %k%
      if ParentPath  {
         SetWorkingDir, % A_Temp
         Process, WaitClose, % ParentPID
         SplitPath, ParentPath,, Folder
         ComObjCreate("Scripting.FileSystemObject").DeleteFolder(Folder, 1)
         ExitApp,, this.CreateProcess("rundll32", DEBUG_ONLY_THIS_PROCESS := 2)
      }
   }
   
   __Delete()  {
      if this.cancel
         ExitApp
      
      TmpFilePath := A_Temp "\ahk_uninstall_" A_TickCount ".exe"
      FileCopy, % A_ScriptFullPath, % TmpFilePath, 1

      hFile := this.OpenTmpFile(TmpFilePath)
      ChildPID := this.CreateProcess(TmpFilePath " " DllCall("GetCurrentProcessId") " """ A_ScriptFullPath """", 0)
      Process, Wait, % ChildPID
      DllCall("CloseHandle", Ptr, hFile)
   }
   
   OpenTmpFile(FilePath)  {
      static GENERIC_READ := 0x80000000, FILE_SHARE_READ := 1, FILE_SHARE_DELETE := 4
           , OPEN_EXISTING := 3, FILE_FLAG_DELETE_ON_CLOSE := 0x4000000
           , FILE_ATTRIBUTE_TEMPORARY := 0x100
      
      VarSetCapacity(SECURITY_ATTRIBUTES, size := 2*A_PtrSize + 4, 0)
      NumPut(size, SECURITY_ATTRIBUTES), NumPut(bInheritHandle := 1, &SECURITY_ATTRIBUTES + 2*A_PtrSize)
      Return DllCall("CreateFile", Str, FilePath
                                 , Int, GENERIC_READ
                                 , Int, FILE_SHARE_READ|FILE_SHARE_DELETE
                                 , Ptr, &SECURITY_ATTRIBUTES
                                 , Int, OPEN_EXISTING
                                 , Int, FILE_FLAG_DELETE_ON_CLOSE|FILE_ATTRIBUTE_TEMPORARY
                                 , Ptr, 0)
   }
   
   CreateProcess(CommandLine, flag)  {
      VarSetCapacity(STARTUPINFO, size := 4*A_PtrSize + 8*4 + 5*A_PtrSize, 0)
      NumPut(size, STARTUPINFO)
      VarSetCapacity(PROCESS_INFORMATION, 2*A_PtrSize + 8, 0)
      
      DllCall("CreateProcess", Ptr, 0, Str, CommandLine
                             , Ptr, 0, Ptr, 0
                             , Int, bInheritHandles := 1, UInt, flag, Ptr, 0, Ptr, 0
                             , Ptr, &STARTUPINFO, Ptr, &PROCESS_INFORMATION)
                             
      DllCall("CloseHandle", Ptr, hThread := NumGet(PROCESS_INFORMATION))
      DllCall("CloseHandle", Ptr, hProcess := NumGet(&PROCESS_INFORMATION + A_PtrSize))
      Return PID := NumGet(&PROCESS_INFORMATION + 2*A_PtrSize, "UInt")
   }
}

UninstallFolder.ahk
Осторожно! Скомпилированный файл удаляет себя вместе со своей папкой и всеми файлами в ней.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

41

Re: AHK: Как реализовать uninstall

wisgest спасибо за информацию, я как понимаю свои переменные добавлять можно, т.е. это не вызовет проблем?

teadrinker спасибо за скрипт, а можно его в аттач, а то при копировании кода можно случайно промазать, а кнопки "Выделить код" нет.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

42

Re: AHK: Как реализовать uninstall

Подредактировал немного.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

43 (изменено: Indomito, 2015-07-19 15:50:20)

Re: AHK: Как реализовать uninstall

YMP Извиняюсь, что то я погорячился.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

44

Re: AHK: Как реализовать uninstall

Indomito, вам не пора отдохнуть недельку? Заодно Высоцкого освежите в памяти.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

45

Re: AHK: Как реализовать uninstall

Намёк понял, но я обещал сделать.

Основное сделал, осталась рутина.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download