Ouvrir un Exécutable Avec C++

DolphinEye Messages postés 23 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonsoir à tous, je voulais savoir comment ouvrir un fichier avec C++ 6.0
Je voudrai pouvoir faire un "launcher de jeu" pour lancer Half-Life par exemple
Merci d'avance

--Dolphin's Eye
A voir également:

9 réponses

tafiscobar Messages postés 1277 Date d'inscription   Statut Contributeur Dernière intervention   177
 
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!!!
1
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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
1
DolphinEye Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
Zorel
 
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
0
tafiscobar Messages postés 1277 Date d'inscription   Statut Contributeur Dernière intervention   177
 
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).
0

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

Posez votre question
MissZaza Messages postés 149 Date d'inscription   Statut Membre Dernière intervention   33
 
Bonsoir,

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");
0
Zorel
 
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.
0
Bilow
 
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 !
0
Bilow
 
On attend toujours. Ca n'existe vraiment pas ?
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Les solutions de Zorel sont bonnes. J'ai testé avec succes les exec et les spawn sous windows.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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,
0
jouana
 
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 ^^
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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.
0