Ich verwende Inno Setup, um ein Installationsprogramm zu erstellen.
Ich möchte, dass das Installationsprogramm die zuvor installierte Version automatisch deinstalliert, anstatt sie zu überschreiben. Wie kann ich das machen?
installer
inno-setup
Quan Mai
quelle
quelle
Antworten:
Sie sollten in der Lage sein, die Deinstallationszeichenfolge anhand der AppId (dh des Werts, für den Sie
AppID
im[Setup]
Abschnitt -s verwendet haben) aus der Registrierung zu lesen . Es könnte unterSoftware\Microsoft\Windows\CurrentVersion\Uninstall\{AppId}\
(könnte entwederHKLM
oder seinHKCU
, also überprüfen Sie am besten beide) gefunden werden, wo{AppId}
es durch den tatsächlich verwendeten Wert ersetzt werden sollte. Suchen Sie nach den WertenUninstallString
oderQuietUninstallString
und verwenden Sie dieExec
Funktion, um sie über IhreInitializeSetup()
Ereignisfunktion auszuführen .Update: Nicht funktionierende alternative Lösung mit einem
[Run]
-section-Eintrag mit entfernt{uninstallexe}
- danke an alle Kommentatoren, die darauf hingewiesen haben!quelle
[Run]
Abschnittslösung funktionieren wird, da sie im Installationsprozess zu spät ausgeführt wird. Aus dem Inno Setup-Handbuch: Der Abschnitt [Ausführen] ist optional und gibt eine beliebige Anzahl von Programmen an, die ausgeführt werden sollen, nachdem das Programm erfolgreich installiert wurde, aber bevor das Setup-Programm den letzten Dialog anzeigt.Ich habe folgendes verwendet. Ich bin mir nicht sicher, ob dies der einfachste Weg ist, aber es funktioniert.
Dies verwendet,
{#emit SetupSetting("AppId")}
was auf dem Inno Setup Preprocessor beruht. Wenn Sie das nicht verwenden, schneiden Sie Ihre App-ID direkt aus und fügen Sie sie ein.Alternativen
Siehe auch diesen Blog-Beitrag "Inno Setup Script Sample for Version Comparison", der einen Schritt weiter geht und die Versionsnummer einer zuvor installierten Version liest und diese Versionsnummer mit der des aktuellen Installationspakets vergleicht.
quelle
... UserSIDs: TArrayOfString; I: Integer; ... if not RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString) then if isAdminLoggedOn() and RegGetSubkeyNames( HKEY_USERS, '', UserSIDs ) then for I := 0 to GetArrayLength( UserSIDs ) - 1 do begin if RegQueryStringValue( HKEY_USERS, UserSIDs[I] + '\' + sUnInstPath, 'UninstallString', sUnInstallString ) then break; end;
Bei Verwendung von Inno Setup gibt es keinen Grund, eine frühere Version zu deinstallieren, es sei denn, diese Version wurde von einem anderen Installationsprogramm installiert. Andernfalls werden Upgrades automatisch durchgeführt.
quelle
[InstallDelete]
Abschnitt verwenden, um alte Dateien / Verzeichnisse zu entfernen. Die neuen Dateien werden dann während der Installation an den richtigen Speicherorten abgelegt.Wenn Sie "nur die alten Symbole entfernen möchten" (weil Ihre geändert / aktualisiert wurden), können Sie Folgendes verwenden:
Dies wird "zu Beginn der Installation" ausgeführt, sodass im Grunde genommen die alten Symbole entfernt werden und Ihre neuen Symbole dort weiterhin installiert werden, nachdem dies vollständig abgeschlossen ist.
Ich mache das einfach bei jeder Installation "falls sich etwas geändert hat" symbolisch (alles wird sowieso neu installiert).
quelle
Die Antwort von Craig McQueen ist absolut realisierbar. Obwohl ich diese Kommentare hinzufügen würde:
{#emit SetupSetting("AppId")}
Code funktioniert bei mir nicht, daher füge ich einfach meine App-ID hinzu.In Bezug auf den Code von Craig McQueen gibt es folgende Änderungen:
InstallLocation
Schlüssel anstelle des abUninstallString
Schlüssels ab.DelTree
Funktion anstelle vonExec(sUnInstallString, ...)
quelle
Für alle, die die
GetUninstallString()
oben vorgeschlagenenCurStepChanged()
Methoden verwenden , um eine Deinstallation im Inneren zu erzwingen, und Probleme beim Zwischenspeichern von Datenträgern auftreten, finden Sie unten eine verwandte Lösung, die nach der Deinstallation tatsächlich eine Weile auf das Löschen der Deinstallations-Exe wartet!Festplatten-Caching-Problem mit Inno-Setup?
quelle
Sie können ein Deinstallationsprogramm im Abschnitt [Code] ausführen. Sie müssen herausfinden, wie Sie den Pfad zum vorhandenen Deinstallationsprogramm erhalten. Der Einfachheit halber füge ich bei der Installation meiner Apps einen Registrierungszeichenfolgenwert hinzu, der auf den Ordner mit dem Deinstallationsprogramm verweist, und führe das Deinstallationsprogramm einfach im InitializeWizard-Rückruf aus.
Beachten Sie, dass die Namen der Inno-Setup-Deinstallationsprogramme alle die Form uninsnnn.exe haben. Sie müssen dies in Ihrem Code berücksichtigen.
quelle
Ich habe @Crain Mc-Queen Code bearbeitet, ich denke, dieser Code ist besser, weil er nicht in einem anderen Projekt geändert werden muss:
quelle
Mir muss etwas fehlen. Die neuen Dateien werden in das Zielverzeichnis kopiert, bevor die alte Installation entfernt wird. Dann kommt das Deinstallationsprogramm, löscht sie und entfernt das Verzeichnis.
quelle
Verwenden Sie nicht den Abschnitt [Ausführen], sondern den Abschnitt [UninstallRun]. Tatsächlich wird das Programm unter [Ausführen] nach der Installation ausgeführt, wodurch Ihr Programm unmittelbar nach der Installation deinstalliert wird: - | Stattdessen wird der Abschnitt [UninstallRun] vor der Installation ausgewertet .
quelle
[UninstallRun]
ist keine Lösung für die Frage.Folgen Sie diesem Link: http://news.jrsoftware.org/news/innosetup/msg55323.html
In der Funktion InitializeSetup () können Sie nach der Eingabeaufforderung des Benutzers "MSIEXEC / x {Ihre Programm-ID}" aufrufen, um die alte Version zu deinstallieren
quelle