System() en hide

Résolu
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009 - 10 juil. 2007 à 04:05
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009 - 13 juil. 2007 à 03:40
Bonjour,

Est-il possible de ne pas afficher la fenetre de commande lorsque l'on lance un programme externe avec system("prog.exe"); ? Comme si on faisait ShellExecute(NULL,NULL,"prog.exe",NULL,NULL,SW_HIDE);
J'ai un probleme avec ShellExecute et avec system y'a pas ce probleme alors je me rabat sur system ....

Merci

14 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 juil. 2007 à 12:56
Non, c'est moi qui ai codé comme un porc.

Ils tombent pas du chapeau ces membres :
STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

ZeroMemory(&siStartupInfo, sizeof(siStartupInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
siStartupInfo.wShowWindow = SW_HIDE;
CreateProcess(NULL, "connect.exe", NULL, NULL, FALSE, 0, NULL, NULL, &siStartupInfo, &piProcessInfo);
WaitForSingleObject(piProcessInfo.hProcess, INFINITE);
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 juil. 2007 à 05:24
Ben, j'ignore si c'est possible avec system mais si tu nous exposais ton problème avec ShellExecute, on serait peut-être en mesure de le régler.

C++ (@++)<!--
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
10 juil. 2007 à 05:42
En gros j'ai une interface avec gtk. Lorsque je clique sur un bouton, ca met la valeur contenu dans un gtk_entry dans un fichier puis ca lance un programme qui se sert de cette valeur. Avec system("prog"); ca marche bien : ca enregistre la valeur de l'entry dans le fichier puis ca lance le programme. En revanche avec ShellExecute, j'ai l'impression que ca lance d'abord le programme puis ca enregistre la valeur de l'entry dans le fichier ensuite meme si dans le code, on a bien d'abord l'enregistrement de la valeur dans le fichier et ensuite la commande ShellExecute.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 juil. 2007 à 05:47
Je ne suis pas sûr de bien comprendre.

Tu récupère une valeur que tu stock dans un fichier grâce à fwrite ou WriteFile ou peut-importe puis quand tu exécute ShellExecute, il ouvre le fichier sans prendre en compte les modifications c'est bien ça ?

Peux-tu me montrer ce bout de code (où tu enregistre puis tu exécute ShellExecute) ?

C++ (@++)<!--
0

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

Posez votre question
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
10 juil. 2007 à 06:48
ca donne ca :

void connect_com(){
FILE* fp;
const gchar* temp;

fp = fopen("com.txt","w");
if (fp){
temp = gtk_entry_get_text(GTK_ENTRY(entry1));
fprintf(fp,temp);
fclose(fp);
}

system("connect.exe");
//ShellExecute(NULL,NULL,"connect.exe",NULL,NULL,SW_HIDE);
}

la fonction connecte n'a aucun probleme car ca marche parfaitement avec system mais pas bien avec ShellExecute. En fait, si je met ShellExecute, je dois lancer deux fois la fonction connect_com pour que ca soit la bonne valeur.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
10 juil. 2007 à 10:39
Salut,

A la place de ShellExecute tu peux utiliser CreateProcess, avec le membre wShowWindow de STARTUPINFO à SW_HIDE.

Concernant ShellExecute, tu peux essayer de passer "open" en deuxième paramètre, même si ça devrait le prendre comme tu met NULL.
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
10 juil. 2007 à 10:51
euh elle m'a l'air bien complexe cette fonction :D

j'ai essaye CreateProcess(NULL, "connect.exe", NULL, NULL, FALSE, 0, NULL, NULL, SW_HIDE, &pi); mais pour le dernier paramatre je ne sais pas trop quoi mettre .....

sinon le 4e parametre c'est LPSECURITY_ATTRIBUTES lpThreadAttributes est-ce ca a un rapport avec les thread cad que ca lance le programme externe en parallele a une GUI par exemple ?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
10 juil. 2007 à 11:52
Pour le dernier, c'est plutôt normal que tu ne sache pas quoi mettre : c'est un paramètre de sortie. Il faut juste que tu lui passe l'adresse d'une structure PROCESS_INFORMATION non initialisée.

Par contre, ton avant dernier paramètre n'est pas bon : il faut passer une STARTUPINFO, et initialisée elle.

Pour LPSECURITY_ATTRIBUTES, il s'agit des droits du thread ce qu'il a le droit de faire et pas faire (Lire tel fichier, modifier tel clé...)

Le processus est lancé en parallèle normalement... En tout cas dans le cas ou le lanceur est une GUI (On utilise WaitForSingleObject quand on souhaite attendre la fin d'un processus qu'on a lancé).

STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

memset(&siStartupInfo, 0, sizeof(siStartupInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
CreateProcess(NULL, "connect.exe", NULL, NULL, FALSE, 0, NULL, NULL, &siStartupInfo, &piProcessInfo);
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
11 juil. 2007 à 04:11
en fait j'ai vu le probleme avec ShellExecute ou CreateProcess je pense:

quand on a une fonction type :

void funct(){

instruction1();
system(); / ShellExecute(); / CreateProcess();
instruction2();
}

si on utilise system, ca execute l'instruction1, lance le prog externe avec system puis execute l'instruction2.

pour ShecllExecute ou CreateProcess, j'ai l'impression que ca exucute l'instruction1 puis execute l'instruction2 et enfin lance le programme externe.

c'est peut-etre du au fait que j'ai pas mis les bons parametres pour les fonctions ShellExecute ou CreateProcess ...
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
11 juil. 2007 à 08:49
Le truc, c'est que shellExecute ou CreateProcess n'attendent pas que le programme que tu lances soit terminer pour rendre la main au créateur, qui fort logiquement passe à l'instruction suivante.

Pour attendre que le programme lancé soit terminé, on utilise WaitForSingleObject.

STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

ZeroMemory(&siStartupInfo, sizeof(siStartupInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
CreateProcess(NULL, "connect.exe", NULL, NULL, FALSE, 0, NULL, NULL, &siStartupInfo, &piProcessInfo);
WaitForSingleObject(piProcessInfo.hProcess, INFINITE);
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
12 juil. 2007 à 05:08
merci le CreateProcess marche :)
comment je peux faire en sorte que ca soit en mode hide stp ?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 juil. 2007 à 10:44
C'est fort simple : tu aurais pu trouver tout seul.
On se dit que l'on veut que la fenêtre ne s'affiche pas. On regarde les arguments de CreateProcess et on s'aperçoit que la structure STARTUPINFO contient des options pour l'affichage de la fenêtre. On remarque que la structure possède un membre wShowWindow qui prend un style de fenêtre, eux même détaillés ici. On va donc mettre le wShowWindow à SW_HIDE. Mais il ne faut pas faire que ça : il est précisé dans l'aide qu'il faut que mettre en place STARTF_USESHOWWINDOW dans le dwFlags de notre structure.

Donc finalement (Non testé) :

STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

ZeroMemory(&siStartupInfo, sizeof(siStartupInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
dwFlags = STARTF_USESHOWWINDOW;
wShowWindow = SW_HIDE;
CreateProcess(NULL, "connect.exe", NULL, NULL, FALSE, 0, NULL, NULL, &siStartupInfo, &piProcessInfo);
WaitForSingleObject(piProcessInfo.hProcess, INFINITE);
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
12 juil. 2007 à 11:39
hmmm c'est pas si simple que ca :D
sinon lors de la compilation le compilateur indique :

'dwFlags' undeclared (first use in this function)
'wShowWindow' undeclared (first use in this function)

je penses que j'ai pas du ajouter assez de librairies au debut : /
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
13 juil. 2007 à 03:40
merci beaucoup pour ton aide ca marche parfaitement :)
0
Rejoignez-nous