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

MFC Discussion :

Passage vers Unicode


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    907
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 907
    Points : 372
    Points
    372
    Par défaut Passage vers Unicode
    Bonjour,

    Je dois passer un programme en Unicode, je definie _UNICODE, mais à la compilation il y a beaucoup d'erreurs.

    Quelqu'un pourrais il m'indiquer la procédure ?

    Merci,
    Christophe,

  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
    Bonjour,
    1. Il faut définir à la fois _UNICODE et UNICODE.
    2. Le programme doit être correctement écrit pour supporter d'être compilé dans les deux modes (emploi des TCHAR, conversion conditionnelle quand certaines fonctions exigent l'un ou l'autre type de chaîne... (Facilité par les CStringT de MFC 7))
    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 du Club
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Points : 43
    Points
    43
    Par défaut
    Effectivement tu peux utiliser TCHAR comme type. Le principe est que le preprocesseur va remplacer TCHAR par wchar_t ou char selon que tu compiles en Unicode ou non.

    Le point d'entree de ton programme doit être wWinMainCRTStartup

    Le changement majeur est que tes caracteres ne seront plus codés sur un octet, mais sur au moins deux. Du coup, les fonctions du CRT ne fonctionnent pas en version ANSI sur des buffer Unicode.
    Tu trouveras tous les équivalents dans tchar.h ou à cette adresse :
    http://msdn.microsoft.com/library/de...e_mappings.asp


    Qu'est-ce que fait ton programme ??

    Quels sont les types d'erreurs que tu as ??

    Mais renseigne toi sur le sujet avant de te lancer, ce n'est pas tres long de comprendre comment gérer des buffers Unicode sous Windows et ca te fera gagner énormément de temps pour corriger les erreur de compil.

  4. #4
    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
    Le point d'entree de ton programme doit être wWinMainCRTStartup
    Gaffe à ce que tu dis, là...
    Cette fonction ne doit pas être définie par l'utilisateur, elle est fournie par la CRT. Par contre, c'est elle qui appelle le main()...


    En TCHAR, le main() doit s'appeler _tmain().
    Ou si tu as une application fenêtrée, WinMain() doit s'appeler _tWinMain() (mais en MFC, tu ne verras ni l'une ni l'autre de toute façon).
    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.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Points : 43
    Points
    43
    Par défaut
    Désolé du manque de précision Médinoc.
    Christophe, En MFC, tu ne définis pas le point d'entrée. En fait ton point d'entrée est la fonction InitInstance de ton objet APP.
    Pour que la fonction InitInstance, mappe le bon point d'entrée tu dois définir dans les settings de ton projet (sous VC6, Project-->Settings-->Link. Category-->Output. Entry Point Symbol = wWinMainCRTStartup).

  6. #6
    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 pense que c'est inutile, ça : Il me semble bien que c'est choisi par défaut selon les réglages et le nom de la fonction main utilisée (enfin, peut-être pas sous Visual 6, tout compte fait).

    Il faudrait éviter de s'exiter avec le point d'entrée, que je n'ai jamais eu à changer en 4.5 ans de prog sous Visual 6 puis 8...
    (sauf la fois où j'ai bricolé un programme sans la CRT, bien sûr...)
    Edit: Normal, j'oubliais de changer le main()...
    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.

  7. #7
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Points : 43
    Points
    43
    Par défaut
    Médinoc,

    Chez moi sous VC6 (je ne crois pas que ce soit le cas en VC8), j'ai une erreur unresolved external symbol _WinMain@16 si je ne définis pas le point d'entrée wWinMainCRTStartup pour mon projet.
    Je ne sais pas comment faire autrement, si tu as une solution je suis preneur.

  8. #8
    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 suis en train de tester (projet MFC Dialog-based), mais pour l'instant je dois modifier mon instal de Visual 6 : Je n'ai pas les versions unicode de MFC installées...

    Si tu avais ce genre d'erreur pour d'autres types de projets (plus simples), n'hésite pas à me prévenir avant que je ne perde trop de temps là-dessus...

    Edit: En effet, sous Visual 6, il faut changer le point d'entrée si on change de main().
    Et passer un projet MFC en unicode change automatiquement de main().
    C'est pour cela que ça passait inaperçu pour mes propres projets, puisque je laissais le vieux main() ou WinMain() non-unicode...
    Edit2 : Ah ben non en fait, pas besoin pour un simple projet console, si on pense à inclure tchar.h
    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.

  9. #9
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Points : 43
    Points
    43
    Par défaut
    Sous VC8, le pb reste le même.

    Dixit microsoft :
    Synthèse de la programmation Unicode

    Pour tirer parti de la prise en charge MFC et de la bibliothèque Runtime C pour Unicode, vous devez :

    *Définir _UNICODE.
    Définissez le symbole _UNICODE avant de générer votre programme.
    *Spécifier un point d'entrée.

    Dans la page Sortie du dossier Éditeur de liens de la boîte de dialogue Pages de propriétés du projet, définissez le symbole de point d'entrée à wWinMainCRTStartup.

    *Utiliser des fonctions et des types portables.

    Utilisez les fonctions runtime C correctes pour la gestion des chaînes Unicode. Vous pouvez utiliser la famille de fonctions wcs, mais vous pouvez préférer les macros portables _TCHAR (compatible pour l'internationale). Ces macros utilisent un préfixe _tcs et remplacent les fonctions de la famille str. Ces fonctions sont décrites en détail dans la section Internationalisation de la référence de la bibliothèque Runtime. Pour plus d'informations, consultez Mappages de texte générique dans Tchar.h.

    Utilisez _TCHAR et les types de données portables associées décrites dans Prise en charge pour Unicode.

  10. #10
    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
    Si tu changes l'unicode sous VC8 uniquement en jouant avec les defines, c'est normal que le problème reste.
    Mais dans la section "General" des propriétés du projet, tu as une option "Character set", qui permet de tout changer sans problème avec le point d'entrée.

    PS: Cette doc n'est pas assez claire. _UNICODE suffit pour la CRT et pour MFC, mais l'api Win32 utilise UNICODE à la place. Il faut donc que les deux soient définis en même temps, ou aucun.
    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.

  11. #11
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Points : 43
    Points
    43
    Par défaut
    Donc voila une bonne synthese Christophe, le passage à Unicode, c'est le bordel !!!

    Mais une fois que tu as compris le principe, et surtout si tu peux éviter de mixer UNICODE et ANSI dans un meme projet, ca roule tout seul.
    Avec les MFC, sous VC6, tu n'as pas appeler explicitement la version ANSI ou UNICODE d'une methode, c'est fait automatiquement pour toi.
    Avec l'api Win32, tu peux faire un appel explicite. La plupart des fonctions, ayant une extension A ou W. Mais ici aussi, la bonne version de ta fonction sera appelée automatiquement.

    ex : lstrlen (macro) pointe sur :
    En ANSI --> lstrlenA
    En Unicode --> lstrLenW

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

Discussions similaires

  1. Conversion de chaine vers unicode
    Par viny dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 08/01/2007, 22h22
  2. [JVCL] probleme passage ver 3.1 -> 3.2
    Par TicTacToe dans le forum Delphi
    Réponses: 3
    Dernier message: 07/12/2006, 13h29
  3. conversion chaîne multioctets vers unicode
    Par Bruno75 dans le forum Delphi
    Réponses: 1
    Dernier message: 25/09/2006, 15h53
  4. Conversion Ansi vers Unicode
    Par FamiDoo dans le forum C++
    Réponses: 10
    Dernier message: 10/08/2006, 14h31
  5. cyrilique vers unicode
    Par oFlex dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/07/2006, 01h21

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