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 :

Convertir char * en LPCWSTR


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut Convertir char * en LPCWSTR
    Bonjour,
    Je parcours tous les fichiers d'un dossier en C++.

    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
     
    ...
    WIN32_FIND_DATA data;
    HANDLE h = FindFirstFile("test/*.*", &data);
    BOOL bMoreFiles =  (h != INVALID_HANDLE_VALUE);
    while (bMoreFiles)
    {
    	if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
    					;
    	}else {
    		using namespace std;
    		ostringstream oss;
    		for (unsigned int j=0 ; j<strlen(data.cFileName); j++)
    			oss << setfill('0') << static_cast<char>(data.cFileName[j]);
    		string s = "test/" + oss.str();
    		std::wstring ws;
    		ws.assign(s.begin(), s.end());
    		cout << ws.c_str() << endl;
     
                    fi.Find(ws.c_str());
     
                    ......
     
     
    	}
    	bMoreFiles = FindNextFile(h, &data);
    }
    ...
    Le problème est que ma méthode fi.Find(...) doit obligatoirement recevoir un LPCWSTR... et moi j'ai un char* (char[260]).

    Pour le moment ca compile mais le COUT ne m'affiche pas le bon nom de fichier, il m'affiche 003A05F8 au lieu de /test/monfichier.txt.

    Et le find ne le trouve donc pas

    Pouvez vous m'aider?

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Moi je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::wstring ws;
    ...
    fi.Find(ws.c_str());
    Donc, tu ne passes pas un char* mais un short* (à mon avis).

    quand je regarde l'aide de FindNextFile, je vois ceci dans la structure data : TCHAR cFileName[MAX_PATH];

    Donc, si tu compiles en UNICODE, tu auras beaucoup moins de souci : adieu std::string, bonjour std::wstring partout !!!

  3. #3
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    LPCWSTR est bien un wchar_t*, tu l'as compris puisque tu utilises une wstring.
    data.cFileName est une array de TCHAR, donc si tu compiles en unicode c'est un wchar_t* également.
    Le problème est donc de rajouter test/ devant.

    Quelque chose comme ca devrait suffire non ? (non testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::wstring ws = std::wstring(L"test/") + std::wstring(data.cFileName);
    fi.Find(ws.c_str());
    On garde tout en wchar_t tout du long, sans passer par des char, et dans tous les cas JAMAIS avec un static_cast, ca n'a pas de sens car les caractères sont encodés différemment.
    Notes le L devant L"test/", qui indique au compilateur que c'est une string de wchar_t, que tu peux rentrer directement dans un wstring.

    Si tu ne compiles pas en unicode, alors data.cFileName est en char, et il va te falloir convertir ta string, ou changer les optiosn de compilation (dans les paramètrs du projet) pour activer l'unicode.

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Merci, ca fonctionne

    Par contre j'ai un autre petit problème pour ce code:
    FindFirstFile("test/*.*", &data) par FindFirstFile(name+"/*.*", &data);

    name étant un UString obligatoirement... et FindFirstFile attend un LCPTSTR comme premier argument...

    Merci d'avance.

  5. #5
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    UString est std::string ?
    L'opérateur + est défini pour les std::string, et ne marche que entre deux std::string. Il renvoie une string, pas un LCPTSTR (sans w, donc char*). Il faut donc préciser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindFirstFile( (name+std::string("/*.*")).c_str(), &data );
    *
    Tu essaies trop de recopier du code ou des schémas connus, essaie de raisonner au moins en terme de types. Pars du type qu'il te faut, et du type que tu as. Vois pour les opérateurs que tu utilises quel type il prend, et quel type il renvoie. Et assure toi que c'est cohérent.

  6. #6
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Dans LCPTSTR il faut imagine ce qu'il y a à la place du T.
    Si tu compiles en UNICODE T = W, sinon T est "vide".

    UNICODE = LCPWSTR (tu peux "jouer" avec des wstring)
    ANSI = LCPSTR (tu peux "jouer" avec des string)

  7. #7
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    Dans LCPTSTR il faut imagine ce qu'il y a à la place du T.
    Autant pour moi, c'est du TCHAR. Si tu compiles en unicode c'est du wchar_t et le code devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindFirstFile( (name+std::wstring(L"/*.*")).c_str(), &data );
    Il faut par contre convertir name en wstring, sinon l'addition ne marche pas.

    Sinon j'ai commencé à regarder un peu les conversions possibles entre string et wstring. En gros il existe 3 encodages qu'on peut utiliser en C++ :
    -ASCII
    -UTF8
    -UTF16/32 suivant la taille de wchar_t

    Un char* en C, c'est considéré ASCII ou UTF8 ? Et un string en C++ ? J'ai toujours pensé ASCII pour les deux, mais les seules méthodes de conversions que je trouve c'est UTF8 <-> UTF16/32, ce qui tendrait à montrer que la bibliothèque standard attend de l'UTF8 dans un char

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/05/2011, 10h57
  2. Convertir char* en string
    Par KorTeX22 dans le forum C++
    Réponses: 5
    Dernier message: 13/03/2007, 11h54
  3. Comparer 2 Char / Convertir Char -> Int
    Par mbk-w dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/06/2006, 11h09
  4. [MFC] convertir LPCTSTR en LPCWSTR ?
    Par MrMaze dans le forum MFC
    Réponses: 4
    Dernier message: 18/04/2005, 18h15

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