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 :

Inno Setup popup confirmation et exec


Sujet :

Outils Delphi

  1. #1
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut Inno Setup popup confirmation et exec
    Salut,

    J'ai une question qui paraitra surement simple pour les connaisseurs.
    J'utilise cet outil afin d'installer mes applications sur des postes Windows. Je souhaiterais qu'à l'installation, il détecte si l'application est déjà présente et si c'est le cas la désinstalle avant de commencer l'installation.

    Pour ce faire, pour le moment, je teste si la variable de regisre est présente et si c'est le cas, j'affiche une message lui demandant de désinstaller l'application avant de continuer. J'utilise le code suivant :

    [CODE]
    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
     
    var MessageErreur : string;
    function InitializeSetup(): Boolean;
    // Vérification de la présence de l'application à l'installation
    begin
    	if RegKeyExists(HKEY_LOCAL_MACHINE,'SOFTWARE\TOTO ') = true then
    		begin
    		  MessageErreur := 'Veuillez désinstaller TOTO au préalable !! Merci.';
    			Msgbox(MessageErreur, mbConfirmation, MB_Ok);
          Result:=False;
    		end
    	else
    	  begin
    	    Result:=True;
    	  end
    end;
    Le problème est que vu que je retourne False, l'installation est stoppée et l'utilisateur doit désinstaller l'application et recliquer sur le setup d'installation.

    Je souhaiterais plutôt faire ceci :
    1- ouvrir un popup avec le même message mais avec le bouton OK ou annuler.
    2- Si click sur OK => la désinstallation se fait automatiquement en lançant unins000.exe (d'ailleurs comment le faire ?) et une fois fini, je fais un dernier test et si c ok, l'installation continue.
    3- Si click annuler => Stopper l'installation comme actuellment avec False

    Merci

    NB: Je ne connais absolument rien en delphi.

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Ce n'est normalement pas nécessaire avec InnoSetup : si le champ AppId reste le même, il détecte que c'est une mise à jour et non pas une installation conflictuelle, et il mettra le script de désinstallation à jour de façon correcte. Tu peux aussi automatiquement installer dans le répertoire de l'ancienne version via UsePreviousAppDir.

    Ensuite, il te suffit de créer une section [InstallDelete] pour supprimer les fichiers de l'ancienne version qui DOIVENT l'être (pour cause de conflit notamment). Ne pas oublier, bien entendu, la section UninstallDelete] pour supprimer les fichiers créés à l'exécution du programme et être certain de bien purger complètement ton répertoire d'application.

  3. #3
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    d'ac avec Mac LAK c'est prévu pour maintenant si ta trop de différence genre entre v1 et v2 moi j'utilise sa, sa propose de désinstaller automatiquement :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    ; Script generated by the Inno Setup Script Wizard.
    ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
     
    #define MyAppName "My Program"
    #define MyAppVerName "My Program 1.5"
    #define MyAppPublisher "My Company, Inc."
    #define MyAppURL "http://www.example.com/"
    #define MyAppExeName "MyProg.exe"
    #define MyAppId "{C93793F-CDA6-4AF0-8F00-1502816C2699}"
    [Setup]
    ; NOTE: The value of AppId uniquely identifies this application.
    ; Do not use the same AppId value in installers for other applications.
    ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
    AppId={{#MyAppId}
    AppName={#MyAppName}
    AppVerName={#MyAppVerName}
    AppPublisher={#MyAppPublisher}
    AppPublisherURL={#MyAppURL}
    AppSupportURL={#MyAppURL}
    AppUpdatesURL={#MyAppURL}
    DefaultDirName={pf}\{#MyAppName}
    DefaultGroupName={#MyAppName}
    OutputBaseFilename=setup
    Compression=lzma
    SolidCompression=yes
     
    [Languages]
    Name: "english"; MessagesFile: "compiler:Default.isl"
     
    [Tasks]
    Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
     
    [Files]
    Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
    ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
     
    [Icons]
    Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
    Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
     
    [Run]
    Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
     
    [code]
    // Vérification de la présence de l'application à l'installation
    function InitializeSetup(): Boolean;
    var
      UninstalFile: String;
      ErrorCode: Integer;
    begin
        Result       := True;
        UninstalFile := '';
        repeat
        //si on a un chemin de fichier UninstalFile n'est plus vide alors on averti sinon on continue l'installation
          if RegQueryStringValue( HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1', 'UninstallString', UninstalFile) then
          begin        
              case MsgBox('TOTO doit d''abort etre desinstaller, voulez-vous le desinstaller automatiquement?', mbConfirmation, MB_YESNOCANCEL or MB_DEFBUTTON2) of
                IDYES:
                begin
                  //on lance desinstallation et attendons
                  ShellExec('', UninstalFile, ' /SILENT', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
                  //on vérifie que c'est bien désinstallé pour sortir ou non de la boucle
                UninstalFile := '';     
                  RegQueryStringValue( HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1', 'UninstallString', UninstalFile);
                end;
                IDCANCEL:
                  //on arrête l'installeur
              Result := False;
          end;
        end;
      until (UninstalFile = '') or (Result = False);
    end;

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Merci pour vos réponses.
    Après lecture de vos réponses et de quelques doc, voici mon premier code delphi , j'espère que mon code est propre, sinon, vos critiques sont toujours les bienvenues

    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
    38
    39
    40
    41
    42
    43
    44
     
    [Code]
    var
      MessageErreur : string;
      Version: String;
      FichierUninstall: String;
      ErrorCode: Integer;
    function InitializeSetup(): Boolean;
    // Vérification de la présence de l'application à l'installation
    begin
      if RegQueryStringValue( HKLM, 'SOFTWARE\TOTO', 'UninstallFile', FichierUninstall) then
        begin
          MessageErreur := 'Pour continuer l''installation, vous devez désinstaller TOTO'+Version+'.'
          + #13 + 'Souhaitez déinstaller le faire automatiquement ? ';
          // Récupération de la version installée
          RegQueryStringValue( HKLM, 'SOFTWARE\TOTO', 'CurrentVersion', Version);
          // On lance le désinstallation et attendons
          if RegQueryStringValue( HKLM, 'SOFTWARE\TOTO', 'UninstallFile', FichierUninstall) then
            begin
              case  Msgbox(MessageErreur, mbConfirmation, MB_YESNOCANCEL or MB_DEFBUTTON2) of
                // Ok pour desinstallation
                IDYES:
                  begin
                    // Lancement de la désinstallation
                    ShellExec('', FichierUninstall, ' /SILENT', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
                    // Verification que la désinstallation a bien eu lieu en vérifiant la variable FichierUninstall
                    FichierUninstall := '';
                    RegQueryStringValue( HKLM, 'SOFTWARE\TOTO', 'UninstallFile', FichierUninstall);
                  end
               // Refus de désinstallation => Arrêt installation
               else
                begin
                  Msgbox('L''installation est annulée car vous avez choisi de ne pas désinstaller l''ancienne version', mbConfirmation, MB_Ok);
                  Result := False;
                  Exit;
                end
              end
              // L'installation peut continuer
              Result := True;
            end
        end
      else
        Result := True;
    end;

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    A priori cela me parait bien.

    1° remarque le CR/LF se code #13#10 puisqu'on est sous Windows.

    Ensuite, je pense que tu dois inverser ces 2 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          // Récupération de la version installée
          RegQueryStringValue( HKLM, 'SOFTWARE\TOTO', 'CurrentVersion', Version);
          MessageErreur := 'Pour continuer l''installation, vous devez désinstaller TOTO'+Version+'.'
          + #13#10 + 'Souhaitez déinstaller le faire automatiquement ? ';
    @+ Claudius

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Merci pour le CR/LF, sinon pour la dernière remarque je m'en suis aperçu après le test. Tout roule.

    Merci tout le monde.

    Voici la version finale de la partie code pour ceux que ça intéressent !

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    [Registry]
    ; Création d'une clé à l'installation qui sera supprimée à la désinstallation.
    Root: HKLM; Subkey: SOFTWARE\TOTO; ValueType: string; ValueName: CurrentVersion; ValueData: 1.0; Flags: uninsdeletekey
    Root: HKLM; Subkey: SOFTWARE\TOTO; ValueType: string; ValueName: UninstallFile; ValueData: {uninstallexe}; Flags: uninsdeletekey
     
    [Code]
    var
      MessageErreur : string;
      Version: String;
      FichierUninstall: String;
      Registre: String;
      ErrorCode: Integer;
     
    function InitializeSetup(): Boolean;
    // Vérification de la présence de l'application à l'installation
    begin
      Registre := 'SOFTWARE\TOTO';
      if RegQueryStringValue( HKLM, Registre, 'UninstallFile', FichierUninstall) then
        begin
          // Récupération de la version installée
          RegQueryStringValue( HKLM, Registre, 'CurrentVersion', Version);
          MessageErreur := 'Pour continuer l''installation, vous devez désinstaller TOTO'+Version+'.'
          + #13#10 + 'Souhaitez vous le faire automatiquement ? ';
     
          // On lance le désinstallation et attendons
          if RegQueryStringValue( HKLM, Registre, 'UninstallFile', FichierUninstall) then
            begin
              case  Msgbox(MessageErreur, mbConfirmation, MB_YESNOCANCEL or MB_DEFBUTTON2) of
                // Ok pour desinstallation
                IDYES:
                  begin
                    // Lancement de la désinstallation
                    ShellExec('', FichierUninstall, ' /SILENT', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
                    // Verification que la désinstallation a bien eu lieu en vérifiant la variable FichierUninstall
                    FichierUninstall := '';
                    RegQueryStringValue( HKLM, Registre, 'UninstallFile', FichierUninstall);
                  end
              // Refus de désinstallation => Arrêt installation
              else
                begin
                  Msgbox('L''installation est annulée car vous avez choisi de ne pas désinstaller l''ancienne version', mbConfirmation, MB_Ok);
                  Result := False;
                  Exit;
                end
              end
              // L'installation peut continuer
              Result := True;
            end
        end
      else
        Result := True;
    end;

  7. #7
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    en fait je vois pas pourquoi tu crée les clefs registre, l'installeur en crée automatiquement et c'est celle la que mon exemple récupère.
    par ex tu as DisplayName ou DisplayVersion
    RegQueryStringValue( HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1', 'DisplayName', DisplayName);
    faut les avoir remplis sous la section setup de ton script pour quelle soit crée


    si l'utilisateur clique non sa termine le setup, or certain utilisateurs préférerons désinstaller eux même puis cliquer sur non pour continuer. la le cancel n'a pas d'interet puisque non fait la même chôse moi je mettrai MB_YESNO

    je précise mon exemple fonctionne avec inno setup 5.3.3 et inno setup preprocesseur (inclus dans ispack)

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Je ne me rappelais plus que L'installateur crée automatiquement une clé de registre et en effet dans HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}, j'ai toutes les infos du setup.

    Je rappelle que j'utilise innosetup 5.3.5 uniquement.

    Quand au cancel, en effet, il ne sert à rien.

    Je vais voir pour simplifier mon script et utiliser {#MyAppId}

    __
    Bon en fait, il me fallait installer innosetup quickstart pour pouvoir utiliser ta technique, maintenant, je vais pouvoir modifier simplement mon script.

    MErci

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Voilou, tout est réglé. Script simplifié.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #define MyAppName "TOTO"
    #define MyAppVerName "TOTO 1.0"
    #define MyAppId "{XXX...XXX}"
    [Setup]
    AppId={{#MyAppId}
    AppName={#MyAppName}
    AppVerName={#MyAppVerName}
    ...
    ...
    [Code]
    var
      MessageErreur : string;
      NomApplication: String;
      FichierUninstall: String;
      Registre: String;
      ErrorCode: Integer;
     
    function InitializeSetup(): Boolean;
    // Vérification de la présence de l'application à l'installation
    begin
      // Clé Id de registre
      Registre := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1';
      Result   := True;
      if RegQueryStringValue( HKLM, Registre, 'UninstallString', FichierUninstall) then
        begin
          // Récupération de la version installée
          RegQueryStringValue( HKLM, Registre, 'DisplayName', NomApplication);
          MessageErreur := 'Pour continuer l''installation, vous devez désinstaller ' + NomApplication
          + #13#10 + 'Souhaitez vous le faire automatiquement ? ';
     
          // Confirmation de la désinstallation
          case  Msgbox(MessageErreur, mbConfirmation, MB_YESNO) of
            // Désinstallation OK
            IDYES:
              begin
                // Lancement de la désinstallation
                ShellExec('', FichierUninstall, '/SILENT', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
                // Vérification que la désinstallation a bien eu lieu en vérifiant la variable FichierUninstall
                FichierUninstall := '';
                RegQueryStringValue( HKLM, Registre, 'UninstallFile', FichierUninstall);
              end
     
            // Refus de la désinstallation => Arrêt installation
            else
              begin
                Msgbox('L''installation est annulée car vous avez choisi de ne pas désinstaller' + NomApplication, mbConfirmation, MB_Ok);
                Result := False;
                Exit;
              end
          end
        end
    end;
    Merci ouiouioui pour tes remarques pertinentes

  10. #10
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    content de t'avoir aidé

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par ouiouioui Voir le message
    content de t'avoir aidé

    Tu es le bienvenu sur le forum Perl !

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 27
    Points : 28
    Points
    28
    Par défaut
    Excellent bout de script ! Un petit peu modifié pour mon problème et ça roule ! Merci

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2010
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup les gars,
    c'était exactement ce que je cherchais

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/09/2009, 11h23
  2. Delphi et inno setup
    Par drakes dans le forum Outils
    Réponses: 10
    Dernier message: 17/09/2004, 10h15
  3. [INNO SETUP][ORACLE] Installer le client Oracle avec Inno
    Par AnnSo dans le forum Bases de données
    Réponses: 11
    Dernier message: 19/08/2004, 16h21
  4. Bde Inno Setup et Test
    Par Fxg dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/07/2004, 14h35
  5. [jsp]popup confirmation de suppression
    Par alexandra_ape dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 05/07/2004, 16h57

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