Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1744 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Trouver path d'un exe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Trouver path d'un exe

n°1491554
karminator​98
Posté le 14-12-2006 à 20:49:11  profilanswer
 

bonjour à tous!
 
dans un programme C, comment faire pour savoir de quel dossier le programme s'exécute???
 
ex :  
c:/travail/prog
(dans ce cas, le programme prog.exe saurait qu'il a a été exécuté à partir de C:/travail/)
 
merci par avance!

mood
Publicité
Posté le 14-12-2006 à 20:49:11  profilanswer
 

n°1491557
karlkox
Posté le 14-12-2006 à 20:58:32  profilanswer
 

Sous windows : CreateToolhelp32Snapshot + Module32First + Module32Next.

n°1491559
karminator​98
Posté le 14-12-2006 à 21:02:40  profilanswer
 

???
 
serait-il possible d'avoir une explication plus exhaustive?
 
n'y aurait-il pas une façon plus simple avec argv[0] ?
 
et en plus, je dois savoir comment faire sous windows ET sous linux... :S


Message édité par karminator98 le 14-12-2006 à 21:20:05
n°1491566
Trap D
Posté le 14-12-2006 à 21:29:33  profilanswer
 

Rien n'impose dans la norme le comportement de argv[0], il peut y avoir le nom de l'exécutable, le nom complet avec chemin d'accès absolu à cet exécutable ou ... rien !
Sous Windows tu as GetModuleFileName mais sous Linux ??

n°1491574
0x90
Posté le 14-12-2006 à 21:47:25  profilanswer
 
n°1491576
karlkox
Posté le 14-12-2006 à 22:19:55  profilanswer
 

Ah ok, c'est pour ton programme, GetModuleFileName est plus approprié en effet.

n°1491585
Sve@r
Posté le 14-12-2006 à 23:04:27  profilanswer
 

Trap D a écrit :

Rien n'impose dans la norme le comportement de argv[0], il peut y avoir le nom de l'exécutable, le nom complet avec chemin d'accès absolu à cet exécutable ou ... rien !


Non. il y a le nom EXACt tel que tu le tapes quand tu lances le programme.
Si tu lances "../truc/../../toto.exe", c'est cette chaîne qui sera enregistrée.


Non. getcwd te donne l'endroit où tu te trouves et cet endroit n'est pas forcément celui de l'exécutable... Mais la solution est là.
Pour connaître le path de ton exécutable; il te faut récupérer la chaîne entière "argv[0]". Et là, 2 cas

  • il n'y a pas de "/" dans la chaîne alors le path=getcwd()
  • il y a un "/" => tu récupères tout le chemin entre le début de la chaîne et le dernier "/", tu fais un "chdir(ce_chemin)" et là, "path=getcwd()". Ca semble un peu tordu mais c'est le seul moyen de raccourcir les noms style "./././truc/../truc/../toto.exe"

Message cité 1 fois
Message édité par Sve@r le 14-12-2006 à 23:10:59

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1491587
0x90
Posté le 14-12-2006 à 23:15:53  profilanswer
 

Sve@r a écrit :

Non. il y a le nom EXACt tel que tu le tapes quand tu lances le programme.
Si tu lances "../truc/../../toto.exe", c'est cette chaîne qui sera enregistrée.

 

Et si tu lance un binaire avec execl() ou une fonction simmilaire, tu risques d'avoir des surprises dans argv[0]

 
Sve@r a écrit :


Non. getcwd te donne l'endroit où tu te trouves et cet endroit n'est pas forcément celui de l'exécutable... Mais la solution est là.
Pour connaître le path de ton exécutable; il te faut récupérer la chaîne entière de celui-ci. Et là, 2 cas

  • il n'y a pas de "/" dans la chaîne alors le path=getcwd()
  • il y a un "/" => tu récupères tout le chemin entre le début de la chaîne et le dernier "/", tu fais un "chdir(ce_chemin)" et là, "path=getcwd()". Ca semble un peu tordu mais c'est le seul moyen de raccourcir les noms style "./././truc/../truc/../toto.exe"


Il demande "de quel dossier le programme s'exécute" pas "ou se trouve sur le disque le binaire qui s'exécute". getcwd() au début sans aucun chdir() avant te donnera exactement ça.

 

( et en plus ta méthode pour ton interprétation est buggée , «PATH='/un/path/ou/se/trouve/ton/binaire/' tonbinaire» donnera argv[0]="tonbinaire", or le binaire n'est pas forcément dans le dossier retourné par getcwd() )

Message cité 1 fois
Message édité par 0x90 le 14-12-2006 à 23:16:34

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1491606
Sve@r
Posté le 15-12-2006 à 01:31:48  profilanswer
 

0x90 a écrit :

Et si tu lance un binaire avec execl() ou une fonction simmilaire, tu risques d'avoir des surprises dans argv[0]


Pas si tu passes les bon paramètres à "execl()"...
 

0x90 a écrit :

Il demande "de quel dossier le programme s'exécute" pas "ou se trouve sur le disque le binaire qui s'exécute". getcwd() au début sans aucun chdir() avant te donnera exactement ça.


Hum. J'avais compris "où se trouve l'exécutable" mais c'est vrai qu'on peut aussi l'interpréter à ta façon
 

0x90 a écrit :

( et en plus ta méthode pour ton interprétation est buggée , «PATH='/un/path/ou/se/trouve/ton/binaire/' tonbinaire» donnera argv[0]="tonbinaire", or le binaire n'est pas forcément dans le dossier retourné par getcwd() )


Exact. J'avais pas envisagé ce cas...

Message cité 1 fois
Message édité par Sve@r le 15-12-2006 à 01:33:38

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1491607
0x90
Posté le 15-12-2006 à 01:35:05  profilanswer
 

Sve@r a écrit :

Pas si tu passes les bon paramètres à "execl()"...


 
C'est bien ce qu'on dit, argv[0] peut être ce que tu cherches, mais c'est pas sûr, tu ne contrôle pas vraiment comment ton programme est appelé par d'autres.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
mood
Publicité
Posté le 15-12-2006 à 01:35:05  profilanswer
 

n°1492060
Sve@r
Posté le 15-12-2006 à 19:30:52  profilanswer
 

0x90 a écrit :

C'est bien ce qu'on dit, argv[0] peut être ce que tu cherches, mais c'est pas sûr, tu ne contrôle pas vraiment comment ton programme est appelé par d'autres.


 
C'est vrai, t'as raison mais faut quand-même un minimum. C'est comme si tu me disais "strlen()" renvoie le nb de caractères de la chaîne qu'on lui passe en argument mais ce n'est pas garanti.
Je pars quand-même un petit-peu du principe que les fonctions standard sont appelées avec les bons paramètres...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1492067
0x90
Posté le 15-12-2006 à 19:40:09  profilanswer
 

Sve@r a écrit :

C'est vrai, t'as raison mais faut quand-même un minimum. C'est comme si tu me disais "strlen()" renvoie le nb de caractères de la chaîne qu'on lui passe en argument mais ce n'est pas garanti.
Je pars quand-même un petit-peu du principe que les fonctions standard sont appelées avec les bons paramètres...


 
strlen est définit par la norme du C, ce qu'elle renvoie est garanti.
la valeur trouvée dans argv[0] n'est pas définie par la norme du C, ce qu'elle contient n'est pas garanti. Ça peut même être un pointeur NULL.
 
Considérer que argv[0] contient forcément ce que tu attends, c'est exactement comme supposer que ton programme est forcément appelé avec 3 arguments sans le vérifier.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1492209
Sve@r
Posté le 16-12-2006 à 16:32:40  profilanswer
 

0x90 a écrit :

strlen est définit par la norme du C, ce qu'elle renvoie est garanti.


Uniquement si tu lui passes un pointeur sur une zone mémoire à laquelle t'as normallement accès avec la certitude qu'à cette adresse ou dans les suivantes (auxquelles tu dois aussi avoir accès) se trouve un caractère de valeur '\0'.
 
Celui qui utilise "execl()" a aussi l'obligation d'y mettre ce qu'il faut où il faut... mais bon ; je bosse sur Unixoide où les programmeurs ont la réputation (à tord ou à raison, j'en sais rien) d'avoir plus d'éthique que sur d'autres SE...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1492211
0x90
Posté le 16-12-2006 à 16:52:07  profilanswer
 

Sve@r a écrit :


Celui qui utilise "execl()" a aussi l'obligation d'y mettre ce qu'il faut où il faut... mais bon ; je bosse sur Unixoide où les programmeurs ont la réputation (à tord ou à raison, j'en sais rien) d'avoir plus d'éthique que sur d'autres SE...


Non
 
Et sans même prendre en compte execl, voilà ce que dit la norme sur argv[0]:

Citation :


If they are declared, the parameters to the main function shall obey the following
constraints:
— The value of argc shall be nonnegative.
— argv[argc] shall be a null pointer.
— If the value of argc is greater than zero, the array members argv[0] through
    argv[argc-1] inclusive shall contain pointers to strings, which are given
    implementation-defined values by the host environment prior to program startup. The
    intent is to supply to the program information determined prior to program startup
    from elsewhere in the hosted environment. If the host environment is not capable of
    supplying strings with letters in both uppercase and lowercase, the implementation
    shall ensure that the strings are received in lowercase.
— If the value of argc is greater than zero, the string pointed to by argv[0]
    represents the program name; argv[0][0] shall be the null character if the
    program name is not available from the host environment. If the value of argc is
    greater than one, the strings pointed to by argv[1] through argv[argc-1]
    represent the program parameters.
— The parameters argc and argv and the strings pointed to by the argv array shall
    be modifiable by the program, and retain their last-stored values between program
    startup and program termination.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1492334
Sve@r
Posté le 17-12-2006 à 11:04:09  profilanswer
 

0x90 a écrit :

Citation :


— If the value of argc is greater than zero, the string pointed to by argv[0]
    represents the program name; argv[0][0] shall be the null character if the
    program name is not available from the host environment.



Et ben alors ??? argv[0] représente le nom du programme qui peut être null (argv[0][0] peut être le caractère nul) si le nom du programme n'est pas disponible dans l'environnement du host. Dis-moi donc dans quel SE on rencontre un environnement qui ne donne pas le nom du programme ? A part les systèmes embarqués et calculateurs, je ne vois pas...


Message édité par Sve@r le 17-12-2006 à 12:53:03

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1492360
0x90
Posté le 17-12-2006 à 14:15:39  profilanswer
 

If the value of argc is greater than zero
 
Le nom du programme peut être disponible dans l'environnement du host mais on peut recevoir argc=0, argv[0]=NULL tout en étant dans un environnement respectant la norme.
 
(Accessoirement le concept de program name n'est définit nulle part dans la norme)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Trouver path d'un exe

 

Sujets relatifs
[csh] trouver et remplacer[BATCH] Need aide batch touchant au PATH ! Je connais pas les batch :<
Comment configurer le Path sous Tomcat?[PHP... ou autres] trouver les termes liés dans un texte
Obtenir le bon PathTrouver un point dans une chaine
[VBA] trouver le premier jour d'une annee[PYTHON] Trouver le path d'une classe / d'un module
trouver le path d'un fichier exceltrouver le path courant
Plus de sujets relatifs à : Trouver path d'un exe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR