NSIS: don't delete the registry entries on upgrade

Unless the integration option is deselected, the uninstaller won't
remove the regisrty entries when upgrading, and the installer will update
the registry only when needed.
This commit is contained in:
bitraid 2018-08-01 12:15:22 +03:00
parent 5bf1841e9f
commit bee5681120
No known key found for this signature in database
GPG Key ID: 140D99CA504654D3
2 changed files with 92 additions and 59 deletions

View File

@ -18,14 +18,36 @@
# NSIS installer header. Uses NsisMultiUser plugin and contains portions of
# its demo code, copyright 2017 Richard Drizin, Alex Mitev.
; Variables
var KeepReg
;Languages (first is default language) - must be inserted after all pages
; Languages (first is default language) - must be inserted after all pages
!insertmacro MUI_LANGUAGE "English"
!insertmacro MULTIUSER_LANGUAGE_INIT
; Reserve files
!insertmacro MUI_RESERVEFILE_LANGDLL
; Macros
!macro UpdateRegStr ROOT_KEY SUBKEY KEY_NAME KEY_VALUE
ClearErrors
ReadRegStr $R0 ${ROOT_KEY} "${SUBKEY}" "${KEY_NAME}"
${if} ${errors}
${orif} $R0 != "${KEY_VALUE}"
WriteRegStr ${ROOT_KEY} "${SUBKEY}" "${KEY_NAME}" "${KEY_VALUE}"
${endif}
!macroend
!macro UpdateRegDWORD ROOT_KEY SUBKEY KEY_NAME KEY_VALUE
ClearErrors
ReadRegDWORD $R0 ${ROOT_KEY} "${SUBKEY}" "${KEY_NAME}"
${if} ${errors}
${orif} $R0 != "${KEY_VALUE}"
WriteRegDWORD ${ROOT_KEY} "${SUBKEY}" "${KEY_NAME}" "${KEY_VALUE}"
${endif}
!macroend
!macro MSI32_STACK
Push "${MSI32_010}"
Push "${MSI32_011}"
@ -158,12 +180,16 @@ Section "Core Files (required)" SectionCoreFiles
StrCpy $2 ""
${endif}
${if} $KeepReg = 1
StrCpy $4 "/upgrade"
${endif}
HideWindow
ClearErrors
StrCpy $0 0
; $1 is quoted in registry; the _? param stops the uninstaller from copying
; itself to the temporary directory, which is the only way for ExecWait to work
ExecWait '$1 /SS $2 _?=$3' $0
ExecWait '$1 $4 /SS $2 _?=$3' $0
${if} ${errors} ; stay in installer
SetErrorLevel 2 ; Installation aborted by script
@ -223,66 +249,66 @@ Section "Register with Windows" SectionWindowsRegister
StrCpy $0 "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}"
WriteRegStr SHCTX "$0" "" "${PRODUCT_NAME}"
!insertmacro UpdateRegStr SHCTX "$0" "" "${PRODUCT_NAME}"
WriteRegStr SHCTX "$0\DefaultIcon" "" "$1,0"
!insertmacro UpdateRegStr SHCTX "$0\DefaultIcon" "" "$1,0"
WriteRegDWORD SHCTX "$0\InstallInfo" "IconsVisible" 1
!insertmacro UpdateRegDWORD SHCTX "$0\InstallInfo" "IconsVisible" 1
WriteRegStr SHCTX "$0\shell\open\command" "" "$\"$1$\""
!insertmacro UpdateRegStr SHCTX "$0\shell\open\command" "" "$\"$1$\""
WriteRegStr SHCTX "$0\shell\properties" "" "${PRODUCT_NAME} settings"
WriteRegStr SHCTX "$0\shell\properties\command" "" "$\"$1$\" ${SHELL_PROPERTIES}"
!insertmacro UpdateRegStr SHCTX "$0\shell\properties" "" "${PRODUCT_NAME} settings"
!insertmacro UpdateRegStr SHCTX "$0\shell\properties\command" "" "$\"$1$\" ${SHELL_PROPERTIES}"
WriteRegStr SHCTX "$0\shell\safemode" "" "${PRODUCT_NAME} safe mode"
WriteRegStr SHCTX "$0\shell\safemode\command" "" "$\"$1$\" ${SHELL_SAFEMODE}"
!insertmacro UpdateRegStr SHCTX "$0\shell\safemode" "" "${PRODUCT_NAME} safe mode"
!insertmacro UpdateRegStr SHCTX "$0\shell\safemode\command" "" "$\"$1$\" ${SHELL_SAFEMODE}"
WriteRegStr SHCTX "$0\Capabilities" "ApplicationDescription" "${COMMENTS}"
WriteRegStr SHCTX "$0\Capabilities" "ApplicationIcon" "$1,0"
WriteRegStr SHCTX "$0\Capabilities" "ApplicationName" "${PRODUCT_NAME}"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities" "ApplicationDescription" "${COMMENTS}"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities" "ApplicationIcon" "$1,0"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities" "ApplicationName" "${PRODUCT_NAME}"
WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".htm" "${PRODUCT_NAME}HTML"
WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".html" "${PRODUCT_NAME}HTML"
WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".shtml" "${PRODUCT_NAME}HTML"
WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".svg" "${PRODUCT_NAME}HTML"
WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".xht" "${PRODUCT_NAME}HTML"
WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".xhtml" "${PRODUCT_NAME}HTML"
WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".webp" "${PRODUCT_NAME}HTML"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\FileAssociations" ".htm" "${PRODUCT_NAME}HTML"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\FileAssociations" ".html" "${PRODUCT_NAME}HTML"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\FileAssociations" ".shtml" "${PRODUCT_NAME}HTML"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\FileAssociations" ".svg" "${PRODUCT_NAME}HTML"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\FileAssociations" ".xht" "${PRODUCT_NAME}HTML"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\FileAssociations" ".xhtml" "${PRODUCT_NAME}HTML"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\FileAssociations" ".webp" "${PRODUCT_NAME}HTML"
WriteRegStr SHCTX "$0\Capabilities\StartMenu" "StartMenuInternet" "${PRODUCT_NAME}"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\StartMenu" "StartMenuInternet" "${PRODUCT_NAME}"
WriteRegStr SHCTX "$0\Capabilities\URLAssociations" "ftp" "${PRODUCT_NAME}URL"
WriteRegStr SHCTX "$0\Capabilities\URLAssociations" "http" "${PRODUCT_NAME}URL"
WriteRegStr SHCTX "$0\Capabilities\URLAssociations" "https" "${PRODUCT_NAME}URL"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\URLAssociations" "ftp" "${PRODUCT_NAME}URL"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\URLAssociations" "http" "${PRODUCT_NAME}URL"
!insertmacro UpdateRegStr SHCTX "$0\Capabilities\URLAssociations" "https" "${PRODUCT_NAME}URL"
; Register Application
WriteRegStr SHCTX "SOFTWARE\RegisteredApplications" "${PRODUCT_NAME}" "$0\Capabilities"
!insertmacro UpdateRegStr SHCTX "SOFTWARE\RegisteredApplications" "${PRODUCT_NAME}" "$0\Capabilities"
; Associate file types
WriteRegStr SHCTX "SOFTWARE\Classes\.htm\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
WriteRegStr SHCTX "SOFTWARE\Classes\.html\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
WriteRegStr SHCTX "SOFTWARE\Classes\.shtml\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
WriteRegStr SHCTX "SOFTWARE\Classes\.svg\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
WriteRegStr SHCTX "SOFTWARE\Classes\.xht\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
WriteRegStr SHCTX "SOFTWARE\Classes\.xhtml\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
WriteRegStr SHCTX "SOFTWARE\Classes\.webp\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\.htm\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\.html\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\.shtml\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\.svg\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\.xht\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\.xhtml\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\.webp\OpenWithProgids" "${PRODUCT_NAME}HTML" ""
; HTML and URL handlers
StrCpy $2 "${PRODUCT_NAME}HTML"
StrCpy $3 "${PRODUCT_NAME} HTML Document"
WriteRegHandler:
WriteRegStr SHCTX "SOFTWARE\Classes\$2" "" "$3"
WriteRegStr SHCTX "SOFTWARE\Classes\$2" "FriendlyTypeName" "$3"
WriteRegDWord SHCTX "SOFTWARE\Classes\$2" "EditFlags" 0x00000002
WriteRegStr SHCTX "SOFTWARE\Classes\$2\DefaultIcon" "" "$1,0"
WriteRegStr SHCTX "SOFTWARE\Classes\$2\shell" "" "open"
WriteRegStr SHCTX "SOFTWARE\Classes\$2\shell\open\command" "" "$\"$1$\" $\"%1$\""
WriteRegStr SHCTX "SOFTWARE\Classes\$2\shell\open\ddeexec" "" ""
StrCmp "$2" "${PRODUCT_NAME}HTML" 0 +4
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\$2" "" "$3"
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\$2" "FriendlyTypeName" "$3"
!insertmacro UpdateRegDWORD SHCTX "SOFTWARE\Classes\$2" "EditFlags" 0x00000002
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\$2\DefaultIcon" "" "$1,0"
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\$2\shell" "" "open"
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\$2\shell\open\command" "" "$\"$1$\" $\"%1$\""
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\$2\shell\open\ddeexec" "" ""
StrCmp $2 "${PRODUCT_NAME}HTML" 0 +4
StrCpy $2 "${PRODUCT_NAME}URL"
StrCpy $3 "${PRODUCT_NAME} URL"
Goto WriteRegHandler
WriteRegStr SHCTX "SOFTWARE\Classes\$2" "URL Protocol" ""
!insertmacro UpdateRegStr SHCTX "SOFTWARE\Classes\$2" "URL Protocol" ""
${endif}
SectionEnd
@ -385,6 +411,7 @@ SectionEnd
; Callbacks
Function .onInit
StrCpy $KeepReg 1
!insertmacro CheckPlatform ${PLATFORM}
!insertmacro CheckMinWinVer ${MIN_WIN_VER}
${ifnot} ${UAC_IsInnerInstance}
@ -429,6 +456,12 @@ Function .onInit
FunctionEnd
Function .onSelChange
${if} ${SectionIsSelected} ${SectionWindowsRegister}
StrCpy $KeepReg 1
${else}
StrCpy $KeepReg 0
${endif}
${if} ${SectionIsSelected} ${SectionDefaultBrowser}
!insertmacro SetSectionFlag ${SectionWindowsRegister} ${SF_RO}
!insertmacro SelectSection ${SectionWindowsRegister}

