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 :

Problème de CString


Sujet :

MFC

  1. #1
    Membre du Club Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 66
    Points
    66
    Par défaut Problème de CString
    Bonjour,

    J'ai un problème tout bête mais que je n'arrive pas à résoudre

    J'ai déclaré un string m_DSN en membre protected de ma classe CRecordListCtrl.

    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
    class CRecordListCtrl : public CListCtrl//CListCtrlEx
    {
    public:
    	DECLARE_DYNCREATE(CRecordListCtrl);
    	CRecordListCtrl();
    	virtual ~CRecordListCtrl();
    	...
     
    protected:
     
    	//{{AFX_MSG(CRecordListCtrl)$
    		...
    		string m_DSN;
    		...
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
     
     
    public:
    	// assesseurs et mutateurs des attributs
    	string get_m_DSN(){return m_DSN;};
    	void set_m_DSN(_bstr_t dsn);
     
    };
    A un moment, je dois initialisé mon string avec _bstr_t dsn.
    Pour pouvoir changer la valeur de mon string, j'utilise un mutateur qui reçoit en paramètre un _bstr_t.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void CRecordListCtrl::set_m_DSN(_bstr_t dsn){
    	string temp((char*)dsn);
    	m_DSN = temp;
    }
    A la compilation ça passe très bien.
    Le problème arrive en mode debug : à l'exécution de m_DSN = temp; j'ai droit à un access violation.

    J'ai essayé en passant par une variable temporaire (en char*) mais cela ne marche pas non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void CRecordListCtrl::set_m_DSN(_bstr_t dsn){
    	string temp((char*)dsn);
     
    	int taille = temp.size() +1;
    	char* tmp = new char[taille];
    	strncpy(tmp, temp.c_str(), taille);
     
    	m_DSN = tmp;
    }
    Est-ce quelqu'un aurait une idée pour résoudre ce problème ???


    Merci


    Sachiel


    P.S. : je développe sous visual c++ 2005 (et en c++)

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  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
    Il est totalement inutile de passer par une string temporaire.
    Ensuite c'est std::string, pas string.

    Ton erreur vient probablement du fait que ta variable dsn n'est pas un pointeur vers une suite contigue de chars terminée par le caractère NULL.
    D'après MSDN, c'est un objet, qui est néanmoins convertible vers const char*. Mais ce genre de conversions doit se faire avec static_cast<>, pas avec les vieux casts du C.
    Boost ftw

  3. #3
    Membre du Club Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 66
    Points
    66
    Par défaut
    Ma variable dsn contient le texte d'un EditControl.

    La conversion de dsn (donc de type _bstr_t) en string, je l'ai prise dans la MSDN.
    La seule différence c'est que dans la MSDN, c'est une variable locale qui reçoit le contenu de dsn.


    L'idéal pour moi serait que ma variable m_DSN soit de type CString et non string.

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  4. #4
    Membre du Club Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 66
    Points
    66
    Par défaut
    Finalement, je m'attaque directement au CString.

    La déclaration de ma variable devient donc :
    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
    class CRecordListCtrl : public CListCtrl//CListCtrlEx
    {
    public:
    	DECLARE_DYNCREATE(CRecordListCtrl);
    	CRecordListCtrl();
    	virtual ~CRecordListCtrl();
    ...
    	CString m_DSN;
    ...
    public:
    	// assesseurs et mutateurs des attributs
    	CString get_m_DSN(){return m_DSN;};
    	void set_m_DSN(CString cs);
     
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void CRecordListCtrl::set_m_DSN(CString cs){
    	m_DSN = cs;
    }
    m_DSN = cs; ne marche pas, j'ai toujours un access violation

    Ma question est donc : comment recopier un CString dans un autre ???

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  5. #5
    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
    Pas normal, ça devrait marcher.

    Ici, l'erreur montre que quelque chose n'est pas initialisé (0xcccc...)
    On peut voir comment tu appelles set_m_DSN() ?

    PS: Pour la recopie comme ça, je pense que tu devrais utiliser une référence constante en paramètre plutôt qu'un passage par valeur: Ici, tu copies deux fois ta chaîne alors qu'une fois suffit...
    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 du Club Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 66
    Points
    66
    Par défaut
    Dans mon fichier testDlg.h je déclare un pointeur sur ma classe CRecordListCtrl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class CTestDlg : public CDialog
    {
    public:
    	...
    	CRecordListCtrl* theRec;
    	...
    };
    L'appel de la fonction set_m_DSN() se fait dans le fichier testDlg.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)	: CDialog(CTestDlg::IDD, pParent){
    	CString strcon;
    	...
    	theRec->set_m_DSN(strCon);
    	...
    }
    J'initialise ma variable m_DSN dans le constructeur de CRecordListCtrl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CRecordListCtrl::CRecordListCtrl() : CListCtrl(){
    	m_pCon = NULL;
    	m_DSN = "";
    }
    Je vois pas pourquoi ça coince, ca devrait marcher il me semble

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  7. #7
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    theRec est bien initialisé ?

  8. #8
    Membre du Club Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 66
    Points
    66
    Par défaut
    C'est bon j'ai résolu mon problème.

    theRec appelait bien le constructeur de CRecordListCtrl et initialsé bien m_DSN.
    Mais après dans CTestDlg(...), à l'appel de la fonction set_m_DSN(...) ma variable m_DSN n'était plus initialisé

    Donc au lieu de passé par theRec je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)	: CDialog(CTestDlg::IDD, pParent){
    	...
    	CRecordListCtrl Rec;
    	...
    	CString strCon;
    	...
    	// recupere le DSN
    	strCon = ConDlg.strCon;
    	m_strConnexion = strCon;
    	Rec.set_m_DSN(strCon);
    Et là c'est nickel

    Merci pour l'aide

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

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

Discussions similaires

  1. Problème avec CString::Format
    Par wajdi86 dans le forum MFC
    Réponses: 2
    Dernier message: 21/09/2011, 15h17
  2. Problème avec CString.Format
    Par abelman dans le forum MFC
    Réponses: 11
    Dernier message: 07/12/2006, 09h40
  3. Problème avec CString
    Par emric591 dans le forum C++
    Réponses: 7
    Dernier message: 15/11/2006, 16h16
  4. Problème création de DLL avec CString
    Par loupdeau dans le forum MFC
    Réponses: 3
    Dernier message: 21/07/2005, 20h55
  5. [CString -> int] Problème de conversion
    Par Manson dans le forum MFC
    Réponses: 2
    Dernier message: 20/06/2005, 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