Connaitre le chemin

Résolu
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007 - 13 déc. 2006 à 00:13
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 - 13 déc. 2006 à 21:46
Bonjour a tous,

Je suis en train de construir un programme en C++, et j`aimerais pouvoir lancer a partir de mon programme des fichiers executables. Les fichiers executables que je cree, ils ne posent aucun probleme, car je peux les lancer :
                                                                        char fichier[]="C:\\Debug\\monprogramme.exe";
                                                                        system(fichier);

Le probleme se pose quand je ne connais pas le chemin, je connais just le nom de l`executable a lancer. Je crois me souvenir qu `il y avait un code qui donnait le chemin absolu d`un executable. Mais j`arrive pas a le trouver...pourriez vous m`aider a trouver la solution?

Merci d`avance...

Ignasi

17 réponses

yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
13 déc. 2006 à 08:38
Salut ipascual,

si tu cherches le chemin complet d'un programme qui a été installé, tu pourras peut-être t'en sortir avec la base de registre.
Sinon comme l'a dit SAKingdom, il y a la recherche sur le disque.
Voici une de mes sources à ce sujet : (assez simple aussi et rapide)
SCANNER DE DISQUES (RECURSIF)

Si tu as besoin d'aide pour ma source je suis là ya pas de souci

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
3
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
13 déc. 2006 à 20:31
Tant mieux si tu as compris, j'avais peur d'avoir été vague.
Ah oui mince j'ai oublié une petite chose, tel que le code est, il ne liste que les dossiers, donc pas les fichiers !
Autant pour moi j'avais pas fais attention.
Tu as raison pour le coup du filtre je t'ai dit n'importe quoi. Il faut bien un filtre mais appliqué dès le début de la fonction.
Pour pouvoir prendre en compte les fichiers, tu reprends mon code tel quel et il faut traiter le contenu des dossiers là où il y a le commentaire.

Essaye en y ajoutant ceci :

char Chemin[1024], Recherche[1024];
WIN32_FIND_DATA WFD2;
strcpy(Recherche, DossRech);
strcat(Recherche, firefox.exe);
HANDLE hRechFich = FindFirstFile(DossRech, &WFD);
if(hRechFich != INVALID_HANDLE_VALUE)
{
    if((WFD2.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
    {
        *Chemin = 0;
        strcat(Chemin, DossRech);
        strcat(Chemin, WFD2.cFileName);
        MessageBox(NULL, WFD2.cFileName, "Normalement c'est Firefox !", 0);
        MessageBox(NULL, DossRech, "Donc là ça doit être son dossier !", 0);
    }
    while(FindNextFile(hRechFich,&WFD2))
    {
        if((WFD2.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
        {
            *Chemin = 0;
            strcat(Chemin, DossRech);
            strcat(Chemin, WFD2.cFileName);
            MessageBox(NULL, WFD2.cFileName, "Normalement c'est Firefox !", 0);

            MessageBox(NULL, DossRech, "Donc là ça doit être son dossier !", 0);
        }
    }
    FindClose(hRechFich);
}

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 déc. 2006 à 00:37
char buffer[256]; // <- Contiendra le chemin complet du processus courant
GetModuleFileName(0, buffer, 256);

C++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 déc. 2006 à 00:45
Si tu veux avoir le chemin complet d'un autre programme que le tien avec seulement son nom, il faut faire une recherche sur le disque. Regarde du coté de:
FindFirstFile
FindNextFile

C++ (@++)<!--
0

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

Posez votre question
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
13 déc. 2006 à 00:46
Rebonjour,

en fait j`aimerais savoir le chemin complet d`un processus determine (pas le courant), comme par exemple, le chemin de firefox.exe, pour apres pouvoir le lancer. (mon systeme explotation est Windows)

Merci d`avance,
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
13 déc. 2006 à 00:49
En fait, j`ai deja essayé avec ça...mais il ne marche pas. Aurais tu un exemple par hazard?

Merci d`avance
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 déc. 2006 à 00:59
FINDFILE


RECHERCHER-FICHIER-SUR-DISQUE-DUR <- Exemple très simple
NENGINE
C++ (@++)<!--
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
13 déc. 2006 à 18:07
Bonjour,

Merci d`avance pour tout votre aide...Mais j`ai plein de questions

1) Qu`est ce-que c`est la base de registre? Comment je pourrais l`utiliser pour trouver ma solution?

Dans l`exemple pour Scanner de disques..en fait c`est une super source, qui marche tres bien , merci :D. Mais j`aimerais quand meme comprendre deux choses...

     I)J`arrive pas a voir l`utilité de la condition de la source
        21.-  if
(!(Nom[0] == '.' && !Nom[1]) && !(Nom[0] == '.' && Nom[1] == '.' && !Nom[2]))

Et puis...pourquoi on appelle encore une fois la fonction ? On appelle une fonction dans sa fonction?Serait un peu comme un GOTO ?
Alors, l`utilité de la boucle do-while? Le programme parcourt le disque, mais j`arrive pas a voir comment....

Merci d`avance
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
13 déc. 2006 à 18:50
Et une derniere question....ceci nous permet de tracer les dossiers, mais par exemple, si on voulait trouver le chemin complet de  firefox.exe, ou est-ce qu`il faudrait l`indiquer?
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
13 déc. 2006 à 18:52
Salut ipascual,

si tu ne connais pas la base de registre de windows, il va falloir que tu cherches des infos sur le sujet parce que c'est un endroit à ne pas négliger sous windows à mon avis (ça vaut ce que ça vaut ).
Pour t'en servir, tu trouveras pleins de sources sur le site qui te montreront comment s'en servir.

Pour ce qui est de la source, dans chaque dossier ouvert (par le code pas l'explorer windows), tu as en premier dans la liste le dossier nommé . (dossier courant) et en deuxième le dossier .. (dossier parent).
Cette condition sert donc à les négliger (comme ce qui est fait dans l'explorer de windows, ils ne sont pas affiché).

Maintenant la fonction qui s'appelle elle-même, on appelle ça la récursivité. Cette technique (quand elle peut s'appliquer), donne des fonctions souvent très courtes.
Je vais essayer de t'expliquer comment cela fonctionne.
Imagine tout d'abord la même fonction sans qu'elle ne s'appelle elle-même.
Et bien sans celà, la fonction énumère un à un (sans les afficher), tous les dossiers se trouvant dans le dossier que tu as donné en argument à la fonction.
Et sur le même principe, je rajoute l'appel à la même fonction pour qu'à dossier trouvé dans le dossier parent, on aille regardé tous les dossiers qui s'y trouvent et ainsi de suite.
C'est pas forcément évident à la première lecture, je le comprend très bien.

Si tu veux essayer sur un exemple simple, appelle la fonction avec un dossier contenant lui même quelques dossiers qui eux mêmes ont des dossiers. Et là où il y a le commentaire, mets ceci :

MessageBox(NULL, DossRech, "Dossier qui va être scruté", 0);
sleep(1000);

J'espère avoir été assez clair. Tiens-moi au courant.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
13 déc. 2006 à 18:58
Pour trouver firefox, si tu es sûr du nom exact de l'exécutable, dans ta fonction, tu rajoutes un argument à passer comme ceci :

void
ScruterSousDossiers(
char
* Dossier, char* Filtre)
{
    HANDLE hRecherche;
    WIN32_FIND_DATA WFD;
   
char
* Nom = WFD.cFileName;
   
char
DossFiltre[1024], DossRech[1024];<samp>
//-----//</samp>
    strcpy(DossFiltre, Dossier);
    strcat(DossFiltre, Filtre<var></var>);
    hRecherche = FindFirstFile(DossFiltre, &WFD);
    ...
}

avec comme filtre a passé à la fonction, firefox.exe.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
13 déc. 2006 à 19:20
Merci beaucoup!!

Pour les resgistres de windows je le mets sur la liste de choses "a faire" lol .

Pour ce qui concerne les explications, nickel. J`ai tout compris. Merci beaucoup, tu as ete tres clair. J`avais pas pense aux dossiers dans les dossiers ni les dossiers courants, ni parents.....
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
13 déc. 2006 à 19:25
Par contre, j`ai un probleme pour le filtre a passer... en fait quand je fais cela, il ne se passe rien....En fait je crois qu`il fait just la recherche sur un dossier et les autres ne les touche pas...Pourrait etre le cas?

Merci d`avance
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
13 déc. 2006 à 21:32
Desole...mais il ne se passe encore rien.....En fait le progamme il n`arrive pas a passer la premiere condition donc je suppose qu`il doit y avoir un probleme a  l`heure de creer le HANDLE. ...

Merci d`avance,
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
13 déc. 2006 à 21:36
Au début de la fonction tu as bien remis comme c'était avant ?

void
ScruterSousDossiers(
char
* Dossier)
{
    HANDLE hRecherche;
    WIN32_FIND_DATA WFD;
   
char
* Nom = WFD.cFileName;
   
char
DossFiltre[1024], DossRech[1024];<samp>
//-----//</samp>
    strcpy(DossFiltre, Dossier);
    strcat(DossFiltre, <var>"*.*"</var>); // <-- ICI

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
13 déc. 2006 à 21:44
Desole, Je viens de voir le probleme que j`avais.....

En fait c`etait un probleme lie a mon code, (un time out en mal moment...). donc en fait , il donnait pas le temps suffisant pour trouver l`emplacement du programme. Le probleme de time out resolu, ton code marche tres bien...

Donc merci beaucoup pour ton temps, maintenant je peux localiser mon firefox. Merci encore, probleme resolu :D
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
13 déc. 2006 à 21:46
Ok super ça !
Pense à accepter (avec le bouton) la ou les réponses qui t'ont permise(s) de résoudre ton problème.
Bon courage pour la suite.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
0
Rejoignez-nous