AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Umstieg von InstallShield auf InnoSetup und der Upgrade Code
Thema durchsuchen
Ansicht
Themen-Optionen

Umstieg von InstallShield auf InnoSetup und der Upgrade Code

Ein Thema von Whookie · begonnen am 20. Apr 2010 · letzter Beitrag vom 20. Apr 2010
Antwort Antwort
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#1

Umstieg von InstallShield auf InnoSetup und der Upgrade Code

  Alt 20. Apr 2010, 11:36
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 ...

Aber vielleicht gibts ja eine andere/ähnliche/brauchbare Methode an diese Information zu kommen?

TIA
Whookie
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Umstieg von InstallShield auf InnoSetup und der Upgrade

  Alt 20. Apr 2010, 23:25
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;
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 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