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 :

Attendre la fin d’exécution d'un programme externe


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 46
    Points : 28
    Points
    28
    Par défaut Attendre la fin d’exécution d'un programme externe
    bonjour,

    j'ai une suite d'instruction delphi dans laquelle je fais appel à un programme externe, et je voulais que la suite des instructions apres l'appel a ce programme attend son achevement.

    j'ai trouvé pas mal de fonction sur le net, mais ca fonctionne pas avec mois.

    SOS SVP.

  2. #2
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Comme sais tu si le programme externe a terminé ? Un fichier témoin ? Un processus qui s'arrête ?

    Utilise les Tasks (Thread) pour attendre le retour.

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 658
    Points : 3 599
    Points
    3 599
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    Si c'est dans une application VCL, il faut regarder du côté de CreateProcess et WaitForSingleObject. Il y a un exemple dans la FAQ Delphi : https://delphi.developpez.com/faq/?p...ion-exterieure

    Sous Firemonkey, il va falloir conditionner le code et trouver les fonctions de l'API en fonction de l'OS ciblé.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 46
    Points : 28
    Points
    28
    Par défaut
    merci pour vos réponses,

    j'ai essayé avec le code du forum, mais un message d'erreur concernant Kernel32.dll s'affiche à chaque fois (violation d’accès à l'adresse xxxx dans le module kernel32.dll

    Merci.

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 339
    Points : 3 107
    Points
    3 107
    Par défaut
    Bonjour,

    chez moi en W10 64 bits avec D7, le code de la FAQ fonctionne parfaitement.

    Ton erreur doit venir d'autre chose ?

    Il faudrait que tu montre ton code pour que quelqu'un puisse t'aider.

    A+
    Charly

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Est-ce bien ce code de la FAQ qui fonctionne chez l'un et pas chez l'autre ?
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 339
    Points : 3 107
    Points
    3 107
    Par défaut
    Oui, c'est bien ce code qui fonctionne chez moi (c'est le même que celui donné par gbegreg)

    A+
    Charly

  8. #8
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 658
    Points : 3 599
    Points
    3 599
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Le code fourni dans la FAQ fonctionnait bien chez moi depuis longtemps (différentes versions de Windows et de Delphi). Je viens d'essayer sur Delphi Berlin update 2 sous Windows 10 Anniversary et là j'ai l'erreur "kernelbase.dll"...
    Je n'ai pas le temps d'investiguer plus loin, je regarderai ce soir.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 339
    Points : 3 107
    Points
    3 107
    Par défaut
    Effectivement, avec D7 pas de problème, mais j'ai testé avec Berlin 10.1 Starter et il y a bien une erreur (Acess violation)

    A+
    Charly

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 339
    Points : 3 107
    Points
    3 107
    Par défaut
    Sous Berlin 10.1, ça "tilte" sur l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If CreateProcess(Nil, '"Notepad.exe"', Nil, Nil, False,
    0, Nil, Nil, StartInfo,ProcessInfo) Then
    C'est une erreur en écriture, mais je ne sais pas pourquoi.

    A+
    Charly

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    La description du problème se trouve dans l'aide de CreateProcess

    La version Unicode de CreateProcess est susceptible de modifier lpCommandLine. Ce paramètre ne peut donc pas être une constante. La FAQ était correct en ANSI mais plus en Unicode.

    EDIT:
    Il manque aussi la libération des handles dans cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);

  12. #12
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    La description du problème se trouve dans l'aide de CreateProcess

    La version Unicode de CreateProcess est susceptible de modifier lpCommandLine. Ce paramètre ne peut donc pas être une constante. La FAQ était correct en ANSI mais plus en Unicode.
    Mais alors quelle est la modification à faire ? Parce que ceci ne semble pas fonctionner non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ...
      CommandLine: string;
    begin
      ...
      CommandLine := '"Notepad.exe"';
      if CreateProcess(
        Nil,
        //'"Notepad.exe"',
        PChar(CommandLine),
    Citation Envoyé par Andnotor Voir le message
    Il manque aussi la libération des handles dans cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    Bien vu.

    Je me charge de corriger la FAQ dès que je saurai comment régler le problème évoqué plus haut.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Mais alors quelle est la modification à faire ? Parce que ceci ne semble pas fonctionner non plus
    Les double-guillemets ne font pas partie de la variable mais semblent obligatoires (au moins ... le premier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateProcess(nil, PChar('"' +FileName +'"'), nil, nil, FALSE, 0, nil, nil, StartupInfo, ProcessInfo);
    J'admets que c'est parfaitement incompréhensible

    Sinon on peut également passer par ShellExecuteEx en spécifiant SEE_MASK_NOCLOSEPROCESS.

    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
    function RunAndWait(aApp :string; aParams :string = ''; aVerb :string = 'open'; aShow :integer = SW_SHOWNORMAL) :boolean;
    var
      Info: TShellExecuteInfo;
     
    begin
      FillChar(Info, SizeOf(Info), 0) ;
      Info.cbSize       := SizeOf(TShellExecuteInfo);
      Info.fMask        := SEE_MASK_NOCLOSEPROCESS;
      Info.lpFile       := PChar(aApp);
      Info.lpParameters := PChar(aParams);
      Info.lpVerb       := PChar(aVerb);
      Info.nShow        := aShow;
     
      Result := ShellExecuteEx(@Info);
     
      if Result then
      begin
        WaitForSingleObject(Info.hProcess, INFINITE);
        CloseHandle(Info.hProcess);
      end;
    end;

  14. #14
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 339
    Points : 3 107
    Points
    3 107
    Par défaut
    Bonjour,
    sinon on peut utiliser PChar(WideString(commandLine)) avec commandLine de type String. Chez moi cela fonctionne avec Berlin 10.1 Starter

    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
    procedure TForm1.Button1Click(Sender: TObject);
    Var  StartInfo     : TStartupInfo;
        ProcessInfo    : TProcessInformation;
        Fin            : Boolean;
        CommandLine    : String ;
    begin
      { 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 }
      CommandLine :=  'C:\Windows\Notepad.exe' ;
      If CreateProcess(Nil, PChar(WideString(commandLine)), Nil, Nil, False,
    0, Nil, Nil, StartInfo,ProcessInfo) Then
      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;
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);
        { C'est fini }
        ShowMessage('Terminé');
      End
      Else RaiseLastOSError;
    End;

  15. #15
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Les double-guillemets ne font pas partie de la variable mais semblent obligatoires (au moins ... le premier)
    D'accord. Donc on pourrait ajouter à la fin de la QR le texte suivant ?

    Pour les versions de Delphi égales ou postérieures à Delphi XE, il n'est plus permis d'utiliser des chaînes littérales. Il faut utiliser une ou des variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      ...
      Executable: string;
    begin
      ...
      { Lancement de la ligne de commande }
      Executable := 'Notepad.exe';
      if CreateProcess(
        Nil,
        PChar('"' + Executable + '"'),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      ...
      Executable: string;
      Parametres: string;
    begin
      ...
      { Lancement de la ligne de commande }
      Executable := 'Notepad.exe';
      Parametres := 'C:\Temp\Essai.txt';
      if CreateProcess(
        Nil,
        PChar('"' + Executable + '" "' + Parametres + '"'),
    Citation Envoyé par Charly910 Voir le message
    sinon on peut utiliser PChar(WideString(commandLine)) avec commandLine de type String. Chez moi cela fonctionne avec Berlin 10.1 Starter
    Si j'ai bien compris, ce sont les guillemets qui posent problème, et non pas le type de chaîne, qui est déjà WideString implicitement.

    Citation Envoyé par Andnotor Voir le message
    Sinon on peut également passer par ShellExecuteEx en spécifiant SEE_MASK_NOCLOSEPROCESS.
    Vu.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  16. #16
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Etonnant !

    Je teste le code de la FAQ actuelle sous Windows 7 64 bits et avec RAD Studio 10.1 Berlin Starter ; voici le chemin de mon bloc-notes : 'c:\windows\system32\notepad.exe'.

    Si je l'écris en dur dans une variable de type PWideChar, ça fonctionne si je la mets en 1er paramètre (ApplicationName), mais pas en 2ème (CommandLine) : VA !

    Si je construis à partir du chemin GetSystemDirectory() et du nom 'notepad.exe' une variable de type PWideChar passée en 1er ou 2ème paramètre (CommandLine), là ça fonctionne dans les deux cas ! Mais, bien sûr, le chemin obtenu est le même que celui que je passais sans succès en dur...

    Bien sûr, l'aide du msdn nous dit que le chemin de recherche inclut notamment le répertoire System32 ; mais en ne fournissant que le nom de l'exécutable dans une variable de type PWideChar :
    - en premier paramètre, il ne trouve pas le fichier* (ou signale une syntaxe incorrecte du nom de fichier si entre guillemets) ! * normal : la recherche ne se fait que dans le répertoire courant
    - en deuxième paramètre (là, il cherche un chemin), cela entraîne une VA, guillemets ou pas...

    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  17. #17
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 339
    Points : 3 107
    Points
    3 107
    Par défaut
    @ Roland : pour les guillemets, je ne sais pas. Il en faut peut être si CommandLine comporte un ou plusieurs espaces ? je vais tester

  18. #18
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 339
    Points : 3 107
    Points
    3 107
    Par défaut
    Mon code fonctionne aussi avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      CommandLine := 'C:\_Rep Rep Rep\coc cinelle.exe' ;
    ou "Coc cinelle.exe" est un petit programme à moi dans le nom duquel j'ai inséré un espace

  19. #19
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Mon code fonctionne aussi avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      CommandLine := 'C:\_Rep Rep Rep\coc cinelle.exe' ;
    ou "Coc cinelle.exe" est un petit programme à moi dans le nom duquel j'ai inséré un espace
    Effectivement, d'après la page de documentation déjà citée, le système essaie d'interpréter les chaînes avec espace(s) de différentes façons :

    The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space–delimited token in the lpCommandLine string. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise, the file name is ambiguous. For example, consider the string "c:\program files\sub dir\program name". This string can be interpreted in a number of ways. The system tries to interpret the possibilities in the following order:

    c:\program.exe files\sub dir\program name
    c:\program files\sub.exe dir\program name
    c:\program files\sub dir\program.exe name
    c:\program files\sub dir\program name.exe
    Bref, tant qu'il n'y a pas un programme C:\_Rep.exe ou C:\_Rep Rep Rep\coc.exe, tout va bien.

    Autrement, l'ajout que j'ai proposé de faire à la QR a-t-il votre approbation ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  20. #20
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    D'accord. Donc on pourrait ajouter à la fin de la QR le texte suivant ?

    Pour les versions de Delphi égales ou postérieures à Delphi XE, il n'est plus permis d'utiliser des chaînes littérales.
    Non, il faut juste parler d'Unicode. Rien n'interdit d'appeler CreateProcessW depuis une version non Unicode (< D2009).

    Citation Envoyé par Charly910 Voir le message
    sinon on peut utiliser PChar(WideString(commandLine)) avec commandLine de type String. Chez moi cela fonctionne avec Berlin 10.1 Starter
    Bien vu
    Dès lors que lpCommandLine est un paramètre IN/OUT, son type doit correspondre au prototype CreateProcess, donc WideString.
    En effet, que se passe-t-il lorsque kernel32.dll modifie cette chaîne Delphi-like ? Côté app Delphi, elle devrait être dédoublée, son compteur d'utilisation remis à 1, etc. mais puisque 1) exe et DLL ne partagent pas le même gestionnaire de mémoire (pas de ShareMem) et 2) kernel32.dll ne gère pas les UnicodeString, Boum !!


    J'en profiterais pour simplifier cette boucle que je trouve un peu lourde.

    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
    procedure TForm1.Button2Click(Sender: TObject); 
    var
      StartupInfo :TStartupInfo;
      ProcessInfo :TProcessInformation;
      FileName    :{$IFDEF UNICODE}WideString{$ELSE}string{$ENDIF};
     
    begin
      FileName := '"Notepad.exe"';
     
      ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
      StartupInfo.cb := SizeOf(StartupInfo);
     
      if CreateProcess(nil, PChar(FileName), nil, nil, FALSE, 0, nil, nil, StartupInfo, ProcessInfo) then
      begin
        repeat
          Application.ProcessMessages;
        until WaitForSingleObject(ProcessInfo.hProcess, 200) <> WAIT_TIMEOUT;
     
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);
     
        ShowMessage('Terminé');
      end
      else RaiseLastOSError;
    end;
    A voir aussi au niveau des commentaires, cette phrase ne veut pas dire grand chose "ProcessInfo.hProcess contient le handle du process principal de l'application". Il y a plusieurs modules (exe + dll) mais qu'un seul processus

Discussions similaires

  1. Attendre la fin d'un script externe avant de continuer le script python
    Par Mistervanhalen dans le forum Général Python
    Réponses: 1
    Dernier message: 18/03/2009, 17h05
  2. Réponses: 7
    Dernier message: 18/07/2007, 17h40
  3. Réponses: 4
    Dernier message: 08/06/2007, 16h36
  4. Attendre la fin d'un programme..
    Par Flow_75 dans le forum C++
    Réponses: 3
    Dernier message: 09/12/2006, 13h17
  5. [VB.net] Comment attendre la fin d'un programme ?
    Par nakata77 dans le forum VB.NET
    Réponses: 2
    Dernier message: 14/09/2006, 18h16

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