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 �clair�
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    #include "stdafx.h"
    C'EST TOUJOURS EN PREMIER !!!

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    En passant "exeFilePath" comme param�tre du constructeur de la std::string, non ?

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 Expert
    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 : 38
    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
    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 ?

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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. 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