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 :

Conversion de LPTSTR vers TCHAR


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Conversion de LPTSTR vers TCHAR
    Hello all !
    Je viens vers vous car j'ai un soucis (qui l'eût crû...) :
    J'ai un LPTSTR DirectParam ; j'ai aussi un TCHAR *AHK_GUIClass qui est - par défaut - égal à L"AHKClass".
    Dans certains cas, j'ai besoin d'avoir AHK_GUIClass égal à DirectParam.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // plus tôt dans le code, on a :
    TCHAR *AHK_GUIClass = _T("AHKClass");
    //Là, on a :
    LPTSTR DirectParam;
    //blablabla, ici on assigne une valeur à DirectParam (tout marche bien)
    //plus loin :
    AHK_GUIClass = (TCHAR*)DirectParam;
    Mais là, la fenêtre ne se créé pas. En revanche, si on force la main à AHK_GUIClass :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AHK_GUIClass = L"Hello";
    Tout va bien, la classe de la fenêtre est bien ce qu'on a demandé ("Hello").
    Comment dois-je convertir le LPTSTR en TCHAR (enfin, WCHAR_T puisque je suis en unicode) ?

    Merci d'avance !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    je me perds à chaque fois dans tous ces types, mais
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
    si je ne me trompe pas, si tu es en unicode, alors ton LPTSTR est un LPWSTR qui est lui-même un WCHAR* et donc un wchar_t*
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Malheureusement, si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AHK_GUIClass = DirectParam
    Je n'arrive plus à enregistrer la classe de la fenêtre (http://msdn.microsoft.com/en-us/libr...v=vs.85).aspx)
    Quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AHK_GUIClass = (TCHAR*)DirectParam
    Même chose, et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AHK_GUIClass = (TCHAR*)DirectParam[0]
    Ca marche ! Mais la classe n'est pas valeur spécifiée (pour AHK_GUIClass qui vaut "NFH", la classe est #78
    Avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AHK_GUIClass = DirectParam[0]
    Le compilateur me dit "error C2440: '='*: impossible de convertir de 'WCHAR' en 'TCHAR *'", puis me conseille de faire un cast

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    ENCORE plus d'hilarité matutinale :
    En essayant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AHK_GUIClass = _T(""+parameter[0]);
    La classe de la fenêtre devient.... "age monitor". Ce n'est ni ce que j'attendais, ni un texte présent dans mon code...

    EDIT : En fait, si on met "NFH" à l'endroit où j'écris la classe souhaitée, j'obtiens bien "age monitor". Si on met "LOUP", on a "ssage monitor". Le texte "message monitor" n'est présent qu'une fois dans mon code, mais je ne comprends pas pourquoi il atterrit là....

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Tu ne dis pas le type de AHK_GUIClass

    J'ai regardé sur les Internets et en gros:
    1) (@Bousk) LPTSTR -> TCHAR* -> Unicode -> WCHAR* -> wchar_t*
    2) TCHAR -> Unicode -> WCHAR -> wchar_t

    Donc si AHK_GUIClass est un pointeur (soit TCHAR* soit LPTSTR) AHK_GUIClass = DirectParam devrait fonctionner, tant que DirectParam est en vie

    Essayes éventuellement de passer par les macros de conversion A2W pour forcer l'Unicode.

    Et essayes un test style if (sizeof(char) == sizeof(TCHAR)) { /* ANSI */ } else { /* Unicode */ }

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Oups ! En fait WindowClassGUI et AHK_GUIClass sont identiques (dans mon code, c'est AHK_GUIClass partout)
    Donc AHK_GUIClass est déclarée comme suit :
    TCHAR *AHK_GUIClass;

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Quant aux macros, elle requièrent altconv.h et altbase.h que je n'ai pas (j'utilise VS10)

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    As-tu essayé ceci:
    Attention ce code peut faire saigner les yeux
    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
    LPTSTR AHK_GUIClass = malloc(9 * sizeof(WCHAR));
     
    if (sizeof(char) == sizeof(TCHAR)) {
        AHK_GUIClass[0] = 'A';
        AHK_GUIClass[1] = 'H';
        AHK_GUIClass[2] = 'K';
        AHK_GUIClass[3] = 'C';
        AHK_GUIClass[4] = 'l';
        AHK_GUIClass[5] = 'a';
        AHK_GUIClass[6] = 's';
        AHK_GUIClass[7] = 's';
        AHK_GUIClass[8] = '\0';
    } else {
        AHK_GUIClass[0] = L'A';
        AHK_GUIClass[1] = L'H';
        AHK_GUIClass[2] = L'K';
        AHK_GUIClass[3] = L'C';
        AHK_GUIClass[4] = L'l';
        AHK_GUIClass[5] = L'a';
        AHK_GUIClass[6] = L's';
        AHK_GUIClass[7] = L's';
        AHK_GUIClass[8] = L'\0';
    }
     
    / ...
     
    free(AHK_GUIClass);

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Non, mais tout marche bien si les valeurs sont hardcodées...
    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AHK_GUIClass=_T("CotonEtChocolat");
    //OU BIEN
    parameter=_T("CotonEtChocolat");
    AHK_GUIClass=parameter;
    Tout marche. Mais ```parameter``` est variable en fonction de ce qui est lu dans un fichier.
    Je peux vérifier que la valeur de ```AHK_GUIClass``` (après le ```AHK_GUIClass=parameter;```) est la bonne en utilisant MessageBox, et ça correspond au contenu du fichier, tout va bien...
    En résumé, ça bug que quand je j'utilise RegisterClassEx !
    Et je ne vois pas comment utiliser ton code

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    OUPS ! Correction : Quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AHK_GUIClass=Directparam;
    La classe est #78

  11. #11
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Bonjour !
    Sinon :
    LPTSTR => TCHAR*
    LPCTSTR => const TCHAR*

    LPSTR => char*
    LPCSTR => const char*

    LPWSTR => wchar_t*
    LPCWSTR => const whar_t*

    Tu n'as donc aucun cast à faire entre AHK_GUIClass et DirectParam, car ils sont de même type.
    Je dirais donc que s'il te demande un cast à cet endroit c'est que tu as un problème Unicode/MBCS.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  12. #12
    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 as MFC/ATL assez récent, le plus simple est d'utiliser la classe CT2A qui te donne une chaîne de char à partir d'une chaîne de TCHAR.

    Sinon, il te faudra le recoder ou faire un truc similaire.

    Personnellement j'ai ces fonctions de conversion:
    Code C++ : 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
    #include <cwchar>
    #include <string>
    #include <vector>
    #include <exception>
     
    wstring GetWString(string const &src)
    {
    	size_t cchBufSize = 0;
    	errno_t err = mbstowcs_s(&cchBufSize, NULL, 0, src.c_str(), _TRUNCATE);
    	if(err != 0)
    		throw std::runtime_error("Failed to get size of output when converting to wstring.");
     
    	vector<wchar_t> vec(cchBufSize);
    	err = mbstowcs_s(&cchBufSize, &vec.at(0), cchBufSize, src.c_str(), cchBufSize-1);
    	if(err != 0)
    		throw std::runtime_error("Failed to convert to wstring.");
    	wstring ret(&vec.at(0));
    	return ret;
    }
    wstring GetWString(wstring const &src) { return src; }
    string  GetAString(string const &src) { return src; }
    string  GetAString(wstring const &src)
    {
    	size_t cchBufSize = 0;
    	errno_t err = wcstombs_s(&cchBufSize, NULL, 0, src.c_str(), _TRUNCATE);
    	if(err != 0)
    		throw std::runtime_error("Failed to get size of output when converting to string.");
     
    	vector<char> vec(cchBufSize);
    	err = wcstombs_s(&cchBufSize, &vec.at(0), cchBufSize, src.c_str(), cchBufSize-1);
    	if(err != 0)
    		throw std::runtime_error("Failed to convert to string.");
    	string ret(&vec.at(0));
    	return ret;
    }
    Ce n'est pas forcément ce qu'il y a de plus efficace (ça pourrait faire une copie de moins si on n'utilisait pas std::string) mais ça fait le boulot et c'est safe.
    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.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci merci, je vais essayer ça....

Discussions similaires

  1. conversion date timestamp vers date mysql
    Par seb0026 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 13/10/2005, 19h48
  2. [Conversion]Applet Java Vers Java Web Start
    Par robin206 dans le forum JWS
    Réponses: 2
    Dernier message: 20/04/2005, 09h28
  3. [Think Pascal] Portage/conversion Think Pascal vers MAC/Windows/Linux
    Par Alain Vitry dans le forum Autres IDE
    Réponses: 1
    Dernier message: 19/03/2005, 11h24
  4. Conversion distance , angle vers coordonnées de points
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 26/03/2004, 22h55

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