je voudrais que cette procédure éxécute un fichier batch et attende la fin de son exécution, ainsi que l'on puisse préciser à travers la propriété visible si sa fenêtre est visible ou non.
sisi231
Messages postés207Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention29 mars 20135 9 janv. 2008 à 17:19
Ca y est j'ai ma fonction complète, testée peut-être améliorable mais fonctionnelle c'est déjà ça !
function LanceBatchAttenteFin(NomFichier:string;visible:boolean):boolean;
{permet de lancer un batch. NomFichier est le nom avec chemin }
{de ce batch ou d'un raccourci qui pointe vers cet exécutable. }
{ notre programme est arrété tant que l'exécutable n'est pas fini }
{tout est arrété on ne peut donc même plus déplacer sa fenêtre. }
{mettre visible à false pour cacher la fenêtre du batch}
{ il est donc préférable de la rendre invisible avant le lancement }
{de cette fonction. }
{ LanceAppliAttenteFin renvoie true si le lancement s'est bien passé }
var
StartInfo : TStartupInfo;
ProcessInformation : TProcessInformation;
i:integer;
begin
if visible then
i:=0
else
i:=CREATE_NO_WINDOW;
result:=true;
ZeroMemory(@StartInfo, sizeof(StartInfo)); // remplie de 0 StartInfo
StartInfo.cb:=sizeof(StartInfo);
if CreateProcess(nil,PChar(NomFichier),nil,nil,true,i,nil,nil,
StartInfo,ProcessInformation)
then WaitForSingleObject(ProcessInformation.hProcess, INFINITE)// attend que l'application désignée par le handle ProcessInformation.hProcess soit terminée
else result:=false;
end;
sisi231
Messages postés207Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention29 mars 20135 9 janv. 2008 à 14:47
Cela permet de lancer des commandes depuis CMD et non de lancer des BATCH !
Je ne veux pas les ouvrir avec Shellexecute car cela n'attend pas la fin de l'exécution des Batch, ça doit être un truc avec CreateProcess mais je ne sais pas avec quel programme s'ouvrent les programmes BATCH !...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 9 janv. 2008 à 15:08
Non regarde bien la source elle fait exactement ce que tu demandes
tu peux :
Lancer n'importe quel fichier (Batch y compris)
en attendre la fin ou non et voir la fenêtre dos ou non
en suite tu peux aussi par cette méthode utiliser des fichiers .CMD à la place de .BAT
Les Fichiers .CMD étant des .BAT plus évolués ... donc plus de possibilités et flexibilités (Ex Ajouter/Modifier/Supprimer une entré dans le registre)
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 9 janv. 2008 à 15:34
Bon juste avant de me lancer dans testes une petite question :
ça ne serait pas une erreur ça :
C:/Program Files/Program'Action/SmartCopy/Commandes.bat
ça ne serait pas :
C:/Program Files/Program/Action/SmartCopy/Commandes.bat
sisi231
Messages postés207Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention29 mars 20135 9 janv. 2008 à 16:49
Le problème est que la console ne se ferme pas à la fin du batch (comme avant avec ShellExecute(0, 'open', pchar(bat_file) ,
nil, Nil ,
SW_SHOW);) et que si l'on exécute :
Fini s'affiche avant la fin du batch donc ce que j'ai demandé n'a pas été résolu !
Je veux ce que l'on appelle une instruction synchronous pour employer le terme comme dans PlaySound.
Je pense qu'on doit passer par CreateProcess en lançant le programme qui ouvre le bat et attendre sa fermeture avec WaitForSingleObject, mais deux problèmes :
- je ne sais pas quel est le programme qui ouvre un fichier BAT
- je ne sais pas comment passer un paramètre au programme dans la procédure connue : LanceAppliAttenteFin dont le code est à l'adresse :