2010-02-18 29 views
8

error C2664: 'strcpy': no ​​se puede convertir el parámetro 1 de 'TCHAR *' a 'char *' código:¿Por qué no se puede convertir TCHAR * char *

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

error C2664: 'strlen' : no se puede convertir el parámetro 1 de 'LPCTSTR' a 'const char *'

LPCTSTR name; 
strlen (name)  

el código anterior para una clase que funciona bien en otro proyecto, no puedo encontrar la razón por la que no funciona en este Proyecto MS VS2010.

Respuesta

13

Debe usar una función como wcstombs cuando _UNICODE está definido. O eso o simplemente use _tcslen (busque en Asignaciones de rutinas de texto genérico) en la cadena TCHAR y el compilador lo transferirá a strlen o wcslen, dependiendo de si está utilizando unicode o no.

+1

Esa publicación me ha salvado un par de horas. El valor predeterminado para los nuevos proyectos de C++ es usar el conjunto de caracteres Unicode. Al apagarlo, corrigió estos errores. –

+0

Gracias por el enlace. wcslen trabajó aquí para un LPCTSTR – rogerdpack

7

Probablemente porque TCHAR se define como un char en uno de sus proyectos, pero no en el VS2010 en el que probablemente sea wchar_t.

Si su proyecto define UNICODE/_UNICODE, que es lo mismo que especificar que sea una compilación Unicode en la configuración del proyecto, TCHAR será wchar_t.

Básicamente necesita decidir si desea usar Unicode o no y, si lo hace, debe cambiar las llamadas regulares a strncpy y otros a los equivalentes de caracteres anchos o usar las variantes t que cambian de la misma manera que los TCHAR hacer. Mire la ayuda para strncpy u otras funciones para ver cómo se llaman las variantes anchas o t.

También puede consultar MSDN para las llamadas como strcpy, donde puede ver que la versión de ancho ancho se llama wcscpy y la versión t se llama _tcscpy. Le recomendaría que se quede con las versiones t si va a usar el código en diferentes proyectos que usan UNICODE o no, o para tomar una decisión informada sobre cuál va a utilizar y luego quédese con eso. Lo que es mejor depende de su escenario, diría y puede invocar algunas opiniones "religiosas" ...

+0

Si es así, ¿cómo podría solucionarlo? – Christoferw

+0

@Christoferw: Actualicé mi respuesta para darle un puntero sobre cómo resolver esto. Escribe otro comentario si necesitas más ayuda. – villintehaspam

+0

Pero no tenía un proyecto Unicode .... – Christoferw

3

¿Su proyecto es un proyecto unicode? Si es así, creo que TCHAR será equivalente a wchar_t en lugar de char, por lo que los intentos de conversión serán inválidos. See here para más información.

+0

No, es un proyecto de Multibyte – Christoferw

+0

Bueno, obviamente no es así o no obtendrá este problema ... – Goz

+0

Se selecciona en la configuración del proyecto en Visual Studio: Conjunto de caracteres: Usar conjunto de caracteres de varios bytes – Christoferw

4

Aquí hay un código que va a hacer el truco para ti, que fue publicada originalmente para www.wincli.com/?p=72 pero aquí encapsulado en una pequeña clase :)

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; } 
}; 

Aquí es una demostración del uso del código:

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; 
} 
Cuestiones relacionadas