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
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
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.
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
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; }
J'ai essayé le code suivant
J'ai 2 erreurs :
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; }
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
#include "stdafx.h"
C'EST TOUJOURS EN PREMIER !!!
Merci beaucoup
Pour #include "stdafx", je n'en avais aucune idée
En tous les cas ça fonctionne parfaitement
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.
Je te remercie de tes explications.
A 84 ans, j'ai encore appris quelque chose aujourd’hui et j'en suis bien content
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
En passant "exeFilePath" comme paramètre du constructeur de la std::string, non ?
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.
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;
Il devrait exister une fonction GetModuleFileNameA pour forcer l'ANSI.
Et elle aussi perdra tout caractère non-latin.
Hélas, Windows ne peut pas faire marcher ses fonctions "A" en UTF-8.
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.
Et j'obtiens le chemin "Y:\\Visual Studio 2017\\Projets\\C++\\ConsoleApplication1\\Debug\\ConsoleApplication1.exe"
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; }
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
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 œ).
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.
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; }
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager