![]() |
Umstieg von InstallShield auf InnoSetup und der Upgrade Code
Hallo liebe Delphigemeinde!
Ich hab ein Problem beim Umstieg von InstallShield Express zu InnoSetup. Ich möchte den Uninstall-Eintrag von InstallShield entfernen, damit beim ersten Einsatz des neuen (Inno)Setups der alte InstallShield-Eintrag nicht mehr vorhanden ist (Installation erfolgt ja ins selbe Verzeichnis mit den selben Dateien). Nun könnte man natürlich einfach all Product-Codes der bisherigen Versionen rauskitzeln, eine Liste erstellen und beim Installieren die Registry durchsuchen (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Cur rentVersion\Uninstall) und einfach den Schlüssel löschen, wenn einer gefunden wird. Das ganze ist aber aufwändig und muss für jedes Programm erneut angepasst werden. Daher war meine Idee den "Upgrade Code" (der bei mir je Programm immer gleich ist) zu verwenden und damit herauszufinden ob ein passendes Programm installiert ist, um so auf den aktuellen Product-Code und letztlich das Löschen des Uninstall-Schlüssels zu kommen. Allerdings scheint der Upgrade-Code nicht in der Registry zu stehen und das macht alle meinen schönen Pläne zunichte :twisted: ... Aber vielleicht gibts ja eine andere/ähnliche/brauchbare Methode an diese Information zu kommen? TIA Whookie |
Re: Umstieg von InstallShield auf InnoSetup und der Upgrade
So, hier mal meine Lösung. Sie geht davon aus, dass die Applikation mit einem Namen und ihrer Version installiert wurde (siehe Format von CUninstallDisplayName unten). DeleteInstallShieldStrings() kann z.B.: in NextButtonClick (CurPageID = wpReady) aufgerufen werden. Natürlich wird nur ein kleiner Teil der Registry-Einträge entfernt aber für meine Zwecke reicht es, ich ersetze damit auch nur den Installer der selben Applikation.
[code=delphi]
Code:
Const
CUninstallDisplayName = 'MyApplication v1.10.2010.1'; procedure ExtractData(DisplayName: String; Var AppName: String; Var Major, Minor: Integer); var iIdx: Integer; iStart: Integer; s: String; begin // Annahme: alles geht schief :D AppName := ''; Major := 9999; Minor := 9999; // if DisplayName <> '' then begin iIdx := Length(DisplayName); while (iIdx > 1) And (DisplayName[iIdx] <> ' ') do iIdx := iIdx - 1; // if DisplayName[iIdx] = ' ' then begin AppName := Copy(DisplayName, 1, iIdx-1); // Wir haben den DisplayName ohne Version // Delete(DisplayName, 1, iIdx); iIdx := Pos('.', DisplayName); if iIdx > 0 then begin s := Copy(DisplayName, 1, iIdx-1); // s = MajorVersion (eventuell noch mit an "v" vorne Delete(DisplayName, 1, iIdx); while (s <> '') And ((s[1] < '0') Or (s[1] > '9')) do Delete(s, 1, 1); try Major := StrToInt(s); except end; // iIdx := Pos('.', DisplayName); // MinorVersion.... if iIdx > 0 then begin s := Copy(DisplayName,1,iIdx-1); try Minor := StrToInt(s); except end; end; end; // Else Error kein "." end; end; end; procedure DeleteInstallShieldStrings(); var iKeys: TArrayOfString; i: Integer; sUPath, s: String; iValue: String; iMajor, iMinor: Integer; iCurrMajor, iCurrMinor: Integer; iAppName: String; iDNLen: Integer; begin ExtractData(CUninstallDisplayName, iAppName, iMajor, iMinor); iDNLen := Length(iAppName); sUPath := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'; if RegGetSubKeyNames(HKEY_LOCAL_MACHINE, sUPath, iKeys) Then begin for i := 0 to GetArrayLength(iKeys)-1 do begin If RegValueExists(HKEY_LOCAL_MACHINE, sUPath + '\' + iKeys[i], 'DisplayName') Then begin If RegQueryStringValue(HKEY_LOCAL_MACHINE, sUPath + '\' + iKeys[i], 'DisplayName', iValue) Then begin s := Copy(iValue, 1, iDNLen); If CompareText(s, iAppName)=0 Then begin ExtractData(iValue, s, iCurrMajor, iCurrMinor); If (iCurrMajor < iMajor) Or ((iCurrMajor = iMajor) And (iCurrMinor <= iMinor)) Then begin // raus damit .... RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE, sUPath + '\' + iKeys[i]); end; end; end; End; end; end; // // nächste runde (ISX und M$ sind ein "nasty beast") // sUPath := 'Installer\Products'; if RegGetSubKeyNames(HKEY_CLASSES_ROOT, sUPath, iKeys) Then begin for i := 0 to GetArrayLength(iKeys)-1 do begin If RegValueExists(HKEY_CLASSES_ROOT, sUPath + '\' + iKeys[i], 'ProductName') Then begin If RegQueryStringValue(HKEY_CLASSES_ROOT, sUPath + '\' + iKeys[i], 'ProductName', iValue) Then begin s := Copy(iValue, 1, iDNLen); If CompareText(s, iAppName)=0 Then begin // Da sich hier nur InstallShield einträgt killen wir den Key ohne weitere tests RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, sUPath + '\' + iKeys[i]); end; End; End; End; End; // Das ist noch nicht alles ... aber es reicht :D (hoffentlich) end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz