Ouvrir un Exécutable Avec C++
Fermé
DolphinEye
Messages postés
23
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
2 novembre 2006
-
7 janv. 2004 à 20:29
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 15 sept. 2010 à 21:56
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 15 sept. 2010 à 21:56
A voir également:
- Ouvrir un Exécutable Avec C++
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir un fichier .bin - Guide
- Ouvrir avec - Guide
- Comment ouvrir un fichier docx ? - Guide
- Ouvrir un fichier .dat - Guide
9 réponses
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
177
7 janv. 2004 à 20:39
7 janv. 2004 à 20:39
cherches ds me fourm, on a deja repondu comment executer un programme sous windows.
Le principe c'est : creer un processus (par un appel a un equivalent a fork ) et puis executer le programme (par un equivalent de exec). Je pense q si je ne me trompe pas, il ya un appel systeme qui s'appelle CreateProcess et qui se charge de fair les 2 en meme temps.
Va voir ici :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp
et pour un exemple :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_processes.asp
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
Le principe c'est : creer un processus (par un appel a un equivalent a fork ) et puis executer le programme (par un equivalent de exec). Je pense q si je ne me trompe pas, il ya un appel systeme qui s'appelle CreateProcess et qui se charge de fair les 2 en meme temps.
Va voir ici :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp
et pour un exemple :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_processes.asp
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
18 août 2010 à 19:59
18 août 2010 à 19:59
Je ne sais pas ce qui existe sous windows, mais sous linux j'utilise popen et de temps en temps execve, execlp...
De toute façon il reste possible de faire deux sections de codes spécifiques à linux et windows (avec des #ifdef .... #else ... #endif).
Autre possibilité, on utilise un framework genre Qt qui existe sous Linux et Windows et on suit cet exemple :
http://www.qtforum.org/article/3079/howto-start-an-external-program-from-a-qt-application.html
En plus si on a l'intention de faire un interface graphique, utiliser Qt est un choix qui a le mérite d'être portable et aujourd'hui fréquemment utilisé (cf googleearth, kde, skype ... autant d'exemples écrits en Qt).
Bonne chance
De toute façon il reste possible de faire deux sections de codes spécifiques à linux et windows (avec des #ifdef .... #else ... #endif).
Autre possibilité, on utilise un framework genre Qt qui existe sous Linux et Windows et on suit cet exemple :
http://www.qtforum.org/article/3079/howto-start-an-external-program-from-a-qt-application.html
En plus si on a l'intention de faire un interface graphique, utiliser Qt est un choix qui a le mérite d'être portable et aujourd'hui fréquemment utilisé (cf googleearth, kde, skype ... autant d'exemples écrits en Qt).
Bonne chance
DolphinEye
Messages postés
23
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
2 novembre 2006
7 janv. 2004 à 20:56
7 janv. 2004 à 20:56
Désolé d'avoir reposté un sujet auquel vous aviez répondu, mais la recherche m'envoyait sur google :-(
Sinon merci pour ton aide
--Dolphin's Eye
Sinon merci pour ton aide
--Dolphin's Eye
Bah oui, mais votre solution elle est pas top la.
C'est bien si tu veux faire du Windows.
Mais moi j'ai le même besoin... sous Linux.
L'ideal pour moi serait un commande identique pour un programme Windows comme pour Linux
J'imagine qu'il y a une regle POSIX sur le sujet, non?
Est-ce que vous la connaissaite
C'est bien si tu veux faire du Windows.
Mais moi j'ai le même besoin... sous Linux.
L'ideal pour moi serait un commande identique pour un programme Windows comme pour Linux
J'imagine qu'il y a une regle POSIX sur le sujet, non?
Est-ce que vous la connaissaite
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
177
5 déc. 2005 à 15:59
5 déc. 2005 à 15:59
Eh ben, le principe qe je lui ai donné est celui proposé par posix => tu crée un processus par fork puis tu exécutes ton code en appelant une des fcts de la famille exec (c'est coe ça qe ça se fait avec shell, bash par exemple).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
MissZaza
Messages postés
149
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
7 décembre 2005
33
2 déc. 2005 à 22:07
2 déc. 2005 à 22:07
Bonsoir,
Si c'est juste pour lancer un fichier exécutable, pourquoi ne pas utiliser :
Si c'est juste pour lancer un fichier exécutable, pourquoi ne pas utiliser :
//exemple pour lancer la calculette windows std::system("C:\\Windows\\System32\\calc.exe");
La encore ca ne va pas.
Potentiellement 2 problemes:
1. Faut faire gaffe aux STL: selon la version du compilo, le comportement change et tu peux te retrouver avec des comportements differents entre Linux et Windows
2. La plus importante: system lance en effet un executable sur toutes les plateformes. Mais tu perds le pid de l'executable en question ce qui fait qu'ensuite tu ne peux plus le controler.
Ce que je pense qu'il faudrai faire, c'est sa propre classe qui expose une interface commune aux 2 plateformes, mais qui appelle des portions de codes differentes (ca corrige le pb2 mais pas forcement le 1 malheureusement, si vous ne faites pas gaffe a ce que vous faites dans votre librairie).
Par exemple la classe pourrait avoir une methode appelle "runProcess" qui retourne un type propre a la classe (e.g. Classe_Pid).
Mais il y aurait un fichier cpp pour Windows et un autre pour Linux
Sous Windows on fait appelle a des CreateProcess (je crois que c'est comme cela que ca s'appelle), et sous Unix on appelle un fork qui doit appeller execve. Le fork retournera le pid du process cree.
Ensuite, pour la compilation, tu met un flag pour dire si tu veux une compile Linux ou Windows, et en fonction de ton flag, tu indiques dans ton makefile quels sont les fichiers sources a prendre.
Je n'est pas codé cette solution mais je pense que c'est la bonne.
Si tu vois une idee plus simple, je suis preneur.
Merci.
Potentiellement 2 problemes:
1. Faut faire gaffe aux STL: selon la version du compilo, le comportement change et tu peux te retrouver avec des comportements differents entre Linux et Windows
2. La plus importante: system lance en effet un executable sur toutes les plateformes. Mais tu perds le pid de l'executable en question ce qui fait qu'ensuite tu ne peux plus le controler.
Ce que je pense qu'il faudrai faire, c'est sa propre classe qui expose une interface commune aux 2 plateformes, mais qui appelle des portions de codes differentes (ca corrige le pb2 mais pas forcement le 1 malheureusement, si vous ne faites pas gaffe a ce que vous faites dans votre librairie).
Par exemple la classe pourrait avoir une methode appelle "runProcess" qui retourne un type propre a la classe (e.g. Classe_Pid).
Mais il y aurait un fichier cpp pour Windows et un autre pour Linux
Sous Windows on fait appelle a des CreateProcess (je crois que c'est comme cela que ca s'appelle), et sous Unix on appelle un fork qui doit appeller execve. Le fork retournera le pid du process cree.
Ensuite, pour la compilation, tu met un flag pour dire si tu veux une compile Linux ou Windows, et en fonction de ton flag, tu indiques dans ton makefile quels sont les fichiers sources a prendre.
Je n'est pas codé cette solution mais je pense que c'est la bonne.
Si tu vois une idee plus simple, je suis preneur.
Merci.
Dites-moi tout le monde, ca fait 6 ans, mais on attend toujours une solution !
System() n'est pas recommandé, surtout pour différents OS, CreateProcess() et ShellExecute(), impossible de trouver un exemple valide, même sur Google, et on est pas en VC++, mais en C++.
Une idée ou un exemple ? N'hésitez pas à nous donner un code !
Merci !
System() n'est pas recommandé, surtout pour différents OS, CreateProcess() et ShellExecute(), impossible de trouver un exemple valide, même sur Google, et on est pas en VC++, mais en C++.
Une idée ou un exemple ? N'hésitez pas à nous donner un code !
Merci !
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
15 sept. 2010 à 16:00
15 sept. 2010 à 16:00
Les solutions de Zorel sont bonnes. J'ai testé avec succes les exec et les spawn sous windows.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 août 2010 à 20:45
18 août 2010 à 20:45
Bonjour,
Le mieux est de se créer une fonction soi-même.
Cette fonction sera définie dans un fichier à part qui appellera les fonctions CreateProcess pour windows (#ifdef comme proposé par mamiemando), ou fork/exec* sous linux.
Cdlt,
Le mieux est de se créer une fonction soi-même.
Cette fonction sera définie dans un fichier à part qui appellera les fonctions CreateProcess pour windows (#ifdef comme proposé par mamiemando), ou fork/exec* sous linux.
Cdlt,
Bonjour,
Une autre solution comme dit plus haut serai de faire une interface avec un lib multi archi
Comme sa 2 classe une windows et une linux avec un classe mére abstraite qui serai appelé dans tous le programme et voila le reste devient invisible :)
Vive les virtuel pure ^^
Une autre solution comme dit plus haut serai de faire une interface avec un lib multi archi
Comme sa 2 classe une windows et une linux avec un classe mére abstraite qui serai appelé dans tous le programme et voila le reste devient invisible :)
Vive les virtuel pure ^^
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
15 sept. 2010 à 21:56
15 sept. 2010 à 21:56
Pas besoin de méthodes virtuelles, juste de #define. Les virtuelles (pures ou non) ne seraient au final d'aucun secours, la seule chose importe est d'avoir un header commun aux différentes plateforme et des sources (.cpp) adaptés à chaque plate-forme (quitte à utiliser des #define).
Typiquement, Qt est une librairie multi-plateforme et n'utilise pas spécialement de virtuelles pures.
Typiquement, Qt est une librairie multi-plateforme et n'utilise pas spécialement de virtuelles pures.