var := "file" ; если "file" — будет удалён только файл, если "folder" — папка файла со всеми файлами
Clean := new Uninstall(var)
if (var != "file") {
MsgBox, 52, Деинсталляция, Этот код удалит папку`n`n%A_ScriptDir%`n`n`со всеми файлами!`nПродолжить?
IfMsgBox, No
ExitApp,, Clean.cancel := 1
}
/*
Здесь код деинсталляции
*/
ExitApp
class Uninstall
{
__New(var := "file") {
if !A_IsCompiled {
MsgBox, Скомпилируйте скрипт!
ExitApp
}
for k, param in ["ParentPID", "ParentPath"]
%param% := %k%
if ParentPath {
SetWorkingDir, % A_Temp
Process, WaitClose, % ParentPID
if (var = "file")
ComObjCreate("Scripting.FileSystemObject").DeleteFile(ParentPath, 1)
else {
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")
}
}