Ouvrir un .exe en C

Résolu/Fermé
Wanted59 Messages postés 44 Date d'inscription vendredi 6 mars 2009 Statut Membre Dernière intervention 15 octobre 2009 - 6 mars 2009 à 19:40
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 10 mars 2009 à 19:01
Bonjour a tous,
Je me présente vu que je suis nouveau sur le forum, 'fin j'ai déjà lu pas mal de sujet sur comment ça marche mais je n'avais encore jamais posté, alors voilà moi c'est Wanted59 et je suis plutot nouveau en C. Les seul choses que j'ai fait pour le moment c'est un pendu a 2 joueurs en console et un jeu Plus ou Moins. 'Fin bref, j'ai un problème ^^.
En fait j'aimerai ouvrir un de mes executables que j'ai créé a partir d'un autre .exe, je m'explique :
Dans mon code source du proramme 1, il y aurai une fonction qui permettrai d'ouvrir le programme 2, je ne pense pas qu'avec fopen ça marche car je ne sais pas si un .exe est considéré comme un fchier comme un autre, donc voilà en fait j'aimerai qu'on me dise c'est quoi la fonction et qu'on m'explique son fonctionnement et qu'on me donne un exemple svp, j'ai cherché mais peu de personnes cherche a ouvrir un autre .exe et donc il y a peu d'aide a ce sujet.
Merci d'avance.
A voir également:

10 réponses

Wardog Messages postés 389 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 17 octobre 2009 159
8 mars 2009 à 18:33
Oui

#include <unistd.h>
#include <stdio.h>

int main()
{
    if ((execl("C:\\Documents and Settings\\Wanted59\\Bureau\\Programmes\\Pendu", 0)) == -1) 
        {
            puts("L'execution du .exe a foire...");
            return (1);
        }
    return (0);
}


On mets des \ pour inhiber les caractères \
Si execl n'arrive pas à ouvrir le .exe il retourne -1.
1
Wardog Messages postés 389 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 17 octobre 2009 159
6 mars 2009 à 20:08
Salut Wanted59

Il faut que tu fork (si tu programmes sous UNIX) et ensuite tu appelle ton binaire avec execve() et compagnie.

En gros, fork va dupliquer ton programme.
Tu aura alors 2 processus (un va quitter ton programme principal et exécuter l'autre binaire, un qui continuera dans ton programme).

int pid;
pid = fork();

if (pid == 0)
{
//processus fils qui va être tuer lors de l'appel du binaire avec execve()
//je lance l'execution du binaire avec execve() Ceci a pour effet de quitter ce programme là
execve("Monbinaire", *tableaudarguments[], *tableaudenvironnments[]);
exit(0);
}
else if (pid > 0)
{
//processus père
//je continue mon prog principal
}

Sous Windows, fork() n'existe pas mais va voir ici: http://www.infos-du-net.com/forum/124531-21-fork-windows et https://www.developpez.net/forums/d332/c-cpp/c/bibliotheques-systemes-outils/posix/fork-sous-windows/

Pour les prototypes etc je te laisse regarder sur Google ;)
0
Wanted59 Messages postés 44 Date d'inscription vendredi 6 mars 2009 Statut Membre Dernière intervention 15 octobre 2009 7
7 mars 2009 à 15:07
Merci pour ton aide Wardog mais en fait je suis sous windows et je comprend pas très bien ce que tu as écrit et je ne comprend pas non plus les liens :s, tu pourrais pas me donner un exemple pour par exemple je voudrai ouvrir un .exe qui se trouve dans C:\Documents and Settings\Wanted59\Bureau\Programmes\Pendu. Tu pourrais faire un exemple pour lui stp ? Car j'ai du mal a comprendre sans exemple là dsl. Merci quand même d'avoir repondu.
0
Wanted59 Messages postés 44 Date d'inscription vendredi 6 mars 2009 Statut Membre Dernière intervention 15 octobre 2009 7
9 mars 2009 à 17:51
Bonjour Wardog, merci beaucoup de t'occupé de mon problème, Je commence bien a comprendre là mais le truc là c'est que ton code vérifie juste si on peut ouvrir l'exe là non? et au faite quand je test ton code mon programme s'ouvre et se ferme à la vitesse de la lumière donc j'essai d'utiliser system("PAUSE"); mais mon programme continu a s'ouvrir et à se fermer a la vitesse de la lumière mais sinon c'est juste que dans :
int main()
{
if ((execl("C:\\Documents and Settings\\Wanted59\\Bureau\\Programmes\\Pendu", 0)) == -1)
{
puts("L'execution du .exe a foire...");
return (1);
}
return (0);
}

