9
votes

Pourquoi ne peut pas convertir TCHAR * en caractères *

Erreur C2664: 'Strcpy': impossible de convertir le paramètre 1 de 'Tchar *' à 'Char *' Code:

LPCTSTR name; 
strlen (name)     


0 commentaires

4 Réponses :


8
votes

Probablement parce que TCHAR est défini comme un caractère dans l'un de vos projets, mais pas dans la VS2010, un où il est probablement wchar_t.

Si votre projet définit Unicode / _unicode, ce qui est identique à celui de la spécifier comme une version Unicode dans les paramètres du projet, Tchars sera WCHAR_T.

Vous devez essentiellement décider d'utiliser unicode ou non et non et si vous le faites, vous devez modifier les appels réguliers vers Strncpy et al vers les équivalents à large caractère ou utiliser les variantes TChantes de la même manière que Tchars . Regardez l'aide pour Strncpy ou les autres fonctions pour voir ce que sont appelés les larges ou les variantes T.

Vous pouvez également consulter MSDN pour les appels tels que Strcpy , où vous pouvez voir que la version wide-char est appelée WCSCPY et la version T s'appelle _TCSCY. Je vous recommanderais de vous contacter avec les versions T si vous allez utiliser le code dans différents projets qui utilisent Unicode ou non, ni pour prendre une décision éclairée que vous allez utiliser, puis vous en tenir à cela. Ce qui est mieux dépend de votre scénario, je dirais et peut invoquer des opinions "religieuses" ...


1 commentaires

@Christoferw: J'ai mis à jour ma réponse pour vous donner un pointeur sur la façon de résoudre ce problème. Écrivez un autre commentaire si vous avez besoin de plus d'aide.



4
votes

Votre projet est-il un projet Unicode? Si oui, je pense que TCHAR sera équivalent à un wchar_t plutôt qu'un char rendant vos tentatives de conversion invalides. voir ici pour plus d'informations.


1 commentaires

Il est sélectionné aux paramètres du projet dans Visual Studio: Set de caractères: Utilisez un ensemble de caractères multi-octets



14
votes

Vous devez utiliser une fonction telle que wcstombs quand _unicode est défini. Soit cela ou simplement utiliser _tcslen (regarder sous < EM> Mappages de routine génériques-textes ) sur la chaîne TCHAR et le compilateur le transférera à Strlen ou WCSlen selon que si vous utilisez Unicode ou non.


1 commentaires

Ce post vient de m'avoir sauvé quelques heures. La valeur par défaut pour les nouveaux projets C ++ consiste à utiliser le jeu de caractères Unicode. Désactiver cela, corrigé ces erreurs.



4
votes

Voici un certain code qui fera le tour pour vous, il a été publié à l'origine sur www.wincli.com/?p=72, mais ici, je l'ai enfoncé dans une petite classe :) xxx p> Voici une démonstration d'utilisation du code: xxx


0 commentaires