Trouver path d'un exe - C - Programmation
Marsh Posté le 14-12-2006 à 20:58:32
Sous windows : CreateToolhelp32Snapshot + Module32First + Module32Next.
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
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 ??
Marsh Posté le 14-12-2006 à 21:47:25
getcwd
Marsh Posté le 14-12-2006 à 22:19:55
Ah ok, c'est pour ton programme, GetModuleFileName est plus approprié en effet.
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.
0x90 a écrit : getcwd |
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
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. |
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 :
|
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() )
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...
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.
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...
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. |
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.
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...
Marsh Posté le 16-12-2006 à 16:52:07
Sve@r a écrit : |
Non
Et sans même prendre en compte execl, voilà ce que dit la norme sur argv[0]:
Citation : |
Marsh Posté le 17-12-2006 à 11:04:09
0x90 a écrit :
|
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...
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)
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 :
ctravail/prog
(dans ce cas, le programme prog.exe saurait qu'il a a été exécuté à partir de Ctravail/)
merci par avance!