Bonjour,
Comment convertir un "CString" en "char *" :?:
Version imprimable
Bonjour,
Comment convertir un "CString" en "char *" :?:
c'est un multipost, ça... En plus, tu as déjà la réponse... :roll:
CString::GetString()
Comme dit dans son autre post, la classe CString ne possède pas de méthode GetString() (quel que soit le document dont vous tirez cela, il doit être erroné)
Tu peux avoir raison si tu utilises Visual C++ 6.0
Mais avec la version .NET la classe CString a été refondu en une classe template plus performante et partage les libraires MFC et ATL
Le membre GetString existe effectivement car la classe template CStringT dont CString est un typedef dérive de la classe template CSimpleStringT
Code:
1
2 template<typename BaseType, class StringTraits> class CStringT : public CSimpleStringT<BaseType>
Si GetString() n'est pas un membre de CString mais c'est un membre de sa classe de base CSimpleStringT et donc un appel CString::GetString() est faisable.Code:typedef ATL::CStringT<TCHAR, StrTraitMFC<TCHAR>> CString;
avec PCXSTR un typedef LPCSTR ou LPCWSTR selon que l'UNICODE est fixé ou pas et tu obtient finalement ton char*.Code:PCXSTR GetString() const throw();
Et donc avec une version supérieure à 6.0 je crois que tu as ton CString en char*
Mais tu peux faire des conversions comme
Voilà :DCode:
1
2
3 CString strText = "Quel case tête la conversion"; char* pszText; pszText = (LPTSTR) (LPCTSTR) strText;
Gabrielly
Ah, c'est du ATL...
Je me demande si c'est toujours une classe de base en MFC normal, ça ne m'étonnerais pas.
De puls, je n'ai pas consulté la doc de visual 6, mais celle du site de MSDN, où la classe CString n'a toujours pas de méthode GetString...
merci pour ta reponce detailler :wink:
mais convertir un pointeur const en non-const, ça va faire hurler bcp de monde.
un conseil, signale-le explicitement avec l'opérateur c++ const_cast pour t'éviter de créer des bugs quand tu retoucheras à ton code...
Voici les classes partagées entre MFC et ATL après le 6.0
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/vclrfclassessharedbetweenmfcandatl.asp
voici la classe template dont CString est un typedef
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/vclrfcstringt.asp
PCXSTR GetString( ) const throw( );
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/vclrfcsimplestringtgetstring.asp
J'utilise CString indifféremment d'un projet MFC ou ATL. :wink:Code:
1
2
3 CString str = "Je convertit en const char*"; const char* pcszText = str.GetString(); // j'empreinte GetString() par héritage
Ah, je vois, c'est à partir de .net...
Les headers signalés dans l'aide ne sont ni dans visual 6, ni dans le SDK de février 2003... Il serait temps que je me mette à jour (mais €€)
Sinon, j'utilse
CString str;
str.GetBuffer();
et ca marche
++
En effet, GetString n'appartient pas à CString!!! Si on saisie le point, il s'affichera en effet dans la liste mais on aura l'erreur:
alors qu'avec GetBuffer() qui retourne aussi PCXSTR, je n'ai pas cette erreur!Citation:
error C2664: 'CUtils::ProcessError'*: impossible de convertir le paramètre 1 de 'ATL::CSimpleStringT<BaseType,t_bMFCDLL>::PCXSTR' en 'char *'
with
[
BaseType=char,
t_bMFCDLL=true
]
En fait, qu'est-ce que cela fait un GetBuffer sans paramètre, quand est-ce qu'on lui donne un paramètre!
PS: désolé si j'ai remonté ce vieux sujet