Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Umstieg von InstallShield auf InnoSetup und der Upgrade Code (https://www.delphipraxis.net/150539-umstieg-von-installshield-auf-innosetup-und-der-upgrade-code.html)

Whookie 20. Apr 2010 10:36


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

Whookie 20. Apr 2010 22:25

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 20:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz