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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    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
    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
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    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 !

  4. #4
    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
    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.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    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
    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.

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    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>
    ...

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    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...

+ 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, 20h24
  2. Conversion CString vers string
    Par CyberSlan dans le forum MFC
    Réponses: 7
    Dernier message: 26/05/2008, 18h24
  3. conversion hexadecimal vers string
    Par acognard dans le forum C#
    Réponses: 1
    Dernier message: 16/10/2007, 16h30
  4. Réponses: 5
    Dernier message: 04/06/2007, 17h07
  5. [DOM] Conversion vers String
    Par jymmy dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 02/05/2007, 14h25

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