185 lines
6.0 KiB
NSIS
Vendored
185 lines
6.0 KiB
NSIS
Vendored
; Change shell and registry context based on running
|
|
; architecture and chosen install mode.
|
|
!macro SetContext
|
|
!if "${INSTALLMODE}" == "currentUser"
|
|
SetShellVarContext current
|
|
!else if "${INSTALLMODE}" == "perMachine"
|
|
SetShellVarContext all
|
|
!endif
|
|
|
|
${If} ${RunningX64}
|
|
!if "${ARCH}" == "x64"
|
|
SetRegView 64
|
|
!else if "${ARCH}" == "arm64"
|
|
SetRegView 64
|
|
!else
|
|
SetRegView 32
|
|
!endif
|
|
${EndIf}
|
|
!macroend
|
|
|
|
; Checks whether app is running or not and prompts to kill it.
|
|
!macro CheckIfAppIsRunning executableName productName
|
|
!define UniqueID ${__LINE__}
|
|
|
|
; Replace {{product_name}} placeholder in the messages with the passed product name
|
|
nsis_tauri_utils::StrReplace "$(appRunning)" "{{product_name}}" "${productName}"
|
|
Pop $R1
|
|
nsis_tauri_utils::StrReplace "$(appRunningOkKill)" "{{product_name}}" "${productName}"
|
|
Pop $R2
|
|
nsis_tauri_utils::StrReplace "$(failedToKillApp)" "{{product_name}}" "${productName}"
|
|
Pop $R3
|
|
|
|
!if "${INSTALLMODE}" == "currentUser"
|
|
nsis_tauri_utils::FindProcessCurrentUser "${executableName}"
|
|
!else
|
|
nsis_tauri_utils::FindProcess "${executableName}"
|
|
!endif
|
|
Pop $R0
|
|
${If} $R0 = 0
|
|
IfSilent kill_${UniqueID} 0
|
|
${IfThen} $PassiveMode != 1 ${|} MessageBox MB_OKCANCEL $R2 IDOK kill_${UniqueID} IDCANCEL cancel_${UniqueID} ${|}
|
|
kill_${UniqueID}:
|
|
!if "${INSTALLMODE}" == "currentUser"
|
|
nsis_tauri_utils::KillProcessCurrentUser "${executableName}"
|
|
!else
|
|
nsis_tauri_utils::KillProcess "${executableName}"
|
|
!endif
|
|
Pop $R0
|
|
Sleep 500
|
|
${If} $R0 = 0
|
|
${OrIf} $R0 = 2
|
|
Goto app_check_done_${UniqueID}
|
|
${Else}
|
|
IfSilent silent_${UniqueID} ui_${UniqueID}
|
|
silent_${UniqueID}:
|
|
System::Call 'kernel32::AttachConsole(i -1)i.r0'
|
|
${If} $0 != 0
|
|
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
|
|
System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
|
|
FileWrite $0 "$R1$\n"
|
|
${EndIf}
|
|
Abort
|
|
ui_${UniqueID}:
|
|
Abort $R3
|
|
${EndIf}
|
|
cancel_${UniqueID}:
|
|
Abort $R1
|
|
${EndIf}
|
|
app_check_done_${UniqueID}:
|
|
!undef UniqueID
|
|
!macroend
|
|
|
|
; Sets AppUserModelId on a shortcut
|
|
!macro SetLnkAppUserModelId shortcut
|
|
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 ""
|
|
${If} $0 P<> 0
|
|
${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)'
|
|
${If} $1 P<> 0
|
|
${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READWRITE})'
|
|
${IUnknown::QueryInterface} $0 '("${IID_IPropertyStore}",.r2)'
|
|
${If} $2 P<> 0
|
|
System::Call 'Oleaut32::SysAllocString(w "${BUNDLEID}") i.r3'
|
|
System::Call '*${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_ID})p.r4'
|
|
System::Call '*${SYSSTRUCT_PROPVARIANT}(${VT_BSTR},,&i4 $3)p.r5'
|
|
${IPropertyStore::SetValue} $2 '($4,$5)'
|
|
|
|
System::Call 'Oleaut32::SysFreeString($3)'
|
|
System::Free $4
|
|
System::Free $5
|
|
${IPropertyStore::Commit} $2 ""
|
|
${IUnknown::Release} $2 ""
|
|
${IPersistFile::Save} $1 '("${shortcut}",1)'
|
|
${EndIf}
|
|
${IUnknown::Release} $1 ""
|
|
${EndIf}
|
|
${IUnknown::Release} $0 ""
|
|
${EndIf}
|
|
!macroend
|
|
|
|
; Deletes jump list entries and recent destinations
|
|
!macro DeleteAppUserModelId
|
|
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_DestinationList} ${IID_ICustomDestinationList} r1 ""
|
|
${If} $1 P<> 0
|
|
${ICustomDestinationList::DeleteList} $1 '("${BUNDLEID}")'
|
|
${IUnknown::Release} $1 ""
|
|
${EndIf}
|
|
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationDestinations} ${IID_IApplicationDestinations} r1 ""
|
|
${If} $1 P<> 0
|
|
${IApplicationDestinations::SetAppID} $1 '("${BUNDLEID}")i.r0'
|
|
${If} $0 >= 0
|
|
${IApplicationDestinations::RemoveAllDestinations} $1 ''
|
|
${EndIf}
|
|
${IUnknown::Release} $1 ""
|
|
${EndIf}
|
|
!macroend
|
|
|
|
; Unpins a shortcut from Start menu and Taskbar
|
|
;
|
|
; From https://stackoverflow.com/a/42816728/16993372
|
|
!macro UnpinShortcut shortcut
|
|
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} ${IID_IStartMenuPinnedList} r0 ""
|
|
${If} $0 P<> 0
|
|
System::Call 'SHELL32::SHCreateItemFromParsingName(ws, p0, g "${IID_IShellItem}", *p0r1)' "${shortcut}"
|
|
${If} $1 P<> 0
|
|
${IStartMenuPinnedList::RemoveFromList} $0 '(r1)'
|
|
${IUnknown::Release} $1 ""
|
|
${EndIf}
|
|
${IUnknown::Release} $0 ""
|
|
${EndIf}
|
|
!macroend
|
|
|
|
; Set target path for a .lnk shortcut
|
|
!macro SetShortcutTarget shortcut target
|
|
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 ""
|
|
${If} $0 P<> 0
|
|
${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)'
|
|
${If} $1 P<> 0
|
|
${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READWRITE})'
|
|
${IShellLink::SetPath} $0 '(w "${target}")'
|
|
${IPersistFile::Save} $1 '("${shortcut}",1)'
|
|
${IUnknown::Release} $1 ""
|
|
${EndIf}
|
|
${IUnknown::Release} $0 ""
|
|
${EndIf}
|
|
!macroend
|
|
|
|
!define /ifndef MAX_PATH 260
|
|
!define /ifndef SLGP_RAWPATH 0x4
|
|
|
|
; Test if a .lnk shortcut's target is target,
|
|
; use Pop to get the result, 1 is yes, 0 is no,
|
|
; note that this macro modifies $0, $1, $2, $3
|
|
;
|
|
; Exmaple usage:
|
|
; !insertmacro "IsShortCutTarget" "C:\Users\Public\Desktop\App.lnk" "C:\Program Files\App\App.exe"
|
|
; Pop $0
|
|
; ${If} $0 = 1
|
|
; MessageBox MB_OK "shortcut target matches"
|
|
; ${EndIf}
|
|
!macro IsShortcutTarget shortcut target
|
|
; $0: IShellLink
|
|
; $1: IPersistFile
|
|
; $2: Target path
|
|
; $3: Return value
|
|
|
|
StrCpy $3 0
|
|
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 ""
|
|
${If} $0 P<> 0
|
|
${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}", .r1)'
|
|
${If} $1 P<> 0
|
|
${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READ})'
|
|
System::Alloc MAX_PATH
|
|
Pop $2
|
|
${IShellLink::GetPath} $0 '(.r2, ${MAX_PATH}, 0, ${SLGP_RAWPATH})'
|
|
${If} $2 == "${target}"
|
|
StrCpy $3 1
|
|
${EndIf}
|
|
System::Free $2
|
|
${IUnknown::Release} $1 ""
|
|
${EndIf}
|
|
${IUnknown::Release} $0 ""
|
|
${EndIf}
|
|
Push $3
|
|
!macroend
|