Executer un fichier externe executable a partir du code C

bessem2012 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 9 mai 2005 - 2 mai 2005 à 12:17
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006 - 4 mai 2005 à 17:15
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

cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
2 mai 2005 à 12:54
ShellExecute()

Urgo
0
bessem2012 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 9 mai 2005
2 mai 2005 à 12:58
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
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
2 mai 2005 à 14:27
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.
0
bessem2012 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 9 mai 2005
2 mai 2005 à 16:03
Merci beaucoup
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 3
2 mai 2005 à 22:17
autre solution :
#include

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

LaPatoshe
0
bessem2012 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 9 mai 2005
3 mai 2005 à 10:33
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
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
3 mai 2005 à 15:25
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
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
3 mai 2005 à 18:11
Nono j'ai jamais dit le contraire. Le contenu des chaines reste à determiner par chacun.

Bon courage a tous
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
4 mai 2005 à 10:14
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...
0
bessem2012 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 9 mai 2005
4 mai 2005 à 10:54
C'est bien comme avantage mais je voie que cette méthode est plus difficile, et compliquée.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
4 mai 2005 à 11:27
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...
0
bessem2012 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 9 mai 2005
4 mai 2005 à 13:06
Merci pour ces informations, je vais essayer d'utiliser cette méthode, et si j'aurais des problèmes tu dois me renseigner
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
4 mai 2005 à 16:16
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
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
4 mai 2005 à 16:43
ç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...
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
4 mai 2005 à 17:15
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.
0
Rejoignez-nous