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

Langage Delphi Discussion :

Comment mettre à jour un exécutable ?


Sujet :

Langage Delphi

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut Comment mettre à jour un exécutable ?
    salut tout le monde

    petite question a laquelle je n ai pas trouvé de réponse.
    J'ai une application que je veux remettre automatiquement a jour de temps en temps. La partie détection d'un mise a jour et téléchargement de la nouvelle version est deja faite.

    Je voudrais savoir selon vous quel est la meilleur méthode.
    Est ce qu'il est possible de remplacer l exe en cours d execution grace a une astuce sans qu'on passe par un programme extérieur. Ou y a t il une autre technique ?


    MErci à tous d avance

  2. #2
    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
    A mon avis la meilleure idée est de créer tes mises à jours avec un programmation d'instal (par exemple InnoSetup). Ensuite après avoir télécharger le prog d'instal, tu le lance (éventuellement en mode silent) et tu quitte immédiatement après ton prog. Il suffit de faire en sorte que l'instal relance automatiquement le programme mis à jour et c'est gagné. Ca me semble être la meilleure solution.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    ah moi je voulais pas passer par un prog d install ,si cela été possible

  4. #4
    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
    Tu devras au moins utiliser un prog externe, car tu ne peux pas modifier un fichier .exe dont au moins une instance est lancée (je ne sais pas pourquoi d'ailleurs, sans doute parce qu'il continue de lire dans l'exe pendant l'exécution).
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Inactif  

    Inscrit en
    Juillet 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 46
    Points : 135
    Points
    135
    Par défaut EXE
    on ne peut pas le modifier car l'integralité du fichier n'est jamais en memoire: penses par exemple aux ressources que tu charges puis libère. Il est normal de pas pouvoir y toucher.
    John

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    j'ai eu besoin la semaine dernière d'un programme qui s'effaçait, et j'ai trouvé ce code ici meme,
    http://www.developpez.net/forums/viewtopic.php?t=4316

    je le trouve très astucieux

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par totolala
    j'ai eu besoin la semaine dernière d'un programme qui s'effaçait, et j'ai trouvé ce code ici meme,
    http://www.developpez.net/forums/viewtopic.php?t=4316

    je le trouve très astucieux
    vraiment excellent.

    information tres utile (à mettre dans la faq? quelqu'un? )

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    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
    La technique est effectivement intéressante, mais ça n'empêche pas que tant qu'il y a au moins une instance de l'exécutable active, tu ne peux pas l'effacer du disque dur. Et un batch est malgré tout un programme extérieur... ;-)

    De plus, le process de suppression en tâche de fond n'est pas totalement fiable : perso, je me sers de ce type de faille pour "casser" des WebInstalls (fichiers setup uniques, souvent énormes) en un répertoire d'installation avec plusieurs fichiers : ça permet de mettre le setup sur un disque réseau sans (trop) saturer le réseau à l'exécution.

    Ma solution "idéale" pour ce genre de choses est le compagnon : un petit programme annexe (pouvant même être mis en tant que ressource du premier programme) qui est lancé par ton exécutable principal (ensuite, ce dernier se termine normalement). Le compagnon, qui peut connaître le PID du programme via sa ligne de commande, va attendre que le principal soit fermé. En cas d'attente trop longue, il flingue le processus via l'API Windows. Il n'a plus qu'à copier la mise à jour en lieu et place de l'ancienne version, la relancer, et terminer sa propre exécution. Une fois le principal relancé, il peut également attendre (toujours via PID) la fermeture "propre" du compagnon, le flinguer si c'est trop long et surtout, effacer l'exécutable du compagnon du disque dur. En cas de programmes séparés, le principal peut mettre à jour le compagnon avant de l'exécuter, si c'est nécessaire. Tu peux protéger des exécutions concurrentes grâce à des mutex nommés, pour éviter une double mise à jour qui serait dangereuse.

    Une alternative répondant à ton problème initial est de "greffer" le compagnon comme étant le début du programme...
    Tu vas avoir les deux copies simultanément : par exemple, "prog.exe" et "new.exe" (le nom de la "nouvelle" version étant toujours le même).
    Au démarrage, tu vérifie si une nouvelle version existe. Si oui :
    - Tu lances "new.exe" comme un compagnon.
    - "new.exe" va attendre la fin de "prog.exe" (via PID si nécessaire).
    - Une fois la copie originale terminée, "new.exe" va pouvoir se copier lui-même et écraser "prog.exe" sans conflits (normal).
    - "new.exe" n'a plus qu'à relancer "prog.exe" et se terminer.
    - "prog.exe" va attendre la fin de "new.exe", puis effacer "new.exe" du dur.

    N'oublie pas de passer les PID aux programmes si tu veux pouvoir attendre proprement, et de conserver la mémoire de la ligne de commande originale si ton programme en utilise. Tu peux distinguer la copie de l'original grâce à "Application.ExeName".

    Bref, c'est la même technique que le compagnon, mais avec deux instances de ton programme. L'inconvénient est que si ton exécutable est très volumineux, la mise à jour peut demander pas mal d'espace disque...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Passe par l'intermédiaire d'un batch que tu crées à la volée.
    Explications:
    - tu verifie si une MAJ est disponible
    - tu la telecharge
    - a la fin du telechargement tu crée un batch
    - tu le lance et tu quitte l'application
    - le batch va supprimé l'ancien executable pour le remplacer par le nouveau, de même pour les autres fichiers
    - il lance le nouvel executable
    - et enfin il s'autodetruit
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  10. #10
    Inactif  

    Inscrit en
    Juillet 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 46
    Points : 135
    Points
    135
    Par défaut Optimisation
    Une autre version

    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
     
    function create_file(name_fic_bat, name_fic_a_supprimer : string) : boolean ;
    VAR
        fichier : TextFile ;
    begin
      result := false ;
      AssignFile(fichier, name_fic_bat) ;
      Rewrite(fichier) ;
      writeln(fichier, '@echo off') ;
      writeln(fichier, ':Suppression') ;
      writeln(fichier, 'del "' + ExtractShortPathName(name_fic_a_supprimer) + '"') ;
      writeln(fichier, 'if exist "' + ExtractShortPathName(name_fic_a_supprimer) +
      '" goto Suppression') ;
      writeln(fichier, 'del "' + ExtractShortPathName(name_fic_bat) + '"') ;
      closeFile(fichier) ;                    //on oublie pas de fermer le fichier après                                         //création
      result := true ;
    end;
    procedure Detruit;
    VAR
        name_fic_bat, name_fic_a_supprimer : string ;
        Handle:THandle;
    begin
      name_fic_bat := GetTempDossier + '1.bat' ;
      name_fic_a_supprimer := 'Final.exe' ;
      if create_file(name_fic_bat, name_fic_a_supprimer)then
        ShellExecute(handle, 'open', PChar(name_fic_bat), nil, nil, SW_HIDE) ;
    end;ne autre version

    John

  11. #11
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    ok merci à tous bon je pense que je vais prendre la solution de mac lak, que je trouve un bon compromis.

    Merci à tous

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

Discussions similaires

  1. [Conception] Comment mettre à jour le champ "ID"
    Par WeDgEMasTeR dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 29/01/2006, 02h36
  2. [ADO.NET][VB.NET]Comment mettre à jour BDD avec DataSet?
    Par fuhraih dans le forum Accès aux données
    Réponses: 1
    Dernier message: 17/01/2006, 16h35
  3. Comment mettre à jour le CD de Delphi 6 ?
    Par Hell dans le forum EDI
    Réponses: 1
    Dernier message: 01/08/2005, 16h39
  4. [Rave Report] Comment mettre à jour le produit
    Par Leesox dans le forum Rave
    Réponses: 2
    Dernier message: 11/04/2005, 21h00
  5. Comment mettre à jour une ligne sans doublon via déclencheur
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 15h56

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