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

Windows Discussion :

WideCharToMultiByte me convertis que les 4 premiers caractères de chaque chaines


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut WideCharToMultiByte me convertis que les 4 premiers caractères de chaque chaines
    Bonjours tout le monde,

    J'ai besoin de convertir un WCHAR en CHAR, j'essai avec la fonction WideCharToMultiByte, mais elle me convertis seulement les 4 premiers caractère à chaque fois.

    Pourtant, la variable qui reçoit la conversion a une taille sufisante pour tout recevoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char nomConvertis[30];
    
    WideCharToMultiByte(CP_ACP, NULL, infos->usri0_name, sizeof(infos->usri0_name), nomConvertis, sizeof(nomConvertis), NULL, NULL);
    Je n'arrive pas à voir d'où peut venir le problème.
    Si vous avez une idée, n'hésitez pas.

    Merci.
    A+, Pierre.

  2. #2
    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
    Je parie que infos->usri0_name est un pointeur et non un tableau...

    Mon conseil: Utilise la macro ARRAYSIZE() au lieu de sizeof:
    Sous Visual, la version C++ de ARRAYSIZE() utilise un template pour ne marcher QUE sur les tableaux, ce qui peut aider à éviter ce genre d'erreur.
    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.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    Ah oui, bien joué Médinoc !

    Effectivement, je lui filais la taille du pointeur au lieu de la taille de la variable ...

    Je compile avec GCC, et GCC ne connait pas ARRAYSIZE(), donc faut que je me débrouille avec sizeof([type de la variable usri0_name])

    J'ai essayé sizeof(WCHAR), mais avec ça il ne m'affiche que deux caractères ...
    Sur la doc MSDN, usri0_name est déclaré comme LPWSTR, j'ai essayé sizeof(WSTR), mais ça ne marche pas.

    Comment trouver quel serait la taille à lui dire directement (par exemple : 10), sans que ça soit trop gros (pourait créer un bug je pense) ?

    Merci.
    Pierre.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    en fait les choses sont beaucoup plus simples que ça :

    - si infos->usri0_name est une chaine standard (avec un \0 terminal) tu peux passer -1 comme nombre de caractères à convertir (ce qui garantit en plus la conversion du \0 terminal ... si le buffer cible est suffisamment grand).

    - si infos->usri0_name n'a pas de \0 terminal, sa longueur est forcément connue d'avance (sinon il y a un sérieux pb de conception ) et il suffit donc de la passer telle quelle à la fonction de conversion. Attention: il me semble que dans ce cas il faut ajouter manuellement le \0 terminal dans le buffer cible après la conversion.
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/10/2007, 11h31
  2. Garder que les 10 premiers caractère d'une variable
    Par dembroski dans le forum Langage
    Réponses: 2
    Dernier message: 27/06/2007, 16h18
  3. Réponses: 2
    Dernier message: 19/06/2007, 16h37
  4. Réponses: 3
    Dernier message: 09/05/2007, 11h39
  5. supprimer les 10 premiers caractères de chaques lignes
    Par herzleid dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 06/02/2007, 11h09

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