IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Outils Delphi Discussion :

[InnoSetup] Vérifier si une installation est déjà faite


Sujet :

Outils Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut [InnoSetup] Vérifier si une installation est déjà faite
    Bonjour,

    j'utilise Inno Setup pour faire les installations.
    Je voudrais savoir au lancement du setup si une installation a déjà été faite et si c'est le cas, mettre un message demandant de désinstaller la version précédente avant de continuer l'installation et fermer le setup sans installer.
    J'ai cherché dans l'aide d'Inno Setup mais je n'ai rien trouvé, ni sur le net non plus.
    J'ai pensé à vérifier si le répertoire d'installation existe mais le problème est que lors de la désinstallation, le répertoire reste, donc ce n'est pas forcément un test fiable.
    Avez-vous une idée pour résoudre mon problème ?
    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Pour ton soucis, je dirai que tu pourrais vérifier si une clé registre qui contient par exemple l'emplacement de l'installation précédente existe... Ainsi, il nous suffit de savoir si la clé est présente au moment où l'on veut installer la nouvelle version de ton programme ... J'ai fait un truc similaire pour savoir si PSPad était installé avant d'installer mon petit programme ... Je remet le code en entier ci dessous (référence à ce thread ) . Le code est à mettre dans la partie code d'Inno Setup ... Il ne te reste, si ce n'est déjà fait, de créer une clé registre à l'installation de ton programme ... La chose qui est un peu embêtante, c'est qu'il aurait fallu avoir cette clé pour la première version de ton programme ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    var
    RepPSPad:String;
     
    function InitializeSetup(): Boolean;
    begin
      if RegKeyExists(HKEY_CURRENT_USER,'SOFTWARE\PSPad') = true then
      begin
        if RegValueExists(HKEY_CURRENT_USER,'SOFTWARE\PSPad','PSPadPath') = true then
        begin
          if RegQueryStringValue(HKEY_CURRENT_USER,'SOFTWARE\PSPad','PSPadPath',RepPSPad)=true then
          begin
            Result:=true;
          end
          else
          begin
            Msgbox('PSPad ne semble pas être installé! Installation annulée',mbConfirmation,MB_Ok);
            Result:=False;
          end;
        end
        else
        begin
          Msgbox('PSPad ne semble pas être installé! Installation annulée',mbConfirmation,MB_Ok);
          Result:=False;
        end;
      end
      else
      begin
        Msgbox('PSPad ne semble pas être installé! Installation annulée',mbConfirmation,MB_Ok);
        Result:=False;
      end;
    end;
     
    function GetPSPadPath(Default: String) : String;
    begin
       RepPSPad:=Copy(RepPSPad,2,Length(RepPSPad)-1);
       Result:=ExtractFilePath(RepPSPad);
    end;
    Sinon, une autre solution, c'est de tester si le répertoire est vide ... C'est c'est le cas, la désinstallation a été faite ... Là encore, c'est peut fiable aussi

    Enfin voilà, je t'ai donné un peu ce qui me passait par la tête
    A+

  3. #3
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Moi, je mets une clé de registre à l'installation que j'efface à la desinstallation.
    Lors d'une install, je vérifie par code la présence de cette clé dans la fonction InitializeSetup

    Edit: zut, j'ai fait autre chose entre temps et je me suis fait grillé

  4. #4
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Merci pour vos réponses mais le problème est que je dois gérer avec le parc existant, dans les précédentes versions, je créais bien des clés dans la base de registre, mais elles n'étaient pas supprimées à la désinstallation, donc l'existence d'une clé dans la base de registre ne me garantit pas que l'ancienne version ait bien été désinstallée, ça me dit juste que ce n'est pas une première installation.
    Tester si le répertoire est vide ou non n'est pas non plus un test fiable car d'autres programmes et setups s'installent aussi dans ce répertoire d'installation (des applications associées à cette installation) mais aussi et surtout j'ai quelques erreurs dans l'ancien setup qui n'arrivait pas à supprimer les anciens exécutables à la désinstallation.

    Je me pose cette question, comment Inno Setup fait pour rajouter un élément dans la liste Ajout/Suppr des programmes ? Il se base sur AppId pour savoir s'il doit créer une nouvelle ligne ou remplacer la ligne existante.
    N'y-a-t-il pas une solution pour réutiliser cet AppId et voir s'il est toujours présent dans la liste des programmes à désinstaller ?

    Merci pour votre aide.

  5. #5
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Rectification sur ce que j'ai dit au dessus, ce n'est pas AppId que j'utilise actuellement mais AppName.

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Tiens, voilà ce que j'avais fait pour FunLabyrinthe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    const
      OldVersionRegKey = 'Software\Microsoft\Windows\CurrentVersion\Uninstall\FunLabyOld_is1\';
     
    var
      HasOldVersion : boolean;
      OldVersionDisplayVersion : string;
      OldVersionInstallDir : string;
      OldVersionUninstallString : string;
     
    function OldVersionInfo(Param : string) : string;
    begin
      if Param = 'version' then
        Result := OldVersionDisplayVersion
      else if Param = 'installdir' then
        Result := OldVersionInstallDir
      else if Param = 'uninstallstring' then
        Result := OldVersionUninstallString
      else
        Result := '';
    end;
     
    procedure CheckOldVersion;
    begin
      HasOldVersion := RegKeyExists(HKLM, OldVersionRegKey);
      OldVersionDisplayVersion := '';
      OldVersionInstallDir := '';
      OldVersionUninstallString := '';
     
      if HasOldVersion then
      begin
        RegQueryStringValue(HKLM, OldVersionRegKey, 'DisplayVersion', OldVersionDisplayVersion);
        RegQueryStringValue(HKLM, OldVersionRegKey, 'InstallLocation', OldVersionInstallDir);
        RegQueryStringValue(HKLM, OldVersionRegKey, 'QuietUninstallString', OldVersionUninstallString);
      end;
    end;
    Prends ce qui t'intéresse. ('FunLabyOld' est l'AppID de l'ancienne version ; si tu n'as pas utilisé AppID, c'est AppName qui a été pris à la place)

  7. #7
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Rebonjour tout le monde,

    je pense avoir trouvé la solution. En fait, j'avais besoin de demander de désinstaller l'ancienne version avant d'installer la nouvelle version car j'installe un service et j'avais des problèmes avec le changement de la session du service sans désinstallation préalable du service.

    J'ai trouvé une solution, une clé de registre se crée et se supprime quand on installe/désinstalle le service. Je vais donc utiliser cette clé pour pour savoir si une version est déjà installée.

  8. #8
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Merci Sjrd pour ton code, je vais aussi le potasser et voir qu'est-ce qui serra le plus simple et le plus évolutif à mettre en place.

  9. #9
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Etant déjà parti sur mon code et comme il fonctionne, je reste ainsi. Si j'ai un soucis, j'utiliserai ton code Sjrd.
    Merci à tous pour votre aide.
    Bye.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Points : 76
    Points
    76
    Par défaut
    Bonjour tout le monde,
    je sais pas si j'aurais une réponse à ma question vu la date ou le problème a été posé mais je tente ma chance qui sait

    Bon en fait dans mon cas j'essaie de vérifier si un logiciel que j'installe avec mon programme existe ou pas, si on prend l'exemple d'un programme qui s'appelle prog1 ou j'installe postgresql avec, avant le commencement de l'installation, on doit vérifier si postgresql existe dans le disque dur ou pas, en cas ou ce derbier est déjà installer l'installeur ne doit pas installer postgresql sinon il l'installe, pour se faire et en s'aidant du code de Monsieur 'ero-sennin' queje remércie enormement j'arrive à détecter si Postgresql existe ou pas dans mon disque dur voici ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function InitializeSetup(): Boolean;
    begin
    	if RegKeyExists(HKEY_LOCAL_MACHINE,'SOFTWARE\PostgreSQL') = true then
    		begin
    			Msgbox('PostgreSQL semble être installé!',mbConfirmation,MB_Ok);
    			Result:=False;
    		end
    		else
    		begin
    			Msgbox('PostgreSQL ne semble pas être installé!',mbConfirmation,MB_Ok);
    			Result:=True;
    		end;
    end;
    cette fonction vérifie juste si Postgresql existe, vu que l'installation de Postgresql je l'appele dans la section [run] est ce que c'est possible d'appelé cetet section dans la section code pour lui dire de ne pas s'en servir genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if RegKeyExists(HKEY_LOCAL_MACHINE,'SOFTWARE\PostgreSQL') = true then
    	begin
    		Msgbox('PostgreSQL semble être installé!',mbConfirmation,MB_Ok);
    		(ne pas exécuter la ligne pourl'installation de PostgreSQL écrite dans la section [run])
    ...
    j'espère que j'étais claire et merci d'avance pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment vérifier si une imprimante est installée.
    Par Godzestla dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/06/2008, 16h54
  2. Vérifier si une case est cochée
    Par Nadd dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2006, 18h47
  3. Comment vérifier qu'une date est nulle
    Par stressy dans le forum Access
    Réponses: 7
    Dernier message: 09/12/2005, 15h41
  4. vérifier qu'une valeur est numérique
    Par kopofb dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/11/2005, 14h02
  5. Vérifier si une form est ouverte
    Par nivet dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2004, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo