Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 avril 2009
-
10 juil. 2007 à 04:05
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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 ....
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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) ?
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.
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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 ?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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é).
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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.