View File

@ -53,28 +53,28 @@ Section "un.Program Files" SectionUninstallProgram
!insertmacro DeleteRetryAbort "$STARTMENU\${PRODUCT_NAME}$0.lnk"
; Clean up Windows Registry
${if} $MultiUser.InstallMode == "AllUsers"
${orif} ${AtLeastWin8}
DeleteRegValue SHCTX "Software\RegisteredApplications" "${PRODUCT_NAME}"
DeleteRegKey SHCTX "Software\Clients\StartMenuInternet\${PRODUCT_NAME}"
DeleteRegKey SHCTX "Software\Classes\${PRODUCT_NAME}HTML"
DeleteRegKey SHCTX "Software\Classes\${PRODUCT_NAME}URL"
DeleteRegValue SHCTX "Software\Classes\.htm\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "Software\Classes\.html\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "Software\Classes\.shtml\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "Software\Classes\.svg\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "Software\Classes\.xht\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "Software\Classes\.xhtml\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "Software\Classes\.webp\OpenWithProgids" "${PRODUCT_NAME}HTML"
${if} $KeepReg = 0
${if} $MultiUser.InstallMode == "AllUsers"
${orif} ${AtLeastWin8}
DeleteRegValue SHCTX "SOFTWARE\RegisteredApplications" "${PRODUCT_NAME}"
DeleteRegKey SHCTX "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}"
DeleteRegKey SHCTX "SOFTWARE\Classes\${PRODUCT_NAME}HTML"
DeleteRegKey SHCTX "SOFTWARE\Classes\${PRODUCT_NAME}URL"
DeleteRegValue SHCTX "SOFTWARE\Classes\.htm\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "SOFTWARE\Classes\.html\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "SOFTWARE\Classes\.shtml\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "SOFTWARE\Classes\.svg\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "SOFTWARE\Classes\.xht\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "SOFTWARE\Classes\.xhtml\OpenWithProgids" "${PRODUCT_NAME}HTML"
DeleteRegValue SHCTX "SOFTWARE\Classes\.webp\OpenWithProgids" "${PRODUCT_NAME}HTML"
; Refresh Shell Icons
System::Call "shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)"
${endif}
${endif}
; Refresh Shell Icons
System::Call "shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)"
SectionEnd
Section /o "!un.Program Settings" SectionRemoveSettings
; this section is executed only explicitly and shouldn't be placed in SectionUninstallProgram
DeleteRegKey HKCU "Software\${PRODUCT_NAME}"
SetShellVarContext current
RMDIR /r "${CONFIG_DIR}\data"
RMDIR /r "${CONFIG_DIR}\config"
@ -129,7 +129,7 @@ Function un.onInit
StrCpy $RunningFromInstaller 0
${endif}
var /GLOBAL KeepReg
${GetOptions} $R0 "/upgrade" $R1
${ifnot} ${errors}
StrCpy $KeepReg 1