2009-01-28 15 views
12

Ich benutze NSIS, um ein Installationsprogramm für ein Programm zu erstellen. Was ist der beste Weg, um festzustellen, ob dieses Programm bereits installiert ist? Kann ich das Installationsprogramm sofort beenden, wenn ich eine installierte Kopie ausfindig mache, da ich das Installationsprogramm von der autorun.inf ausführe? Gibt es einen besseren Weg, dies zu tun?Erkennen, ob ein Programm bereits mit NSIS installiert ist

Antwort

18

Wie wäre es damit. Ich hatte das in einem alten NSIS-Skript herumliegen.

; 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

Sie erwähnten Launch Uninstall. Ich konnte Deinstallation in meinem .nsi-Skript nicht wirklich aufrufen, indem Sie diesen obigen Code verwenden. Können Sie mir sagen, wie kann ich Uninstall aufrufen, wenn mein Programm bereits installiert ist? – Jango

+2

Ich musste die 'messagebox :: show' Zeile zu' MessageBox MB_YESNO 'ändern. $ {YOUR_APP_NAME} ist bereits installiert. Deinstallieren Sie die bestehende Version? "/SD IDYES IDNO Beenden '. –

+0

Es ist nicht immer wahr. Einige Software hat unter Deinstallation keinen direkten , zB Visual C++ redistributable. In solchen Fällen müssen wir möglicherweise unter Uninstall alle Schlüssel durchlaufen und die Wertdaten des Wertnamens "DisplayName" prüfen. – Yorkwar

1

Dies wird in der Regel dadurch erreicht, dass NSIS bei der Installation einen Registrierungsschlüssel für Ihr Produkt einfügt. Es ist dann eine einfache Möglichkeit zu erkennen, ob dieser Registrierungsschlüssel vorhanden ist und wenn ja, Kaution

+3

Irgendein Beispiel oder ein Zeiger, den Sie dazu geben können? –

7

Ich habe einen etwas anspruchsvolleren Test wurde mit der auch die Version der installierten Software überprüft:

!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 

Sie natürlich in den Details zu füllen haben, das gibt Ihnen nur eine grobe Skelett.

2

Nach dem Erstellen Ihres Uninstaller einen Produktnamen ein Eintrag in der Registry erstellen

!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)" 

Um zu sehen, ob das Produkt nicht installiert ist

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

In Ihrem deinstallieren Sie tun sollten

Section Uninstall 
    DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" 
Verwandte Themen