2009-01-28 42 views
12

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, dado que estoy ejecutando el instalador desde autorun.inf, ¿puedo salir inmediatamente del instalador si encuentra una copia instalada? ¿Hay una mejor manera de hacer esto?Detectando si un programa ya está instalado con NSIS

Respuesta

18

¿Qué tal esto? Tenía esto en un antiguo 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: 
+0

Usted mencionó Lanzar Desinstalar. Realmente no pude invocar Desinstalar en mi script .nsi usando este código anterior. ¿Me puede decir cómo puedo llamar a Desinstalar si mi programa ya está instalado? – Jango

+2

Tuve que cambiar la línea 'messagebox :: show' a' MessageBox MB_YESNO "$ {YOUR_APP_NAME} ya está instalado. ¿Desinstalar la versión existente?"/SD IDYES IDNO Salir'. –

+0

No siempre es verdad. Algunos software no tienen un directo en Desinstalar, por ejemplo, C++ visual redistribuible. En tales casos, es posible que tengamos que iterar sobre todas las claves en Desinstalar y verificar los datos de valor del nombre de valor "DisplayName" – Yorkwar

1

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

+3

¿Algún ejemplo o puntero que puedas dar al hacer eso? –

7

He estado usando una prueba un poco más sofisticado que también comprueba 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 

Usted, por supuesto, tienen que rellenar los datos, esto sólo le da una áspera esqueleto.

2

Después de crear el programa de desinstalación de crear un ingreso en el nombre del 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 se ha instalado el producto lo hacen

Function IsProductInstalled 
    ClearErrors 
    ReadRegStr $2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" 
    StrCmp $2 "" exit 

En su desinstalación que debería estar haciendo

Section Uninstall 
    DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" 
Cuestiones relacionadas