Pergunta

Erro C2664: 'strcpy': não é possível converter o parâmetro 1 de 'tchar *' para 'char *':

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

Erro C2664: 'strlen': não é possível converter o parâmetro 1 de 'LPCTSTR' para 'const char *'

LPCTSTR name; 
strlen (name)     

O código acima para uma classe que funciona bem em outro projeto, não consigo encontrar o motivo pelo qual ele não funciona neste projeto MS VS2010.

Foi útil?

Solução

Você precisa usar uma função como wcstombs Quando _unicode é definido. Ou isso ou apenas use _tcslen (Olhe sob Mapeamentos de rotina de texto genérico) Na sequência de tchar e o compilador a transferirá para Strlen ou WCSLEN, dependendo se você estiver usando Unicode ou não.

Outras dicas

Provavelmente porque o TCHAR é definido como um char em um de seus projetos, mas não no VS2010, onde provavelmente é WCHAR_T.

Se o seu projeto definir unicode/_unicode, que é o mesmo que especificá -lo para ser uma construção unicode nas configurações do projeto, os TCHARs serão wchar_t.

Você basicamente precisa decidir se deve usar o Unicode ou não e, se o fizer, precisa alterar as chamadas regulares para strncpy et al para os equivalentes de amplo custo ou usar os varantários T que mudam da mesma maneira que as tchars. Veja a ajuda para o strncpy ou as outras funções para ver como são chamadas as ammas ou varantas T.

Você também pode olhar para o MSDN para as chamadas como strcpy, onde você pode ver que a versão ampla é chamada WCSCPY e a versão T é chamada _TCSCPY. Eu recomendaria que você siga as versões T se você usar o código em projetos diferentes que usam Unicode ou não, ou para tomar uma decisão informada qual você usará e depois se mantém com isso. O que é melhor depende do seu cenário que eu diria e pode invocar algumas opiniões "religiosas" ...

O seu projeto é um projeto Unicode? Se sim, eu acredito TCHAR será equivalente a um wchar_t ao invés de um char Tornando suas tentativas de conversão inválidas. Veja aqui para mais informações.

Aqui está algum código que fará o truque para você, ele foi publicado originalmente em www.wincli.com/?p=72, mas aqui eu o encapsulei em uma classe pequena :)

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

Aqui está uma demonstração de uso do 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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top