Je voit pas où j'ouvre mon programme pendu car là il vérifie juste si ça marche pour moi, 'fin je suis dsl de faire le boulet mais là je sens que j'approche de la vérité ^^. Merci en tout cas.
0

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

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
9 mars 2009 à 17:59
Salut,
Attention, avec la famille exec (si elle n'échoue pas), l'image du processus sera remplacée par celle indiquée en arguments. Donc si tu mets un system("PAUSE"); à la suite ça n'y changera rien. Par contre, tu peux mettre le sytem("PAUSE"); dans ton programme pendu est le recompiler. J'espère pour toi que tu peux y retoucher, sinon la suite va se compliquer vraiment ^^.

Par contre, laisse quand même le system("PAUSE") dans le fichier en cours, ne serait-ce que pour voir si l'exécution a bien eu lieu ou pas. Si ça se ferme aussitôt, c'est que execl a bien fonctionné.

Cdlt
0
Wanted59 Messages postés 44 Date d'inscription vendredi 6 mars 2009 Statut Membre Dernière intervention 15 octobre 2009 7
9 mars 2009 à 20:58
Oui mais avec le code :
int main()
{
if ((execl("C:\\Documents and Settings\\Wanted59\\Bureau\\Programmes\\Pendu", 0)) == -1)
{
puts("L'execution du .exe a foire...");
return (1);
}
return (0);
}
C'est où que j'ouvre mon autre .exe?
0
Wardog Messages postés 389 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 17 octobre 2009 159
9 mars 2009 à 21:07
Au niveau du execl("C:\\Documents and Settings\\Wanted59\\Bureau\\Programmes\\Pendu", 0)
execl() exécute ton programme Pendu.
Si sa marche, le programme sera remplacé par ton pendu.

Fais gaffe au nom de ton pendu. Est-ce Pendu ou Pendu.exe ou pendu.exe?

Essaye sa:

#include <unistd.h>
#include <stdio.h>

int main()
{
    if ((execl("C:\\Documents and Settings\\Wanted59\\Bureau\\Programmes\\Pendu", 0)) == -1)
        {
            puts("L'execution du .exe a foire...");
            while(1);
            return (1);
        }
    return (0);
}


Si tu as le message "L'execution du .exe a foire...", c'est que le programme n'arrive pas à exécuter ton .exe, vérifie alors le chemin.
0
Quelle horreur ce code !
Ne jamais faire un truc pareil et utiliser l'api Windows.
0
Wanted59 Messages postés 44 Date d'inscription vendredi 6 mars 2009 Statut Membre Dernière intervention 15 octobre 2009 7
9 mars 2009 à 21:42
Merci beaucoup ça marche !
Juste pour savoir, il n'y a pas moyen d'ouvrir le Pendu sans fermer le programme qui l'ouvre?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
9 mars 2009 à 23:41
Le programme qui l'ouvre comme tu dis n'existe plus lors qu'il ouvre le pendu. Son image de processus est remplacé par celui du pendu.
0
Wanted59 Messages postés 44 Date d'inscription vendredi 6 mars 2009 Statut Membre Dernière intervention 15 octobre 2009 7
10 mars 2009 à 17:52
A ok ok j'ai compris, ba merci beaucoup en tout cas grace a vous j'ai un peu progresser en C, par contre j'ai un dernier petit service si vous le voulez bien, juste est-ce que vous pourriez m'expliquer en détail ce qui se passe lorsque j'utilise ce code, car là j'arrive a l'utiliser mais j'aimerai en savoir + sur ce code, merci d'avance et encore merci pour l'aide précédente.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
10 mars 2009 à 19:01
Salut,
Voici un petit lien qui explique ce que fait execl: http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/execl.3.html
0