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 LPCTSTR vers string


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut Conversion LPCTSTR vers string
    Bonjour,
    Voici un petit code devant permettre d'afficher un message box en fonction de paramètres choisis pas l'utilisateur. Le voici :

    #include <stdio.h>
    #include <windows.h>
    #include <iostream>
    #include <sstream>

    using namespace std;

    template<typename T>
    std::string to_string( const T & Value )
    {
    // utiliser un flux de sortie pour créer la chaîne
    std::ostringstream oss;
    // écrire la valeur dans le flux
    oss << Value;
    // renvoyer une string
    return oss.str();
    }

    int main()
    {
    std::string sIpText;
    std::string sIpCaption;
    LPCTSTR IpText;
    LPCTSTR IpCaption;
    UINT uType;
    char key;

    cout << "Message Box Text:" << endl;
    cin >> sIpText;
    cout << "Message Box Title:" << endl;
    cin >> sIpCaption;
    cout << "Message Box Type:" << endl;
    cout << "(a) Error" << endl;
    cout << "(b) Exclamation" << endl;
    cout << "(c) Information" << endl;
    cout << "(d) Question " << endl;

    switch(key)
    {
    case 'a':
    uType = MB_ICONERROR;
    break;

    case 'b':
    uType = MB_ICONEXCLAMATION;
    break;

    case 'c':
    uType = MB_ICONINFORMATION;
    break;

    case 'd':
    uType = MB_ICONQUESTION;
    break;

    default:
    return EXIT_SUCCESS;
    break;
    }

    IpText = to_string(sIpText);
    IpCaption = to_string(sIpCaption);

    MessageBox(0, IpText, IpCaption, MB_TASKMODAL);

    system("PAUSE");
    }
    Mais la conversion ne fonctionne pas. Voici ce que me dit le compilateur :
    61 cannot convert `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `const TCHAR*' in assignment
    pour les deux lignes :
    IpText = to_string(sIpText);
    IpCaption = to_string(sIpCaption);

    Quelqu'un pourrait-il m'aider ?
    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Quelqu'un pourrait-il m'aider ?
    Lis ton code, ça devrait suffire.
    Il faut utiliser sIpText et pas IpText par exemple.

  3. #3
    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
    Citation Envoyé par The Lord of Nesquik
    Mais la conversion ne fonctionne pas. Voici ce que me dit le compilateur :

    pour les deux lignes :
    IpText = to_string(sIpText);
    IpCaption = to_string(sIpCaption);

    Merci d'avance.
    le template to_string() sert à convertir un objet quelconque en string; son retour ne peut-être que du type string, donc l'utiliser pour sortir un LPCTSTR n'a pas de sens...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Ha oui je me suis gourré de conversion !
    Et...comment on fait pour convertir une string en LPCTSTR ? ^^
    [EDIT] C'est bon ! (FAQ)
    Merci !

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Et...comment on fait pour convertir une string en LPCTSTR ? ^^
    Tu peux pas (en supposant que LPCTSTR c'est TCHAR*).
    Néanmoins tu peux facilement obtenir un const char* à partir d'un std::string, ce qui devrait suffire si tu veux pas passer en Unicode.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Tu ne peux pas directement, mais il me semble par contre que les CONSTRUCTEURS de std::string/std::wstring acceptent indépendamment des caractères courts ou larges (À moins que ce ne soient les stream, dans ce cas ostringstream aidera).

    À ce moment-là, pour convertir en LPCWSTR, (ou LPCTSTR si tu compiles en unicode); il suffit de passer par une wstring et d'appeler sa méthode c_str().

    Mon conseil, pour ne pas trop t'embêter avec les #ifdef UNICODE, c'est de refaire quelques typedefs
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifdef _UNICODE //Pour la CRT, c'est la version avec underscore
    typedef std::wstring tstring;
    typedef std::wostringstream tostringstream;
    #else
    typedef std::string tstring;
    typedef std::ostringstream tostringstream;
    #endif
    À ce moment-là, il te suffit d'instancier une tstring (ou si le constructeur ne l'accepte pas, de passer par un tostringstream) pour récupérer un LPCTSTR en appelant la méthode tstring::c_str().

    Edit: Si c'est bon, clique sur

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Ben j'ai pas tout compris.
    Et puis dans la FAQ, y'avais écrit mot pour mot "Comment convertir une string en un objet de n'importe quel type ?"
    Alors j'ai essayé ca :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <stdio.h>
    #include <windows.h>
    #include <iostream>
    #include <sstream>
     
    using namespace std;
     
    template<typename T>
    bool from_string( const std::string & Str, T & Dest )
    {
        // créer un flux à partir de la chaîne donnée
        std::istringstream iss( Str );
        // tenter la conversion vers Dest
        return iss >> Dest != 0;
    }
     
     
    int main()
    {    
        std::string sIpText;
        std::string sIpCaption;
        LPCTSTR IpText;
        LPCTSTR IpCaption;
        UINT uType;
        char key;
     
        cout << "Message Box Text:" << endl;
        cin >> sIpText;
        cout << "Message Box Title:" << endl;
        cin >> sIpCaption;
     
        //cout << "Message Box Type:" << endl;
        //cout << "(a) Error" << endl;
        //cout << "(b) Exclamation" << endl;
        //cout << "(c) Information" << endl;
        //cout << "(d) Question " << endl;
     
        //switch(key)
        //{
                   //case 'a':
                   //uType = MB_ICONERROR;
                   //break;
     
                   //case 'b':
                   //uType = MB_ICONEXCLAMATION;
                   //break;
     
                   //case 'c':
                   //uType = MB_ICONINFORMATION;
                   //break;
     
                   //case 'd':
                   //uType = MB_ICONQUESTION;
                   //break;
     
        //}
     
        from_string(sIpText, IpText);
        from_string(sIpCaption, IpCaption);
     
     
        MessageBox(0, IpText, IpCaption, MB_TASKMODAL);
     
        system("PAUSE");
    }
    Evidement ca marche pas :
    In function `bool from_string(const std::string&, T&) [with T = const TCHAR*]':
    58 instantiated from here
    14 ambiguous overload for 'operator>>' in 'iss >> Dest'
    note C:\Dev-Cpp\include\c++\3.4.2\istream:687 candidates are: std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*) [with _Traits = std::char_traits<char>] <near match>
    note C:\Dev-Cpp\include\c++\3.4.2\istream:687 std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*) [with _Traits = std::char_traits<char>] <near match>
    ...

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Et tu as essayé ceci ?
    Code C++ non testé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    wostringstream wos;
    wos << sIpText;
    wstring wsIpText = wos.str();
    IpText = wsIpText.c_str();
     
    wos.str("");
    wos << sIpCaption;
    wstring wsIpCaption = wos.str();
    IpCaption = wsIpCaption.c_str();
    Edit: Attention, ce code ne marche que dans ce sens-là

    Si ça marche, tu n'as plus qu'à rajouter les typedefs plus haut mentionnés et remplacer tes wostringstream et wstring par tostringstream et tstring...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Ca marche ! Merci beaucoup, c'est génial. Mais purrais-tu m'expliquer un peu comment tu a procédé pour faire cette conversion ? Je n'ai pas bien compris ton explication.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    En fait ca ne marche pas parfaitement.
    Pour commencer voici mon code modifier grâce à ton aide :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <stdio.h>
    #include <windows.h>
    #include <iostream>
    #include <sstream>
     
    #ifdef _UNICODE //Pour la CRT, c'est la version avec underscore
    typedef std::wstring tstring;
    typedef std::wostringstream tostringstream;
    #else
    typedef std::string tstring;
    typedef std::ostringstream tostringstream;
    #endif
     
    using namespace std;
     
    int main()
    {    
        std::string sIpText;
        std::string sIpCaption;
        LPCTSTR IpText;
        LPCTSTR IpCaption;
        UINT uType;
        char key;
     
        cout << "Message Box Text:" << endl;
        cin >> sIpText;
        cout << "Message Box Title:" << endl;
        cin >> sIpCaption;
     
        cout << "Message Box Type:" << endl;
        cout << "(a) Error" << endl;
        cout << "(b) Exclamation" << endl;
        cout << "(c) Information" << endl;
        cout << "(d) Question " << endl;
     
        switch(key)
        {
                   case 'a':
                   uType = MB_ICONERROR;
                   break;
     
                   case 'b':
                   uType = MB_ICONEXCLAMATION;
                   break;
     
                   case 'c':
                   uType = MB_ICONINFORMATION;
                   break;
     
                   case 'd':
                   uType = MB_ICONQUESTION;
                   break;
     
        }
     
        tostringstream wos;
        wos << sIpText;
        tstring wsIpText = wos.str();
        IpText = wsIpText.c_str();
     
        wos.str("");
        wos << sIpCaption;
        tstring wsIpCaption = wos.str();
        IpCaption = wsIpCaption.c_str();
     
     
        MessageBox(0, IpText, IpCaption, MB_TASKMODAL);
     
        system("PAUSE");
    }
    On a plus besoin de la fonction from_string.
    Eh bien le problème c'est que si on entre un nom composé dans les variables sIpText,comme par exmple "Ca va ?" le programme affichera tout de suite la message box sans demander le titre et la fentre aurau pour texte "Ca" et pour titre "va" et tous les autres demandes comme le titre de la fentre et son type sont ignorés une fois la fentre fermée. C'est surement un problème de conversion des blanc " ". Y-a-t'il un autre moyen ?

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    std::string sIpText;
    std::string sIpCaption;
    Ça devrait être tstring et pas std::string.

    Sinon pour ton problème, ça vient de la ligne cin >> sIpText

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ça devrait être tstring et pas std::string.
    Ca c'est pas forcé, puisqu'on parle justement de conversion là...
    Mais c'est vrai que ça simplifierait, on n'aurais justement plus besoin de la conversion (à supposer que ça marche en entrée)

    Mais pour le problème de mots, il vient en effet de cin.
    Utiliser std::getline() au lieu de cin>>

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Médinoc
    Mais c'est vrai que ça simplifierait, on n'aurais justement plus besoin de la conversion (à supposer que ça marche en entrée)
    Ah oui ? Alors pourquoi on se prends la tête ? ^^

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    J'ai fais comme tu as dit, ca marche bien ! Sauf pour les accents, mais c'est pas super grave.
    Euh...Quand même, si il y a moyen de ne pas passer par la conversion, je voudrais bien essayer !

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    On se prenait la tête:
    1. parce que tu avais demandé des fonctions de conversion,
    2. parce que je ne suis pas sûr que cin possède un opérateur >> pour wstring : il faut peut-être utiliser wcin, qui ne marche pas partout (pas sur mingW, par exemple)


    PS: Les accents en console sous Windows sont un problème de codage (ansi/oem).
    Pour cela, il n'y a évitemment aucune fonction standard.
    Tu dois posséder un buffer inscriptible (ce que tu ne peux obtenir avec les std::string, contrairement aux CString de MFC/ATL) et appeler la fonction Win32 OemToChar() ou OemToCharBuff() dessus.
    (tu peux aussi utiliser à la place directement les fonctions de conversions unicode : _mbstowcs(), MultiByteToWideChar() en spécifiant comme page de codes CP_OEMCP).

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    C'est bon, on va en rester là ^^. Merci beaucoup pout ton aide.

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

Discussions similaires

  1. [C] Conversion wchar_t vers string
    Par therealmancool dans le forum Windows
    Réponses: 4
    Dernier message: 04/04/2009, 21h24
  2. Conversion CString vers string
    Par CyberSlan dans le forum MFC
    Réponses: 7
    Dernier message: 26/05/2008, 19h24
  3. conversion hexadecimal vers string
    Par acognard dans le forum C#
    Réponses: 1
    Dernier message: 16/10/2007, 17h30
  4. Réponses: 5
    Dernier message: 04/06/2007, 18h07
  5. [DOM] Conversion vers String
    Par jymmy dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 02/05/2007, 15h25

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