2010-02-18 7 views
8

erreur C2664: 'strcpy': ne peut pas convertir le paramètre 1 de 'TCHAR *' à 'char *' code:Pourquoi ne peut pas convertir TCHAR * char *

LPCTSTR name, DWORD value 
strcpy (&this->valueName[0], name); 

erreur C2664: 'strlen' : la raison pour laquelle il ne fonctionne pas dans ce ne peut pas convertir le paramètre 1 de « LPCTSTR » à « const char * »

LPCTSTR name; 
strlen (name)  

le code ci-dessus à une classe qui fonctionne très bien dans un autre projet, je ne trouve pas Projet MS VS2010.

Répondre

13

Vous devez utiliser une fonction telle que wcstombs lorsque _UNICODE est défini. Ou utilisez simplement _tcslen (Regardez sous Generic-Text Routine Mappings) sur la chaîne TCHAR et le compilateur la transférera soit à strlen soit à wcslen selon que vous utilisez unicode ou non.

+1

Ce post m'a juste sauvé quelques heures. La valeur par défaut pour les nouveaux projets C++ est d'utiliser le jeu de caractères Unicode. En éteignant cela, corrigé ces erreurs. –

+0

Merci pour le lien. wcslen a travaillé ici pour un LPCTSTR – rogerdpack

7

Probablement parce que TCHAR est défini comme un char dans l'un de vos projets, mais pas dans le VS2010 où il est probablement wchar_t. Si votre projet définit UNICODE/_UNICODE, ce qui équivaut à spécifier qu'il s'agit d'une version Unicode dans les paramètres du projet, les TCHAR seront wchar_t. Vous devez essentiellement décider si vous souhaitez utiliser Unicode et, si vous le faites, vous devez remplacer les appels réguliers à strncpy et al par les équivalents wide-char ou utiliser les variantes t qui changent de la même manière que les TCHAR. faire. Regardez l'aide pour strncpy ou les autres fonctions pour voir ce que les variantes larges ou t sont appelées.

Vous pouvez également consulter MSDN pour les appels tels que strcpy, où vous pouvez voir que la version large-char est appelée wcscpy et la version t est appelée _tcscpy. Je vous recommande de rester avec les versions t si vous allez utiliser le code dans différents projets qui utilisent UNICODE ou non, ou pour prendre une décision éclairée que vous allez utiliser et ensuite s'en tenir à cela. Ce qui est mieux dépend de votre scénario et je peux invoquer des opinions "religieuses" ...

+0

si oui, comment pourrais-je le réparer? – Christoferw

+0

@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. – villintehaspam

+0

Mais je n'avais pas de projet Unicode .... – Christoferw

3

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

+0

Non, c'est un projet Multibyte – Christoferw

+0

Eh bien c'est évidemment pas ou vous n'obtiendrez pas ce problème ... – Goz

+0

Il est sélectionné dans les paramètres du projet dans Visual Studio: Jeu de caractères: Utiliser le jeu de caractères multi-octets – Christoferw

4

Voici un code qui fera l'affaire pour vous, il a été affecté à www.wincli.com/?p=72 mais ici j'encapsulé dans une petite classe :)

class char_args 
{ 
private: 
char **l_argn; 
int arg_num; 

int wstrlen(_TCHAR * wstr) 
{ 
    int l_idx = 0; 
    while (((char*)wstr)[l_idx] != 0) l_idx += 2; 
    return l_idx; 
} 

// Allocate char string and copy TCHAR->char->string 
char *wstrdup(_TCHAR *wSrc) 
{ 
    int l_idx = 0; 
    int l_len = wstrlen(wSrc); 
    char *l_nstr = (char *)malloc(l_len); 
    if (l_nstr) { 
     do { 
      l_nstr[l_idx] = (char)wSrc[l_idx]; 
      l_idx++; 
     } while ((char)wSrc[l_idx] != 0); 
    } 
    l_nstr[l_idx] = 0; 
    return l_nstr; 
} 

char_args & operator=(const char_args&); // does not allow assignment of class 
char_args(const char_args&); // does not allow copy construction 

public: 
char_args(int argcc, _TCHAR* argv[]) : arg_num(argcc) 
{ 
    l_argn = (char **)malloc(argcc *sizeof(char*)); 
    for (int idx = 0; idx < argcc; idx++) l_argn[idx] = wstrdup(argv[idx]); 
} 

~char_args() 
{ 
    for(int idx = 0; idx < arg_num; idx++) if (l_argn[idx]) free(l_argn[idx]); 
    free(l_argn); 
} 

const char * operator[](const int &i) 
{ 
    if (i < arg_num) return l_argn[i]; else return 0; 
} 

const int argc() { return arg_num; } 
}; 

ici est une démonstration de l'utilisation du code:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char_args C_ARGV(argc, argv); 
    for(int i = 0; i < C_ARGV.argc(); i++) cout << C_ARGV[i] << endl; 
} 
Questions connexes