Executer un fichier externe executable a partir du code C

Signaler
Messages postés
10
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
9 mai 2005
-
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006
-
Bonjour
je veux bien executer un fichier executable .exe à partir du code c et c++ (je travaille mnt sur C++ builder)
Je veux savoir qu'elle est la commande qui me permet de faire ça
merci

15 réponses

Messages postés
780
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 avril 2009
1
ShellExecute()

Urgo
Messages postés
10
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
9 mai 2005

Merci!
j'ai un autre probleme!
Comment utiliser cette commande si j'ai des argument en plus!
par exp, je veux executer "file.exe -e input.inp"
telque input.inp existe dans un champ text Edit
Merci
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

Bonjour,
on fait comme ca :

char argument [256] , argument_1 [256], argument_2[256];
strcpy (argument_1, "chaine"); strcpy (argument_2, "le_reste");
strcpy (argument, argument_1);
strcat (argument, argument_2);
shellExecute ( NULL, "open", lpFile, argument, lpDirectory, lpDirectory);

Il suffit d'adapter.

Bon courage.
Messages postés
10
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
9 mai 2005

Merci beaucoup
Messages postés
196
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
1 mai 2009
2
autre solution :
#include

int main()
{
system ("commande que tu veux lancer");
return 0;
}

LaPatoshe
Messages postés
10
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
9 mai 2005

Pour la solution de Shellexecute, elle est trés bien!
Mais pour System, elle n'est pas pratique pour mon cas, car elle ouvre une fenêtre MSDOS, et elle reste ouverte tant que l'application n'est pas terminée
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
Oui : utilise shellExecute

yserver> il faudrait insérer un espace entre les 2 argu ou il risque d'
avoir des effets amusants

avec les Bxxx, le mm code donnerai

BString cde="c:\chemin\nomExe.exe";
BLBString argument;
argument+="premierArgu";
argument+=3;
argument+=2.3;
argument+="avantDernierArgu";
argument+=unBooleen;
BVisuel::afficheErreurShellExecute(shellExecute ( NULL, "open", cde, argument.toString(" ","","",""), lpDirectory, lpDirectory));

voilà et en prime, on met des argu de tt type et on a un rapport d'erreur éventuel

Bonne Prog
___________________________________________________________
Magicalement
Nono
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

Nono j'ai jamais dit le contraire. Le contenu des chaines reste à determiner par chacun.

Bon courage a tous
Messages postés
15108
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 juillet 2021
97
Salut!

On peut se le faire comme ça aussi:


// Prepare the external script execution via a process


CString _CommandLine = CString("C:\\truc.bat arg1 arg2");


STARTUPINFO _SI;


PROCESS_INFORMATION _PI;


// Connect standard handles


ZeroMemory(&_SI,sizeof(STARTUPINFO));


_SI.cb=sizeof(STARTUPINFO);


_SI.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;


_SI.wShowWindow=SW_HIDE;


_SI.dwFlags=STARTF_USESTDHANDLES;


_SI.hStdInput=NULL;


_SI.hStdOutput=NULL;


_SI.hStdError=NULL;


// Create process and wait for achievement


CreateProcess(NULL, (LPTSTR)_CommandLine.GetString(), NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &_SI, &_PI);


DWORD _Result = WaitForSingleObject(_PI.hThread, INFINITE);

// ...

L'avantage (contrairement à ShellExecute) c'est qu'une fois sorti de là, on sait que le process est terminé.

Buno
----------------------------------------
L'urgent est fait, l'impossible reste à faire. Pour les miracles, prévoir un délai...
Messages postés
10
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
9 mai 2005

C'est bien comme avantage mais je voie que cette méthode est plus difficile, et compliquée.
Messages postés
15108
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 juillet 2021
97
Je te l'ai donné dans sa version la plus "simple"

En fait, t'as besoin de 2 structures:
- STARTUPINFO dans laquelle tu lui spécifies tes "options d'exécution" (Show Window et Standard Handles ici). Dans cet exemple, j'ai demandé à ne pas voir la fenêtre de commande Windows (_SI.wShowWindow=SW_HIDE) et à utiliser les E/S standards (NULL par défaut donc)
- PROCESS_INFORMATION qui sert à retourner les informations du déroulement du process externe, notamment à savoir si le process s'est terminé corectement.

En théorie, t'as juste à faire un "Copier/Coller" de cette portion de code et à changer la string _CommandLine pour ton cas.

L'avantage est non négligeable si, par exemple, ton process externe crée des fichiers que tu dois utiliser par la suite: avec le "WaitForSingleObjet" tu sais qu'ils sont crées.

A toi de voir

Buno
----------------------------------------
L'urgent est fait, l'impossible reste à faire. Pour les miracles, prévoir un délai...
Messages postés
10
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
9 mai 2005

Merci pour ces informations, je vais essayer d'utiliser cette méthode, et si j'aurais des problèmes tu dois me renseigner
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
OK....



merci pr cette contrib Bruno , mais à quoi sert alors de créer un
processus si tu attends de toute façon la fin de son exécution?



___________________________________________________________
Magicalement
Nono
Messages postés
15108
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 juillet 2021
97
ça sert à être sûr que, si tu as besoin du resultat de cette manip externe, ce résultat est valide. Un exemple concret: Je dois filtrer une video avec VirtualDub pour ensuite travailler dessus. En sortant du shellExecute, la video resultat n'existe pas encore, vu que VDub n'a pas terminé son boulot. Plantage donc à l'accès à ce fichier. Avec un process, plus de problème de ce genre...

@+

Buno
----------------------------------------
L'urgent est fait, l'impossible reste à faire. Pour les miracles, prévoir un délai...
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

Buno utiliser ShellExecutEx me semble bien plus simple. Cela te permettra d'attendre que le process lance soit fini par exemple pour passé à la suite. Cela te permet de garder un certain control sur le process lancé par ShellExecutEx.
Je crois pas être très clair, mais cela semble correspondre a ce que fait ton code en plus simple. Plus d'info sur MSDN

Bon courrage.