2

Da das InstallShield LE nicht von VS 2017 unterstützt wird, versuche ich stattdessen Inno-Setup zu verwenden.In Inno Setup-Installationsprogramm, Deinstallation von InstallShield LE

Wie kann ich jedoch frühere Installationen von InstallShield LE deinstallieren, bevor die Installation mit dem Inno Setup-Skript beginnt?
Es gibt mehrere Versionen der Anwendung, die bei verschiedenen Benutzern installiert sind (nicht auf demselben Computer).

Da der Produktcode zwischen den Versionen wechselt, kann die GUID in Uninstall Registrierungsschlüssel anders sein und deshalb ist es schwer, in der Deinstallation der Registrierung zu finden.

+0

Inno Setup kann direkt in VS 2017 (als Ersatz für ISLE) integriert werden. Siehe diese Erweiterung https://marketplace.visualstudio.com/items?itemName=unSignedsro.VisualInstaller (Entschuldigung für kleine Self-Promo) – Slappy

+0

Ich kann nicht mit dem Inno-Setup-Teil sprechen, aber die rohe C++ API zum Finden eines installierten Produkts Produkt Code von seinem UpgradeCode ist [MsiEnumRelatedProducts] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370103). –

+0

FWIW, ISLE war in seinen Möglichkeiten eingeschränkt und daher außergewöhnlich einfach auf Windows Installer XML umzustellen. Vor allem, wenn Sie IsWiX benutzt haben. –

Antwort

2

Sie den Code aus Inno Setup: How to automatically uninstall previous installed version?

in den Antworten Während Code einer früheren Versionen verwenden können, installiert von Inno Setup ist für die Deinstallation, ist es meist generische genug, um mit jedem vorherigen Deinstallation System zu arbeiten.

Damit es mit InstallShield funktioniert, müssen Sie einen Produktcode der Version kennen, die Sie deinstallieren möchten. Wenn Sie in der Lage sein müssen, eine Version zu entfernen, können Sie den Produktcode der tatsächlich installierten Version mit dem Upgrade-Code nachschlagen. Dazu können Sie eine WMI-Abfrage verwenden:
How to find the UpgradeCode and ProductCode of an installed application in Windows 7.

const 
    InstallShieldUpgradeCode = '{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'; 

function InitializeSetup(): Boolean; 
var 
    WbemLocator, WbemServices, WbemObjectSet: Variant; 
    Query: string; 
    ProductCode: string; 
begin 
    WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    WbemServices := WbemLocator.ConnectServer('.', 'root\CIMV2'); 
    Query := 
    'SELECT ProductCode FROM Win32_Property ' + 
    'WHERE Property="UpgradeCode" AND Value="' + InstallShieldUpgradeCode + '"'; 
    WbemObjectSet := WbemServices.ExecQuery(Query); 
    if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then 
    begin 
    ProductCode := WbemObjectSet.ItemIndex(0).ProductCode; 

    { Start uninstall here } 
    end; 

    Result := True; 
end; 

Obwohl beachten Sie, dass die Abfrage zehn Sekunden dauern kann:

In Inno Setup Pascal-Script kann der Code wie sein.

1

Wenn ich das Beispielskript geschrieben und the related blog post, war es ganz klar, dass Sie die Registrierung abfragen, sollte vorher installierte Software zu erkennen,

function InitializeSetup(): Boolean; 
var 
    oldVersion: String; 
    uninstaller: String; 
    ErrorCode: Integer; 
begin 
    if RegKeyExists(HKEY_LOCAL_MACHINE, 
    'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F768F6BA-F164-4599-BC26-DCCFC2F76855}_is1') then 
    begin 
    RegQueryStringValue(HKEY_LOCAL_MACHINE, 
     'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F768F6BA-F164-4599-BC26-DCCFC2F76855}_is1', 
     'DisplayVersion', oldVersion); 
    if (CompareVersion(oldVersion, '6.0.0.1004') < 0) then 
    begin 
     if MsgBox('Version ' + oldVersion + ' of Code Beautifier Collection is already installed. Continue to use this old version?', 
     mbConfirmation, MB_YESNO) = IDYES then 
     begin 
     Result := False; 
     end 
     else 
     begin 
      RegQueryStringValue(HKEY_LOCAL_MACHINE, 
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F768F6BA-F164-4599-BC26-DCCFC2F76855}_is1', 
      'UninstallString', uninstaller); 
      ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); 
      Result := True; 
     end; 
    end 
    else 
    begin 
     MsgBox('Version ' + oldVersion + ' of Code Beautifier Collection is already installed. This installer will exit.', 
     mbInformation, MB_OK); 
     Result := False; 
    end; 
    end 
    else 
    begin 
    Result := True; 
    end; 
end; 

Ihre Installbasierten Installer auch eine GUID basierte Unterstruktur zu HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ einfügen sollte, Analysieren Sie einfach, was dort war und ergreifen Sie die notwendigen Maßnahmen, um es zu deinstallieren.

A more recent blog post can be found here.

+0

In InstallShield LE gibt es zwei Guides ProductCode und UpgradeCode. Der Upgrade-Code ist für alle Versionen gleich. Um jedoch eine neuere Version des Produkts zu installieren, wird der Produktcode aktualisiert und es scheint, dass im Registrierungsschlüssel unter ... \ uninstall \ {guid} die GUID der Produktcode ist. Ich weiß nicht, wie InstallShield die Codes verwaltet. In meinem Fall kann der Produktcode verschiedene Versionen haben. Ich habe versucht, den Upgrade-Code in der Registrierung zu finden, da ich vermutete, dass InstallShield so verifizieren würde, dass es das gleiche Produkt ist. – Peter

+0

@Peter, das ist genau die Geschäftslogik, die Sie aus der InstallShield-Dokumentation kennen müssen. Offensichtlich verwendet es etwas, das Inno Setup Ihnen standardmäßig nicht zur Verfügung stellt. –

Verwandte Themen