Trouver path d'un exe

Trouver path d'un exe - C - Programmation

Marsh Posté le 14-12-2006 à 20:49:11    

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!

Reply

Marsh Posté le 14-12-2006 à 20:49:11   

Reply

Marsh Posté le 14-12-2006 à 20:58:32    

Sous windows : CreateToolhelp32Snapshot + Module32First + Module32Next.

Reply

Marsh Posté le 14-12-2006 à 21:02:40    

???
 
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
Reply

Marsh Posté le 14-12-2006 à 21:29:33    

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 ??

Reply

Marsh Posté le 14-12-2006 à 21:47:25    

Reply

Marsh Posté le 14-12-2006 à 22:19:55    

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

Reply

Marsh Posté le 14-12-2006 à 23:04:27    

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.
Reply

Marsh Posté le 14-12-2006 à 23:15:53    

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.
Reply

Marsh Posté le 15-12-2006 à 01:31:48    

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.
Reply

Marsh Posté le 15-12-2006 à 01:35:05    

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.
Reply

Marsh Posté le 15-12-2006 à 01:35:05   

Reply

Marsh Posté le 15-12-2006 à 19:30:52    

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.
Reply

Marsh Posté le 15-12-2006 à 19:40:09    

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.
Reply

Marsh Posté le 16-12-2006 à 16:32:40    

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.
Reply

Marsh Posté le 16-12-2006 à 16:52:07    

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.
Reply

Marsh Posté le 17-12-2006 à 11:04:09    

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.
Reply

Marsh Posté le 17-12-2006 à 14:15:39    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed