windows - Detectando si un programa ya está instalado con NSIS
autorun (4)
Esto se hace generalmente haciendo que NSIS inserte una clave de registro para su producto cuando se instala. Entonces es una manera fácil de detectar si esa clave de registro está presente y, de ser así, fianza
Estoy usando NSIS para crear un instalador para un programa, ¿cuál es la mejor manera de detectar si este programa ya está instalado? Además, como estoy ejecutando el instalador desde autorun.inf, ¿puedo salir inmediatamente del instalador si encuentra una copia instalada? ¿Hay una mejor manera de hacer esto?
Qué tal esto. Tenía esto en un viejo script de NSIS por ahí.
; Check to see if already installed
ReadRegStr $R0 HKLM "SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall/<YOUR-APP-NAME>" "UninstallString"
IfFileExists $R0 +1 NotInstalled
messagebox::show MB_DEFBUTTON4|MB_TOPMOST "<YOUR-APP-NAME>" /
"0,103" /
"<YOUR-APP-NAME> is already installed." /
"Launch Uninstall" "Cancel"
Pop $R1
StrCmp $R1 2 Quit +1
Exec $R0
Quit:
Quit
NotInstalled:
He estado usando una prueba un poco más sofisticada que también verifica la versión del software instalado:
!define PRODUCT_VERSION "1.2.0"
!include "WordFunc.nsh"
!insertmacro VersionCompare
Var UNINSTALL_OLD_VERSION
...
Section "Core System" CoreSystem
StrCmp $UNINSTALL_OLD_VERSION "" core.files
ExecWait ''$UNINSTALL_OLD_VERSION''
core.files:
...
WriteRegStr HKLM "Software/${PRODUCT_REG_KEY}" "" $INSTDIR
WriteRegStr HKLM "Software/${PRODUCT_REG_KEY}" "Version" "${PRODUCT_VERSION}"
...
SectionEnd
...
Function .onInit
;Check earlier installation
ClearErrors
ReadRegStr $0 HKLM "Software/${PRODUCT_REG_KEY}" "Version"
IfErrors init.uninst ; older versions might not have "Version" string set
${VersionCompare} $0 ${PRODUCT_VERSION} $1
IntCmp $1 2 init.uninst
MessageBox MB_YESNO|MB_ICONQUESTION "${PRODUCT_NAME} version $0 seems to be already installed on your system.$/nWould you like to proceed with the installation of version ${PRODUCT_VERSION}?" /
IDYES init.uninst
Quit
init.uninst:
ClearErrors
ReadRegStr $0 HKLM "Software/${PRODUCT_REG_KEY}" ""
IfErrors init.done
StrCpy $UNINSTALL_OLD_VERSION ''"$0/uninstall.exe" /S _?=$0''
init.done:
FunctionEnd
Por supuesto, tiene que completar los detalles, esto solo le da un esqueleto aproximado.
Después de crear tu desinstalador crea una entrada de nombre de producto en el registro
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_UNINST_KEY "Software/Microsoft/Windows/CurrentVersion/Uninstall/${COMPANY_NAME} ${PRODUCT_NAME}"
Section -Post
SetShellVarContext current
WriteUninstaller "${UNINST_PATH}/uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
Para ver si el producto está instalado, haga
Function IsProductInstalled
ClearErrors
ReadRegStr $2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName"
StrCmp $2 "" exit
En tu desinstalación deberías estar haciendo
Section Uninstall
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"