OVH Cloud OVH Cloud

Lancer une application

8 réponses
Avatar
Sty
Bonsoir,

Je fais un outil en C, et j'ai besoin dans celui-ci, de lancer un script
python (c'est un panneau d'administration avec pyGTK). J'essaye
d'utiliser system() et ShellExecute() en spéciant la ligne de commande:
"c:/XXX/python.exe pannel.py", mais j'ai l'impression qu'il ne me prend
pas en compte mon argument indiquant le script à lancer.

Comment faut-il s'y prendre svp ?

8 réponses

Avatar
Arnold McDonald \(AMcD\)
Sty wrote:

Comment faut-il s'y prendre svp ?



Il faut s'y prendre en lisant la doc de ShellExecute(). Les paramètres de
commande sont à passer en 4e paramètre.

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
Bertrand Lenoir-Welter
Sty :

Comment faut-il s'y prendre svp ?



Moi je m'y prendrais plutôt avec CreateProcess() qui me semble plus
simple pour lancer un exécutable dont on connaît le chemin d'accès.
Quelque chose comme :
CreateProcess(
0,
"c:/XXX/python.exe pannel.py",
0,
0,
FALSE,
0,
0,
"c:/XXX/python.exe",
&StartInfo,
&ProcInfo
);

Voir les structures PROCESS_INFORMATION et STARTUP_INFORMATION et les
possibles contrôles associés genre WaitForSingleObject(). Pas oublier
ensuite le CloseHandle(ProcInfo.hThread). Et aussi pas oublier non plus
de mettre la commande et les argument chacun entre double-quotes s'il y
a des espaces dans les noms de répertoire ou de fichiers.

Je dis pas que c'est mieux, mais c'est comme ça que je fais pour lancer
un exe avec ou sans arguments, avec ou sans attente de fin de thread, et
ça m'a jamais posé le moindre problème.
Avatar
lkm
Bertrand Lenoir-Welter wrote:
Sty :


Comment faut-il s'y prendre svp ?




Moi je m'y prendrais plutôt avec CreateProcess() qui me semble plus
simple pour lancer un exécutable dont on connaît le chemin d'accès.
Quelque chose comme :
CreateProcess(
0,
"c:/XXX/python.exe pannel.py",
0,
0,
FALSE,
0,
0,
"c:/XXX/python.exe",
&StartInfo,
&ProcInfo
);

Voir les structures PROCESS_INFORMATION et STARTUP_INFORMATION et les
possibles contrôles associés genre WaitForSingleObject(). Pas oublier
ensuite le CloseHandle(ProcInfo.hThread). Et aussi pas oublier non plus
de mettre la commande et les argument chacun entre double-quotes s'il y
a des espaces dans les noms de répertoire ou de fichiers.

Je dis pas que c'est mieux, mais c'est comme ça que je fais pour lancer
un exe avec ou sans arguments, avec ou sans attente de fin de thread, et
ça m'a jamais posé le moindre problème.



Merci à toi et à AMcD, j'ai lus la doc de ShellExecute et je ne pense
pas que cette fonction puisse me permettre de faire ce que je veux.
CreateProcess à l'air de mieu convenir à mon problème.

Merci encore :)
Avatar
Bertrand Lenoir-Welter
I wrote:

CreateProcess(
0,
"c:/XXX/python.exe pannel.py",
0,
0,
FALSE,
0,
0,
"c:/XXX/python.exe",
&StartInfo,
&ProcInfo
);



Au temps pour moi, le 8ème argument, c'est le répertoire courant où ça
se passe, donc seulement "C:XXX".


Pour les structures, typiquement, c'est quelque chose comme :

PROCESS_INFORMATION ProcInfo;
STARTUPINFO StartInfo;
memset(&StartInfo,0,sizeof(StartInfo));
StartInfo.cb=sizeof(StartInfo);
CreateProcess(...);

Jette quand même un coup d'oeil à STARTUPINFO, si t'as besoin de passer
des indicateurs de fenêtrage à ton thread.

Et si tu veux attendre la fin du thread :

while(WaitForSingleObject(ProcInfo.hProcess,100)==WAIT_TIMEOUT))
{
...
}

ou bien WaitForSingleObject(ProcInfo.hProcess,INFINITE) mais dans ce
cas, t'as pas la main pour rafraîchir ton appli pendant que le thread
tourne.
Avatar
Sty
>>
CreateProcess(
0,
"c:/XXX/python.exe pannel.py",
0,
0,
FALSE,
0,
0,
"c:/XXX/",
&StartInfo,
&ProcInfo
);




Tout cela marche très bien, mais à chaque création de processus, j'ai
une ligne de commande qui s'ouvre... Je n'arrive pas à faire en sorte
que seul l'application graphique python s'ouvre, et non la ligne de
commande. Y'a t'il un moyen pour faire cela ?
Avatar
Bertrand Lenoir-Welter
Sty :

Tout cela marche très bien, mais à chaque création de processus, j'ai
une ligne de commande qui s'ouvre...



C'est quoi, "une ligne de commande qui s'ouvre" ? Tu veux parler d'une
fenêtre de commandes genre MS-DOS ? Si c'est bien ça, je sais pas quoi
te dire. Quand j'utilise CreateProcess(), si c'est pour lancer une appli
Windows on ne voit qu'elle, et si c'est pour lancer un programme DOS, il
s'ouvre dans une fenêtre DOS ou en plein écran s'il passe en mode graphique.

A mon avis, mais je peux me tromper, c'est du côté de ton exécutable
Python qu'il faut chercher. S'il tourne seulement en mode console, ça
risque de se compliquer. Peut-être en le plaçant hors écran ?
Avatar
Arnold McDonald \(AMcD\)
Ou alors, le prog qui gère le CreateProcess() fait un timer, cherche la
console ouverte et la ferme ? Bon, c'est clair, ça commence à devenir
folklorique...

Allez, j'interviens plus avant l'année prochaine :-).

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
Arnaud Debaene
Bertrand Lenoir-Welter wrote:
Sty :

Tout cela marche très bien, mais à chaque création de processus, j'ai
une ligne de commande qui s'ouvre...





Flag CREATE_NO_WINDOW dans le paramètre dwCreationsFlags.

Arnaud
MVP - VC