2010-03-16 8 views
0

Je suis utiliser le type de chaînes suivant: LPCSTR, TCHAR, String je veux convertir:LPCSTR, TCHAR, String

  1. de TCHAR à LPCSTR
  2. de chaîne char

je convertir de TCHAR à LPCSTR par ce code:

RunPath = TEXT("C:\\1"); 
LPCSTR Path = (LPCSTR)RunPath; 

de chaîne en char i convertir par ce code:

SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog; 
saveFileDialog1->Title = "Сохранение файла-настроек"; 
saveFileDialog1->Filter = "bck files (*.bck)|*.bck"; 
saveFileDialog1->RestoreDirectory = true; 
pin_ptr<const wchar_t> wch = TEXT(""); 
if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { 
    wch = PtrToStringChars(saveFileDialog1->FileName); 
} else return; 
ofstream os(wch, ios::binary); 

Mon problème est que quand je mets « Propriétés de configuration -> Général caractères dans « Utiliser multi-octets de caractères » la première partie du code de travail correctement. Mais la deuxième partie du code renvoie l'erreur C2440. Lorsque je définis "Propriétés de configuration -> Général Jeu de caractères dans" Utiliser Unicode ", la deuxième partie du code fonctionne correctement, mais la première partie du code renvoie le seul premier caractère de TCHAR à LPCSTR

+0

Si UNICODE est activé dans votre build, la plupart des API Windows sont '# define'-ed pour leurs versions à caractères larges. Les types T (par exemple 'TCHAR',' LPCTSTR', etc.) sont mappés à 'wchar_t' et' const wchar_t * 'quand UNICODE est défini. Sinon, ils sont mappés sur 'char' et' const char * '. Si vous êtes en train de programmer en UNICODE, alors vous pouvez juste utiliser des choses comme 'WCHAR' et' LPCWSTR', en évitant les types-T. –

Répondre

1

Je vous suggère devez utiliser Unicode le chemin à travers.

LPCSTR est un « long pointeur sur un C-type String ». qui est généralement pas ce que vous voulez, quand vous avez affaire à des méthodes .Net. le omble tapez .Net est 16bits de large

Vous ne devriez pas utiliser le TEXT (" ") macro sauf si vous prévoyez plusieurs générations en utilisant divers codages de caractères. Essayez d'encapsuler tous vos littéraux de chaîne avec la macro _W ("") à la place et une version unicode pure si vous le pouvez.

Voir si cela aide.

PS. std::wstring est très pratique dans votre scénario.

EDIT

Vous voyez un seul caractère, car la chaîne est maintenant unicode, mais vous l'avez lancé comme une chaîne régulière. La plupart ou la plupart des caractères Unicode de la plage ASCII ont le même nombre qu'en ASCII mais le deuxième de leurs 2 octets est mis à zéro. Donc, quand une chaîne unicode est lue comme une chaîne de caractères, vous ne voyez que le premier caractère car les chaînes C sont terminées par zéro (zéro). Le facile (et faux) façon de faire face à cela est d'utiliser std: wstring pour lancer en tant que chaîne std: puis en tirer le C-String hors de cela. Ce n'est pas l'approche sûre, car Unicode a un espace de caractères beaucoup plus grand que votre encodage standard.

+0

Je code en C++ avec l'aide de. Net je veux exécuter le programme et utiliser le premier paramètre de la fonction WinExec son LPCSTR, y at-il une fonction similaire dans. NET? – Xaver

+0

Vous devez considérer que la chaîne Unicode 16 bits peut représenter une chaîne qui * ne peut pas * être représentée comme une chaîne ASCII 8 bits.Mais si vous êtes prêt à en profiter, vous pouvez utiliser le constructeur std :: wstring pour créer un objet wstring puis le convertir en une chaîne std :: string et utiliser la méthode c_str() pour obtenir le LPCSTR. – kervin

Questions connexes