Je cherche à récupérer le nom de l'exe courant. Sur le net, j'ai bien
trouvé
la fonction AfxGetAppName(), mais j'ai toujours la meme erreur que voici :
|> En , Emmanuel Delahaye va |> escriure: |> > Philippe wrote on 15/09/04 : |> >> Tu l'as directement dans les arguments du main :
|> > Pas forcément.
|> Si. Voir ci-dessous pourquoi.
|> > Ce n'est pas garanti par la norme.
|> Mais cela vaut le coup d'essayer, c'est quand même BEAUCOUP plus |> facile que d'essayer de marner avec AfxGetAppName, non?
Mais ça marche moins bien.
|> De plus, même si la norme seule ne _garantit_ rien (de fait, la |> norme ne garantit pas non plus qu'un programme qui ne soit pas |> strictement conforme additionne 1 quand tu utilise ++ sur un |> entier), la norme précise que si argc est supérieur à 0, la chaîne |> pointée par argv[0] vaut soit la chaîne vide (ce qui indique que le |> nom du programme n'est pas mis à disposition du programme par |> l'environnement d'exécution), soit le « nom du programme ».
C'est vrai. Malheureusement, je ne connais aucune implémentation conforme à cet égard sous Unix (ou le « nom du programme » n'est simplement pas disponible, et n'a même pas réelement un sens). Et VC++ (au moins 6.0) n'en est pas conforme non plus, et je soupçonne que ce soit général sous Windows.
|> On peut ergoter sur le fait que la norme ne définit pas que ce « nom |> du programme » soit effectivement le (ou un) nom du fichier |> exécutable (démonstration par Richard que certaines implémentations |> de Linux peuvent renvoyer des équivalents symboliques de ce nom; de |> plus, la notion même de fichier exécutable est hors du cadre de la |> norme du langage).
Sous Unix, un fichier peut réelement avoir plusieurs noms. Ou aucun, s'il est encore ouvert. Mais que ce soit Unix ou Windows, ce qu'on a dans argv[0] n'est pas le nom du programme, mais ce que le programme qui a lancé notre programme a bien voulu mettre. Et si la convention d'y mettre le nom du programme (pour une définition de nom du programme qui n'est pas toujours identique) est assez respectée des shells, il en est tout autrement par d'autres programmes.
|> Mais comme celui qui a posé la question a précisé l'implémentation, |> donc on peut lui répondre en se référant aux documents qui |> accompagne la dite implémentation (et je rappelle ici que la |> conformité à la norme C IMPOSE la fourniture de ce document, clause |> 4. paragraphe 8, autrement dit que le comportement d'un compilateur |> n'est pas seulement défini par la seule norme mais aussi par le dit |> document; et jusque là, je ne fais que me conformer à la norme.)
|> Et il se trouve que dans le cas précis le dit document précise |> (http://msdn.microsoft.com/library/en-us/vclang/html/_CLANG_Arguments_to_mai |> n.asp) que « the name of the executable file is placed in argv[0]. »
|> Paraît pas mal ressembler à ce qu'il cherchait, non ?
Malheureusement, il ne correspond pas à la réalité. (Il y a aussi la question : quel est le nom du fichier executable ? Est-ce qu'il comprend le chemin depuis c:, ou non, par exemple ?)
-- James Kanze Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
"Antoine Leca" <root@localhost.gov> writes:
|> En mn.7d117d49564fc846.15512@YOURBRAnoos.fr, Emmanuel Delahaye va
|> escriure:
|> > Philippe wrote on 15/09/04 :
|> >> Tu l'as directement dans les arguments du main :
|> > Pas forcément.
|> Si. Voir ci-dessous pourquoi.
|> > Ce n'est pas garanti par la norme.
|> Mais cela vaut le coup d'essayer, c'est quand même BEAUCOUP plus
|> facile que d'essayer de marner avec AfxGetAppName, non?
Mais ça marche moins bien.
|> De plus, même si la norme seule ne _garantit_ rien (de fait, la
|> norme ne garantit pas non plus qu'un programme qui ne soit pas
|> strictement conforme additionne 1 quand tu utilise ++ sur un
|> entier), la norme précise que si argc est supérieur à 0, la chaîne
|> pointée par argv[0] vaut soit la chaîne vide (ce qui indique que le
|> nom du programme n'est pas mis à disposition du programme par
|> l'environnement d'exécution), soit le « nom du programme ».
C'est vrai. Malheureusement, je ne connais aucune implémentation
conforme à cet égard sous Unix (ou le « nom du programme » n'est
simplement pas disponible, et n'a même pas réelement un sens). Et VC++
(au moins 6.0) n'en est pas conforme non plus, et je soupçonne que ce
soit général sous Windows.
|> On peut ergoter sur le fait que la norme ne définit pas que ce « nom
|> du programme » soit effectivement le (ou un) nom du fichier
|> exécutable (démonstration par Richard que certaines implémentations
|> de Linux peuvent renvoyer des équivalents symboliques de ce nom; de
|> plus, la notion même de fichier exécutable est hors du cadre de la
|> norme du langage).
Sous Unix, un fichier peut réelement avoir plusieurs noms. Ou aucun,
s'il est encore ouvert. Mais que ce soit Unix ou Windows, ce qu'on a
dans argv[0] n'est pas le nom du programme, mais ce que le programme qui
a lancé notre programme a bien voulu mettre. Et si la convention d'y
mettre le nom du programme (pour une définition de nom du programme qui
n'est pas toujours identique) est assez respectée des shells, il en est
tout autrement par d'autres programmes.
|> Mais comme celui qui a posé la question a précisé l'implémentation,
|> donc on peut lui répondre en se référant aux documents qui
|> accompagne la dite implémentation (et je rappelle ici que la
|> conformité à la norme C IMPOSE la fourniture de ce document, clause
|> 4. paragraphe 8, autrement dit que le comportement d'un compilateur
|> n'est pas seulement défini par la seule norme mais aussi par le dit
|> document; et jusque là, je ne fais que me conformer à la norme.)
|> Et il se trouve que dans le cas précis le dit document précise
|> (http://msdn.microsoft.com/library/en-us/vclang/html/_CLANG_Arguments_to_mai
|> n.asp) que « the name of the executable file is placed in argv[0]. »
|> Paraît pas mal ressembler à ce qu'il cherchait, non ?
Malheureusement, il ne correspond pas à la réalité. (Il y a aussi la
question : quel est le nom du fichier executable ? Est-ce qu'il comprend
le chemin depuis c:, ou non, par exemple ?)
--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
|> En , Emmanuel Delahaye va |> escriure: |> > Philippe wrote on 15/09/04 : |> >> Tu l'as directement dans les arguments du main :
|> > Pas forcément.
|> Si. Voir ci-dessous pourquoi.
|> > Ce n'est pas garanti par la norme.
|> Mais cela vaut le coup d'essayer, c'est quand même BEAUCOUP plus |> facile que d'essayer de marner avec AfxGetAppName, non?
Mais ça marche moins bien.
|> De plus, même si la norme seule ne _garantit_ rien (de fait, la |> norme ne garantit pas non plus qu'un programme qui ne soit pas |> strictement conforme additionne 1 quand tu utilise ++ sur un |> entier), la norme précise que si argc est supérieur à 0, la chaîne |> pointée par argv[0] vaut soit la chaîne vide (ce qui indique que le |> nom du programme n'est pas mis à disposition du programme par |> l'environnement d'exécution), soit le « nom du programme ».
C'est vrai. Malheureusement, je ne connais aucune implémentation conforme à cet égard sous Unix (ou le « nom du programme » n'est simplement pas disponible, et n'a même pas réelement un sens). Et VC++ (au moins 6.0) n'en est pas conforme non plus, et je soupçonne que ce soit général sous Windows.
|> On peut ergoter sur le fait que la norme ne définit pas que ce « nom |> du programme » soit effectivement le (ou un) nom du fichier |> exécutable (démonstration par Richard que certaines implémentations |> de Linux peuvent renvoyer des équivalents symboliques de ce nom; de |> plus, la notion même de fichier exécutable est hors du cadre de la |> norme du langage).
Sous Unix, un fichier peut réelement avoir plusieurs noms. Ou aucun, s'il est encore ouvert. Mais que ce soit Unix ou Windows, ce qu'on a dans argv[0] n'est pas le nom du programme, mais ce que le programme qui a lancé notre programme a bien voulu mettre. Et si la convention d'y mettre le nom du programme (pour une définition de nom du programme qui n'est pas toujours identique) est assez respectée des shells, il en est tout autrement par d'autres programmes.
|> Mais comme celui qui a posé la question a précisé l'implémentation, |> donc on peut lui répondre en se référant aux documents qui |> accompagne la dite implémentation (et je rappelle ici que la |> conformité à la norme C IMPOSE la fourniture de ce document, clause |> 4. paragraphe 8, autrement dit que le comportement d'un compilateur |> n'est pas seulement défini par la seule norme mais aussi par le dit |> document; et jusque là, je ne fais que me conformer à la norme.)
|> Et il se trouve que dans le cas précis le dit document précise |> (http://msdn.microsoft.com/library/en-us/vclang/html/_CLANG_Arguments_to_mai |> n.asp) que « the name of the executable file is placed in argv[0]. »
|> Paraît pas mal ressembler à ce qu'il cherchait, non ?
Malheureusement, il ne correspond pas à la réalité. (Il y a aussi la question : quel est le nom du fichier executable ? Est-ce qu'il comprend le chemin depuis c:, ou non, par exemple ?)
-- James Kanze Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34