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

API, COM et SDKs Delphi Discussion :

ShellExecute et fin de procedure...


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Par défaut ShellExecute et fin de procedure...
    Bonjour,

    Voila un problème qui reviens souvent dans mes softs: je lance une succession de procedures mais il faut attendre la fin de l'action precedente pour poursuivre. Comment puis-je faire pour faire quelque chose de prope (mieux que sleep(30000) par exemple).

    Ce coup ci c'est avec le ShellExecute. La déclaration est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall;[
    Je ne trouve pas d'infos dans mon aide sur le HINST qui est à la fin (ni sur cette fonction d'ailleurs...): c'est utilisable pour faire ce que je veux?

    merci

  2. #2
    Membre chevronné
    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
    Par défaut
    Si tu cherches à lancer un processus et attendre la fin de son execution, il te faut passer par createProcess() au lieu de shellExecute(), tu trouveras un exemple dans la FAQ.
    Pour ce qui est du paramètres HINST de la fonction shellExecute(), tu trouveras sa signification dans le MSDN, regarde au paragraphe Return Value.

  3. #3
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Par défaut
    Regarde du côté de ShellExecuteEx et étudie la structure
    TShellExecuteInfo
    Perso, c'est ce que j'utilise...

    tu devrais avoir quelquechose qui ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Res := ShellExecuteEx(@SEInfo);  // Exec == OK si Res <> 0; sinon appeler GetLastError
        if Res then
        begin
            repeat
              GetExitCodeProcess( SEInfo.hProcess, ExitCode);
            until ( ExitCode <> STILL_ACTIVE);
          end;
        end;
    Cordialement

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Par défaut
    lil_jam63>

    Merci pour le HINST...

    Pour le shellExecute() je suis passer à coté en regardant la FAQ...
    Je tente un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateProcess(Nil, '"test2.LLX"', Nil, Nil, False, 0, Nil, Nil, StartInfo,ProcessInfo);
    à la place de mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0,'OPEN','test2.LLX', Nil, Nil, SW_SHOW);
    mais ca ne parche pas...itout pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateProcess('"test2.LLX"', Nil, Nil, Nil, False, 0, Nil, Nil, StartInfo,ProcessInfo);
    Comment ce faisse? (Les fichiers LLX sont lus par LapLink et permettent de faire une comparaison de deux fichiers distants et d'uploader la plus recente si necessaire...)


    Jean44>

    Merci mais c'est un peu obscure pour moi... Je regarderai si les idées précedentes ne fonctionnent pas


    Plus generalement>

    Peut on envoyer un boolean à la fin d'une procédure du genre:
    Procedure TForm1.Button1Click(Sender: TObject): boolean;
    C'est à dire que la procedure me renvoie FALSE ou TRUE (comme une fonction quoi...). un
    return FALSE;
    serai valable?

  5. #5
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Par défaut
    Peut on envoyer un boolean à la fin d'une procédure du genre:
    Citation:
    Procedure TForm1.Button1Click(Sender: TObject): boolean;
    Arggghhh... en Pascal une procedure ne renvoie rien, seule une fonction peut le faire.

    Quel test/traitement, suite au Click sur le bouton, veux-tu faire ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Par défaut
    Admettons que j'ai rien dis pour la procedure alors...

    En fait dans ce cas particulier:
    *Je met a jour un fichier TXT via l'appel de l'application exterieure *.LLX (temps d'execution tres variable)
    *Je réalise une relecture du fichier ainsi mis à jour (je pourrais jouer sur la date de modif du fichier mais j'aimerais une solution relativement generale, quand a chercher...)

    Dans le cas générale:
    J'utilise des applications externes que je ne maitrise pas (connextions internet par simulation d'appuis sur des touches, utilisation de fichiers LLX...). En gros je cherche à forcer un enchainement sequentiel et non plus à avoir un soft qui repond aux actions...

    Pour en revenir quand meme au truc du debut: je peut affecter une fonction à une action (genre Button1Click au hasard)?

  7. #7
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Salut!

    Lorsque j'ai la possibilité, je n'utilise qu'un seul ShellExecute avec un fichier BAT. Dans ce fichier de commande BAT se trouve la liste des programmes à lancer séquentiellement. C'est beaucoups plus simple et plus pratique à mettre en oeuvre, surtout qu'il est possible de modifier cette liste d'utilitaires sans avoir à recompiler le programme... De plus, il existe la variable ERRORLEVEL disponible dans un fichier de commande qui permet de savoir si le ou les programmes se sont éxécutés correctement... Ainsi, il est possible d'interrompre l'éxécution de la liste (par exemple) si un des programmes crée une erreur. Tu trouveras plus d'informations en faisant une recherche avec le mot clé "ERRORLEVEL"...

    Autrement, CreateProcess, ShellExecuteEx sont appropriés au problème car il retourne l'handle du programmme éxécuté et permettent de savoir lorsque celui-ci est terminé... Il existe un composant basé justement sur l'éxécution d'un fichier de commande BAT et permet de récupérer la sortie (ce qui s'affiche dans la console) -> DosCommand.

    Les sujets suivant devraient t'intérresser je pense :
    Capture des infos d'un programme DOS
    Récupérer la sortie d'un prog Dos
    Récupérer les sorties d'une application

    J'en profite aussi pour te donner les sources d'une démo que j'ai réalisé avec ShellExecute qui permet l'intégration d'un programme dans une fenêtre. En listant tout les processus avant et après l'éxécution, j'arrive à savoir l'handle du programme et par conséquent, je peux savoir lorsqu'il a terminé son éxécution ou bien décider de l'arrêter moi-même, etc...

    à+

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Par défaut
    Merci à tous!

    Le secret est donc dans le bat... Si on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateProcess(Nil, 'test1.LLX', Nil, Nil, False, 0, Nil, Nil, StartInfo,ProcessInfo);
    Ca ne marche pas mais si on crer un essay.bat dans lequel on met la ligne "test1.LLX" c'est bon.

    Donc voici le code qui permet de lancer une application externe et d'attendre la fin de son execussion pour poursuivre (c'est du réchauffé de plusieurs membre...) + (On peut le copier coller dans une fiche vide...):
    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
    procedure TForm1.FormCreate(Sender: TObject);
    Var  StartInfo   : TStartupInfo;
         ProcessInfo : TProcessInformation;
         Fin         : Boolean;
         F           : textFile;
    begin
      assignFile(F, 'essay.bat');
      rewrite(F);
      writeln(F, 'test1.LLX');
      CloseFile(F);
     showMessage('Fin creation .bat');
      // Mise à zéro de la structure StartInfo
      FillChar(StartInfo,SizeOf(StartInfo),#0);
      // Seule la taille est renseignée, toutes les autres options
      // laissées à zéro prendront les valeurs par défaut
      StartInfo.cb     := SizeOf(StartInfo);
      // Lancement de la ligne de commande
      CreateProcess(Nil, 'essay.bat', Nil, Nil, False, 0, Nil, Nil, StartInfo,ProcessInfo);
      Begin
        // L'application est bien lancée, on va en attendre la fin
        // ProcessInfo.hProcess contient le handle du process principal de l'application
        Fin:=False;
        Repeat
          // On attend la fin de l'application
          Case WaitForSingleObject(ProcessInfo.hProcess, 200)Of
            WAIT_OBJECT_0 :Fin:=True; // L'application est terminée, on sort
            WAIT_TIMEOUT  :;          // elle n'est pas terminée, on continue d'attendre
          End;
          // Mise à jour de la fenêtre pour que l'application ne paraisse pas bloquée.
          Application.ProcessMessages;
        Until Fin;
        // C'est fini
        ShowMessage('Terminé');
      End;
    End;

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Citation Envoyé par Sub0
    Ces sujets m'intéresse beaucoup moi aussi mais (surtout les deux derniers) mais les URL ne fonctionnent plus :-( (sujets effacés apparement).

    Auriez vous une piste pour moi qui souhaite récupérer la sortie console d'un programme Dos dans un fichier ?

    Edité : pour l'instant je vais m'orienté vers un .bat ayant une ligne comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    macommande > monfichier
    C'est du bricolage donc si vous avez mieux je suis preneur !

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Par défaut
    salut,

    Perso j'ai pas progersser depuis... c'est moche, mais ca marche pas mal

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Ok merci pour l'info :-)

  12. #12
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Salut!

    J'aurai dû sauver ces pages sur mon site, j'ai pas pensé...
    Néanmoins, je pense avoir retrouvé les articles manquants :

    http://nono40.developpez.com/sources/source0060/
    http://www.vmlinux.org/jakov/community.borland.com/10387.html
    http://www.geocities.com/alexfedorov/con_apps.htm

    à+

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

Discussions similaires

  1. Attendre la fin d'un Shellexecute
    Par rothuswarrior dans le forum C++
    Réponses: 1
    Dernier message: 24/01/2010, 19h00
  2. ShellExecute() Controler la fin d'exécution.
    Par Nicolas Coolman dans le forum Débuter
    Réponses: 6
    Dernier message: 19/06/2009, 11h28
  3. Réponses: 18
    Dernier message: 31/05/2008, 19h38
  4. ShellExecute n'attend pas la fin du process
    Par david11001 dans le forum C++
    Réponses: 2
    Dernier message: 22/09/2007, 12h02
  5. Réponses: 2
    Dernier message: 30/11/2006, 09h32

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