IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Récupérer le chemin de l'application en C++


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut Récupérer le chemin de l'application en C++
    Bonjour à tous
    Je voudrais savoir comment retrouver le chemin de l'application, à l'instar du "App.Path" de VB.Net
    Quelqu'un sait-il comment faire ?
    Merci de votre réponse

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    tu l'as dans le premier index de argv dans le main, après tu as des techniques spécifiques selon la plateforme comme GetCommandLine dans processenv.h sous Windows.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Merci à Bousk
    Je suis débutant en C++ et malheureusement je ne comprend rien à tes explications, ni à celles données dans le lien que tu m'as mis.
    Je cherche un truc du genre : chemin = "Le code adéquat"
    Si tu peux m'en dire plus, n’hésites surtout pas
    PS. Je travaille avec VS2017 sous Windows 7

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il n'y a rien qui soit à la fois standard et fiable (notamment, argv[0] peut contenir un alias au lieu du vrai chemin de l'application).
    Résultat, il faut utiliser les moyens non-standard de ta plate-forme.

    Sous Windows, on utilise la fonction GetModuleFileName().
    Voici un exemple en C:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	TCHAR exeFilePath[MAX_PATH] = _T("");
    	GetModuleFileName(NULL, exeFilePath, MAX_PATH);
    	_tprintf(_T("EXE file name: %s"), exeFilePath);
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    J'ai essayé le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    // ConsoleApplication1.cpp*: définit le point d'entrée pour l'application console.
    //
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
     
    #include "stdafx.h"
     
    int main(int argc, _TCHAR* argv[])
    {
    	TCHAR exeFilePath[MAX_PATH] = _T("");
    	GetModuleFileName(NULL, exeFilePath, MAX_PATH);
    	_tprintf(_T("EXE file name: %s"), exeFilePath);
    	return 0;
    }
    J'ai 2 erreurs :
    Erreur C2065 'MAX_PATH'*: identificateur non déclaré
    Erreur C3861 'GetModuleFileName'*: identificateur introuvable

    Il manque quelque chose
    D'autre part c'est une application Windows console, est-ce que "_tprintf" à la place de "cout" fonctionnera ?
    Merci de ton aide

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    #include "stdafx.h"
    C'EST TOUJOURS EN PREMIER !!!

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Merci beaucoup
    Pour #include "stdafx", je n'en avais aucune idée
    En tous les cas ça fonctionne parfaitement

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par bacelar Voir le message
    #include "stdafx.h"
    C'EST TOUJOURS EN PREMIER !!!
    Explication: Quand un "precompiled header" est utilisé, tout ce qui précède le #include correspondant est "sauté" par le compilateur et remplacé par le contenu du fichier d'en-tête précompilé.

    Résultat, les trois inclusions que je t'ai données, le compilo ne les voit plus. Mais tu peux les déplacer vers stdafx.h, il est fait pour ça.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Je te remercie de tes explications.
    A 84 ans, j'ai encore appris quelque chose aujourd’hui et j'en suis bien content

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    C'est encore moi
    Je suis désolé, mais pourrais-tu me dire comment récupérer exeFilePath en string pour l'utiliser comme variable
    Merci d'avance

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    En passant "exeFilePath" comme paramètre du constructeur de la std::string, non ?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    excuse moi, mais à mon petit niveau de connaissance, je crois avoir compris que je devais déclarer "exeFilePath" comme un string, mais il est déjà en TCHAR
    Je suis désolé de mon incompétence actuelle.

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le problème, c'est qu'une std::string n'est pas en Unicode: Sous un Windows occidental, elle sera encodée en Windows-1252, qui ne supporte pas les caractères non-latins.

    Pour bien faire, il te faudrait utiliser un typedef de ce genre, et n'utiliser que le type en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::basic_string<TCHAR> tstring;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Il devrait exister une fonction GetModuleFileNameA pour forcer l'ANSI.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Et elle aussi perdra tout caractère non-latin.
    Hélas, Windows ne peut pas faire marcher ses fonctions "A" en UTF-8.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le problème, c'est qu'une std::string n'est pas en Unicode: Sous un Windows occidental, elle sera encodée en Windows-1252, qui ne supporte pas les caractères non-latins.

    Pour bien faire, il te faudrait utiliser un typedef de ce genre, et n'utiliser que le type en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::basic_string<TCHAR> tstring;
    Mon incompétence sur architecture Windows est notoire, mais ne serait-il pas plus facile de ne pas propager les horreurs microsoftienne au dela des appels aux fonctions systèmes et construire un std::wstring à partir du retour de exeFilePath ?
    -- Yankel Scialom

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Bonjour à tous
    Malgré mon manque de connaissances en C++, je ne suis pas peu fier d'avoir trouvé (tout seul) un début de solution à mon problème.
    J'ai essayé d'extraire les "char" de exeFilePath, et ça marche !!!!
    Voici le code qui y correspond.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    int main()
    {
    	TCHAR exeFilePath[MAX_PATH] = _T("");
    	GetModuleFileName(NULL, exeFilePath, MAX_PATH);
    	_tprintf(_T("EXE file name: %s"), exeFilePath);
    	cout << endl;
    	char lettre;
    	string chemin;
    	try
    	{
    		for(int i(0); i<200; i++)
    		{
    			chemin += (char)exeFilePath[i];
    		}
    	}
    	catch (int e)
    	{
    		cout << "FIN" << endl;
    	}
     
     
    	system("PAUSE");
    	return 0;
    }
    Et j'obtiens le chemin "Y:\\Visual Studio 2017\\Projets\\C++\\ConsoleApplication1\\Debug\\ConsoleApplication1.exe"
    Il me restera à dédoubler les "\\" probablement avec une instruction qui correspondrait à "chaine.replace" qui existe en VB.Net
    En tous les cas merci de votre aide

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Cette "conversion" est extrêmement maladroite et perd non seulement les caractères non-latins, mais aussi les caractères que l'encodage Windows-1252 place dans le bloc C1 (comme le symbole Euro, le ™ ou le œ).

    Citation Envoyé par prgasp77 Voir le message
    Mon incompétence sur architecture Windows est notoire, mais ne serait-il pas plus facile de ne pas propager les horreurs microsoftienne au dela des appels aux fonctions systèmes et construire un std::wstring à partir du retour de exeFilePath ?
    On peut. Notamment, on peut faire déclarer exeFilePath comme un tableau de wchar_t et appeler explicitement GetModuleFileNameW().

    Je tends à préférer la solution TCHAR par contre, afin d'éviter de me fermer à de possibles évolutions futures du SDK.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Votre code est assez inélégant et est extrêmement dangereux car il ne fonctionnera qu'avec la constante de compilation "UNICODE" non défini.
    Cela rend l'usage de TCHAR complètement inutile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    typedef std::basic_string<TCHAR> tstring;
     
    int main()
    {
    	TCHAR exeFilePath[MAX_PATH] = _T("");
    	GetModuleFileName(NULL, exeFilePath, MAX_PATH);
    	_tprintf(_T("EXE file name: %s"), exeFilePath);
    	std::cout << endl;
     
    	tstring chemin{exeFilePath};
     
    	std::cout <<  chemin <<std::endl
     
    	return 0;
    }

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Cela n'est pas un problème pour moi car je n'aurais que des caractères ascii dans un chemin de fichier et de toute façon ce ne sont que des programmes destinés à apprendre le C++.

    Je n'ai pas encore trouvé le code permettant de supprimer un '\' sur deux en C++, si vous avez une idée, je suis preneur

Discussions similaires

  1. [Débutant] Récupérer le chemin de mon application
    Par amine1980 dans le forum C#
    Réponses: 3
    Dernier message: 27/09/2012, 12h08
  2. Récupérer chemin de l'application
    Par jojo86 dans le forum Langage
    Réponses: 1
    Dernier message: 13/01/2008, 12h06
  3. Récupérer le chemin de l'application
    Par Claude_Azoulai dans le forum ASP.NET
    Réponses: 3
    Dernier message: 24/11/2007, 17h30
  4. [RCP] Récupérer le chemin du répertoire d'une application RCP
    Par nienor dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 21/03/2007, 09h56
  5. [VB.NET]Récupérer le chemin de l'application
    Par gust dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/12/2005, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo