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 :

conversion CString -> LPTSTR (parametre retour de fonctio


Sujet :

MFC

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut conversion CString -> LPTSTR (parametre retour de fonctio
    Bonjour,

    j'ai un petit soucis de conversion entre ces 2 types,

    j'ai la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LPTSTR CTexteApps::GetTexteLPTSTR(SECTION section, int iTexte)
    {
    	LPTSTR r;
    	CString ret = GetTexte(section, iTexte);
    	r = ret.GetBuffer();
    	return r;
    }
    la fonction GetTexte me retourne un CString,

    lors du debug, je vois bien que la chaine retourné est valide,
    par la suite, le passage de cette chaine dans r qui est un LPTSTR semble valide, j'y vois bien ma chaine.

    enfin, quand j'utilise la fonction ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LPTSTR p = p_TEXTE->GetTexteLPTSTR(SECT_VAL_FICHE,1);
    p vaut un truc illisible : îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ

    jvois pas trop pourquoi je perd mon continu lors du retour de la fonction

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    pb classique en C++ ,la valeur retounée depend d'un objet local (CString ret) a la fonction .
    quand l'objet se detruit elle fait le menage et ta zone memoire est relachée...
    retourne une CString .

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    ben non, j'ai besoin d'un LPTSTR pour tes XTabCtrl (titre des onglets)

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu peux pas caster le retour du CString plutot ? = bien !

    sinon, il te faudra faire une allocation dynamique, sans oublier de la liberer bien sur = moins bien

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    ben c'est ce que j'avais mis au debut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabCtrl.AddTab(Page3, (LPTSTR)(p_TEXTE->GetTexte(SECT_VAL_FICHE,1)), 0);
    mais j'obtiens :
    error C2440: 'type cast' : cannot convert from 'CString' to 'LPTSTR'

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    et si tu faisais un truc du genre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabCtrl.AddTab(Page3, (LPTSTR)(p_TEXTE->GetTexte(SECT_VAL_FICHE,1).GetBuffer()), 0);

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    ben j'avais testé déjà en passant par un cstring temporaire,

    ca donne rien non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CString tmp = p_TEXTE->GetTexte(SECT_VAL_FICHE,1);
     
    TabCtrl.AddTab(Page3, tmp.GetBuffer(), 0);

  8. #8
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Salut, essaye en faisant (LPTSTR)(LPCTSTR)Chaine, ca devrait fonctionner.

  9. #9
    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 n'ai pas trouvé de AddTab qui corrsesponde sur MSDN...

    Mais vous êtes sûrs qu'ils vous faut bien un LPTSTR et non un LPCTSTR ?
    Parce que le const_cast du second au premier, c'est sale... (et prière d'utiliser un const_cast plutôt qu'un cast C pour ce genre de choses: ça se voit plus vite)

    PS: Pourquoi ça foire avec la CString temporaire et le GetBuffer() ?
    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.

  10. #10
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Sans oublier que le CString ( le nouveau CStringT) peut être convertit implicitement en un LPTSTR (LPSTR ou LPWSTR) et qu'il dispose aussi d'une méthode CString::GetString() (qu'il empreinte de sa classe de base )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CString str ="string";
    LPSTR lp = str.GetString();

  11. #11
    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
    Gabrielly: La conversion implicite, je crois bien qu'elle n'existe que pour le LPCTSTR...

    PS: d'ailleurs, j'ai regardé GetString:
    Citation Envoyé par MSDN
    The returned PCXSTR pointer is const and does not allow direct modification of CSimpleStringT contents.
    Ce qui ne laisse que GetBuffer() si on veut un pointeur vers une chaîne modifiable...
    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.

  12. #12
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    Slt et merci à tous

    la solution de Brouzouf fonctionne bien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LPTSTR CTexteApps::GetTexteLPTSTR(SECTION section, int iTexte)
    {
    	CString ret = GetTexte(section, iTexte);
    	return (LPTSTR)(LPCTSTR)ret;
    }

  14. #14
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    ça m'etonne ,bonjour le bon bug mémoire de débutant .
    ret etant temporaire tu transmets l'adresse d'un pointeur d' une zone memoire allouée par un objet temporaire et qui fera le menage à la sortie. (cf mon precedent.).


  15. #15
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    ok, j'avais pas saisis ca, donc,

    et si je fais plutot cette conversion lors de l'init du tabctrl ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	Page3 = new DlValidationPage3;
    	Page3->Create(DlValidationPage3::IDD, &TabCtrl);
    	TabCtrl.AddTab(Page3,(LPTSTR)(LPCTSTR)(p_TEXTE->GetTexte(SECT_VAL_FICHE,1), 0));
    c'est mieux oou c'est le meme probleme ?

  16. #16
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    pas de news ?

Discussions similaires

  1. Conversion CString -> wstring
    Par loupdeau dans le forum MFC
    Réponses: 5
    Dernier message: 08/11/2008, 22h15
  2. Conversion CString en const char*
    Par LRobi dans le forum MFC
    Réponses: 8
    Dernier message: 19/07/2005, 12h12
  3. Conversion CString -> CTime/Systemtime
    Par Manson dans le forum MFC
    Réponses: 2
    Dernier message: 22/06/2005, 11h27
  4. conversion CString --> LPCWSTR
    Par lyim dans le forum MFC
    Réponses: 8
    Dernier message: 19/05/2005, 12h44
  5. conversion CString
    Par latisane dans le forum MFC
    Réponses: 1
    Dernier message: 19/05/2005, 09h51

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