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 :

Difficulté avec l’unicode


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Autodidacte
    Inscrit en
    Janvier 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Autodidacte

    Informations forums :
    Inscription : Janvier 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut Difficulté avec l’unicode
    Bonjour

    Je ne suis pas certain si ma question concerne plus le langage C++ ou l’API Windows, mais voila…

    En suivant un tutoriel, je tente d’utiliser des fonctions de l’API Windows qui ont des paramètres de type LCPWSTR. En les utilisant comme me dit le tutoriel le compilateur me dit que la conversion de char* en LCPWSTR est impossible.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox(NULL, "Vous avez appuyé sur le mauvais bouton.", "ERREUR",  MB_OK|MB_ICONEXCLAMATION);
    Si je tente une conversion explicite du genre (LCPWSTR) , la compilation se termine avec succès, mais à l’exécution les caractères affichés sont des symboles aléatoires.

    Le projet servant d’exemple offert dans le tutoriel fonctionne sans problème et pourtant mon projet exactement identique (c’est ce que je pensais) rencontre des erreurs.

    Je suis certain qu’il ne s’agit que d’un détail, mais je n’arrive pas à trouver d’où vient le problème même après de longues recherches.

    Merci de bien vouloir m’expliquer…

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Ha ! le MBC et l'Unicode !!!!

    Avec Windwos et Visual studio, il y a 2 manières de compiler un projet, en MBCS (Multi Byte Character Set) et en Unicode.

    En MBCS, chaque caractère fait 1 octet pour les code ASCII standards (de 0 à 127) et 2 à plusieurs octets pour les autres caractères (chinois, arabe, thai, ...).
    En Unicode, chaque caractère fait 2 octets.

    Avec Visual Studion tout se fait par la déclaration de la variable du pré processeur UNICODE (et _UNICODE ?). Si elle est définie, c'est un projet Unicode, sinon, c'est un projet MBCS.

    En MBCS, l'unité de base du caractère est le "char"
    En UNICODE, l'unité de base du caractère est le "wchar_t"

    En MBCS, une chaine de caractère se déclare "toto"
    En UNICODE, une chaine de caractères se déclare L"toto"

    Maintenant, les includes file sont fait de telle manière que tu n'ai pas à modifier ton code si tu décide de changer de mode.

    Pour cela, ils définissent
    TCHAR char ou wchar_t selon la macro UNICODE
    LCPTSTR LPSWSTR (const wchar_t *) ou LPCSTR (const char *) selon la macro UNICODE
    et beaucoup d'autre encore

    Il existe une macro _T ou _TEXT qui permet de déclarer une chaine de caractère constante en chaine de caractère MBCS ou Unicode toujours selon la déclaration de la macro UNICODE _T("toto") ou _TEXT("toto")

    Chaque fonction (presque toutes en fait) ont 2 signatures
    CreateFileA : pour la version MBCS
    CreateFileW : pour la version Unicode
    Il existe une macro CreateFile qui pointe sur CreateFileA ou CreateFileW selon la déclaration ou non de UNICODE

    Pour en revenir à ton problème,
    tu appelle la MessageBox qui est une macro qui pointe sur MessageBoxA ou MessageBoxW selon UNICODE

    La chaine de caractères que tu lui passes doit être définie en utilisant la macro _T (ou _TEXT)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox(NULL, _T("Vous avez appuyé sur le mauvais bouton."), _T("ERREUR"),  MB_OK|MB_ICONEXCLAMATION);
    Ainsi tu n'auras pas de problème (ici ) si tu décides de changer de mode (MBCS ou UNICODE)

    Pour développer en mixte MBCS/UNICODE, cela demande de la rigueur (et tu découvriras plein de fonction mixtes)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Autodidacte
    Inscrit en
    Janvier 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Autodidacte

    Informations forums :
    Inscription : Janvier 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    Mon problème est réglé, merci beaucoup.

    Je n’ais pour l’instant pas besoin de me préoccuper de faire du code portable car je ne suis qu’à l’étape des petits programmes test. J’ai donc pu corriger mon problème de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MessageBox(NULL, L"Vous avez appuyé sur le mauvais bouton.", L"ERREUR",  MB_OK|MB_ICONEXCLAMATION);
    Par contre, _T et _TEXT ne sont pas reconnus par le compilateur… D’où viennent ces macro? Dois-je les déclarer moi-même et sinon, par quel fichier sont-il déclarés?

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Cbenlfun Voir le message
    Mon problème est réglé, merci beaucoup.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MessageBox(NULL, L"Vous avez appuyé sur le mauvais bouton.", L"ERREUR",  MB_OK|MB_ICONEXCLAMATION);
    Là, tu as forcé les chaines de caractères à être Unicode. C'est une manière de régler le problème .

    Citation Envoyé par Cbenlfun Voir le message
    Par contre, _T et _TEXT ne sont pas reconnus par le compilateur… D’où viennent ces macro? Dois-je les déclarer moi-même et sinon, par quel fichier sont-il déclarés?
    Dans #include <tchar.h>
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox(NULL, L"Vous avez appuyé sur le mauvais bouton.", L"ERREUR",  MB_OK|MB_ICONEXCLAMATION);
    Attention, vous forcez l'utilisation de chaînes unicodes, il faut donc forcer la méthode unicode de MessageBox, il faut donc utiliser MessageBoxW.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Autodidacte
    Inscrit en
    Janvier 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Autodidacte

    Informations forums :
    Inscription : Janvier 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    Je devrais pouvoir me débrouiller... Je vais me renseigner d'avantage pour faire du code plus élégant.

    Merci de vos explications

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

Discussions similaires

  1. [SSIS][2k5]Difficulté avec SSIS
    Par david71 dans le forum SSIS
    Réponses: 9
    Dernier message: 05/01/2006, 19h28
  2. [JS] Difficulté avec le onmouseover...
    Par Pleymo dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/11/2005, 12h09
  3. [VBA] difficultés avec une requête INSERT
    Par elias dans le forum Access
    Réponses: 7
    Dernier message: 06/09/2005, 14h53
  4. Difficultés avec - onchange - !
    Par zakuli dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/07/2005, 12h00
  5. Difficultés avec TMenuItem.OnDrawItem
    Par ybruant dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/01/2005, 11h07

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