OVH Cloud OVH Cloud

Recupérer le nom de l'exe courant

11 réponses
Avatar
rigo
Bonjour,

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 :

error C2065: 'AfxGetAppName' : undeclared identifier.

J'ai bien mis #include "stdafx.h", mais a priori, ce n'est pas la bonne.

Sinon, j'ai essayé :

char * pzsDest
GetModuleFileName(NULL, pszDest, MAX_PATH);

mais ca fait plante en arrivant sur la fonction, une fois compilé.

J'aimerais donc savoir ce qu'il faut ajouter pour que cela fonctionne, ou
si
il existe d'autre fonction qui permette d'y arriver.

J'utilise VC++, je débute et voila.

Merci d'avance

-- Rigo --




--

questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad abuse@newsland.it

1 réponse

1 2
Avatar
James Kanze
"Antoine Leca" writes:

|> 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
1 2