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 :

Retrouver le dossier application data (SHGetFolderPath)


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Par défaut Retrouver le dossier application data (SHGetFolderPath)
    Bonjour,

    J'ai besoin de retrouver le chemin vers le dossier application data. Pour cela j'utilise la fonction SHGetFolderPath avec comme CSID: CSIDL_APPDATA

    J'ai donc le code suivant pour m'afficher le chemin.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include <iostream>
    #include <sstream>
    #include <Windows.h> // for MAX_PATH
    #include <shlobj.h> // for getFolderPath function
     
    using namespace std;
     
    // Convert TCHAR to string
    std::string TcharsToString(TCHAR const * scz)
    {
        #ifdef UNICODE
        std::ostringstream ossA;
        ossA << scz;
        return ossA.str();
        #else
        return scz;
        #endif
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout << "Get Application Data"<< endl;
    	string path="";
    	TCHAR szPath[MAX_PATH];
    	if(SUCCEEDED(SHGetFolderPath(NULL, 
                                 CSIDL_APPDATA, 
                                 NULL, 
                                 0, 
                                 szPath))) 
    	{
    		path = TcharsToString(szPath);
    	}
    	cout << path << endl;
    	system("PAUSE");
    	return 0;
    }
    Le problème c'est que ça me retourne une chaine de caractère genre
    0012FD24

    Je ne devrais pas recevoir quelque chose du style C:\documents and settings\... ?

    Je ne vois pas où est le problème. Est-ce la conversion TCHAR -> string qui pose problème? Pouvez-vous m'aidez?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Si UNICODE est défini, TcharsToString va exécuter l'instruction ossA << scz puis retourner ossA.str(). or scz est un TCHAR const * (donc WCHAR const *) et ossA, ne sachant pas que faire de ce pointeur qui n'est pas un CHAR const *, va simplement imprimer sa valeur. Remplacer std::ostreamstring par std::wostringstream éradiquerait déjà le problème (il conviendra donc également de remplacer e nom d la variable ossA par quelque chose de plus parlant comme ossW, etc.). Il existe également bien d'autres solutions C++ standard mais en fait, la meilleure solution aux problèmes de ce type c'est tout simplement d'appeler directement la fonction la plus appropriée (c'est-à-dire dans notre cas, appeler directement SHGetFolderPathA (car path est de type string) au lieu d'appeler SHGetFolderPath).

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Par défaut
    Merci Melem pour ta réponse.

    J'ai donc changer mon code en utilisant SHGetFolderPathA plutôt que SHGetFolderPath et ça marche bien maintenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
           char szPath[MAX_PATH]; 
    	if(SUCCEEDED(SHGetFolderPathA(NULL, 
                                 CSIDL_LOCAL_APPDATA, //CSIDL_LOCAL_APPDATA
    											// CSIDL_APPDATA
                                 NULL, 
                                 0, 
                                 szPath))) 
     
    	{
    		path = szPath;
    	}
    Merci beaucoup pour ces précisions

  4. #4
    Invité
    Invité(e)
    Par défaut
    C'est un choix de ta part que ton programme utilise le jeu de caractères Unicode ?

Discussions similaires

  1. Réponses: 9
    Dernier message: 09/01/2015, 17h19
  2. Connaitre le chemin du dossier Application Data
    Par bakaneko dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/03/2010, 00h20
  3. Réponses: 2
    Dernier message: 11/03/2007, 17h51
  4. Mon répertoire %UserProfile%\Application Data\Identities\
    Par Lorponos dans le forum Windows XP
    Réponses: 5
    Dernier message: 23/07/2006, 22h24
  5. [D7][Oracle 8i] "Opération non applicable" + DataS
    Par Magnus dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/11/2005, 08h36

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