Admin Fondateur
Nombre de messages : 197 Age : 40 Localisation : Tlemcen ( Algérie ) Date d'inscription : 04/12/2006
| Sujet: Comment lancer et contrôler une application extérieure ? Ven 12 Jan - 6:14 | |
| Pour lancer une application tout en récupérant son handle de process, il faut utiliser la fonction API CreateProcess. Cette fonction permet d'exécuter une ligne de commande avec un grand nombre d'options. Elles ne seront pas décrites ici car ce n'est pas le but de cette QR. Cette fonction retourne aussi les handle des process et thread principaux de l'application lancée. Cette particularité va être utilisée pour garder un contrôle sur l'application.
La ligne de commande passée à CreateProcess ne doit pas contenir d'espace dans les noms de fichiers, ou alors il faut que les noms de fichiers soient entre " ". Par défaut il est donc conseillé de mettre les " " systématiquement pour limiter les erreurs. - Code:
-
[/center] procedure TForm1.Button2Click(Sender: TObject); Var StartInfo : TStartupInfo; ProcessInfo : TProcessInformation; Fin : Boolean; 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 } If CreateProcess(Nil, '"Notepad.exe"', 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; { C'est fini } ShowMessage('Terminé'); End Else RaiseLastOSError; End;[center] Ici l'exemple ne fait qu'attendre la fin de l'application, mais le handle retourné dans ProcessInfo.hProcess peut être utilisé dans toutes les fonctions API sur les process.
Pour lancer une application avec des paramètres, il faut les insérer dans la ligne de commande : - Code:
-
CreateProcess(Nil,'"Notepad.exe" "c:\temp\essai.txt"' , Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo) CreateProcess recherche l'exécutable dans le répertoire en cours puis les répertoires par défaut de Windows, mais il est possible de spécifier le répertoire : - Code:
-
CreateProcess(Nil, '"C:\MesProg\MonAppli.exe"' , Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo) | |
|