System() en hide [Résolu]

Signaler
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009
-
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009
-
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

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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);
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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.
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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 ?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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);
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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 ...
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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);
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

merci le CreateProcess marche :)
comment je peux faire en sorte que ca soit en mode hide stp ?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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);
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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 : /
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

merci beaucoup pour ton aide ca marche parfaitement :)