Rilevare se un programma è già installato con NSIS
Domanda
Sto usando NSIS per creare un programma di installazione per un programma, qual è il modo migliore per rilevare se questo programma è già installato? Inoltre, poiché sto eseguendo il programma di installazione da autorun.inf, posso uscire immediatamente dal programma di installazione se individua una copia installata? C'è un modo migliore per farlo?
Soluzione
Che ne dici di questo. Ho avuto questo in un vecchio script NSIS in giro.
; 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:
Altri suggerimenti
Ho usato un test leggermente più sofisticato che controlla anche la versione del software installato:
!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
Ovviamente devi compilare i dettagli, questo ti dà solo uno scheletro approssimativo.
Dopo aver creato il programma di disinstallazione, creare una voce del nome prodotto nel 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)"
Per vedere se il prodotto è installato, fai
Function IsProductInstalled
ClearErrors
ReadRegStr $2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName"
StrCmp $2 "" exit
Nella disinstallazione dovresti eseguire
Section Uninstall
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
Questo è generalmente fatto facendo in modo che NSIS inserisca una chiave di registro per il prodotto durante l'installazione. È quindi un modo semplice per rilevare se è presente quella chiave di registro e, in tal caso, cauzione