2010-02-18 9 views
8

Fehler C2664 konvertierenWarum kann TCHAR * auf char *

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

Fehler C2664: 'strlen' des Parameters 1 von 'TCHAR *' auf 'char *' Code umwandeln kann : Parameter 1 von ‚LPCTSTR‘ auf ‚const char *‘ kann

LPCTSTR name; 
strlen (name)  

Der obige Code zu einer Klasse nicht konvertieren, die in einem anderen Projekt gut funktioniert, kann ich den Grund nicht finden, warum es nicht in dieser funktioniert MS VS2010 Projekt.

Antwort

13

Sie müssen eine Funktion wie wcstombs verwenden, wenn _UNICODE definiert ist. Entweder das oder einfach _tcslen (Schauen Sie unter Generic-Text Routine Mappings) auf die TCHAR-Zeichenfolge und der Compiler wird es entweder zu strlen oder wcslen je nachdem, ob Sie Unicode verwenden oder nicht.

+1

Dieser Beitrag hat mich gerade ein paar Stunden gerettet. Der Standard für neue C++ - Projekte ist die Verwendung des Unicode-Zeichensatzes. Wenn Sie das ausschalten, beheben Sie diese Fehler. –

+0

Danke für den Link. wcslen arbeitete hier für einen LPCTSTR – rogerdpack

7

Wahrscheinlich, weil TCHAR als ein Char in einem Ihrer Projekte definiert ist, aber nicht im VS2010, wo es wahrscheinlich wchar_t ist.

Wenn Ihr Projekt UNICODE/_UNICODE definiert, was der Angabe eines Unicode-Builds in den Projekteinstellungen entspricht, wird TCHARs wchar_t sein.

Sie müssen grundsätzlich entscheiden, ob Unicode verwendet werden soll oder nicht. Wenn Sie dies tun, müssen Sie die regulären Aufrufe von strncpy et al in die Whole-Char-Entsprechungen ändern oder die T-Varianten verwenden, die genauso wie TCHARs geändert werden machen. Sehen Sie sich die Hilfe für strncpy oder die anderen Funktionen an, um zu sehen, wie die Wide- oder T-Varianten aufgerufen werden.

Sie können MSDN auch für Aufrufe wie strcpy ansehen, wo Sie sehen können, dass die Wide-Char-Version Wcscpy und die T-Version _tcscpy aufgerufen wird. Ich würde Ihnen empfehlen, bei den t-Versionen zu bleiben, wenn Sie den Code in verschiedenen Projekten verwenden wollen, die entweder UNICODE verwenden oder nicht, oder um eine fundierte Entscheidung zu treffen, welche Sie verwenden werden, und dann dabei bleiben. Was besser ist, hängt von Ihrem Szenario ab, das ich sagen würde, und kann einige "religiöse" Meinungen hervorrufen ...

+0

wenn ja, wie kann ich es beheben? – Christoferw

+0

@Christoferw: Ich habe meine Antwort aktualisiert, um Ihnen einen Hinweis zu geben, wie Sie das beheben können. Schreiben Sie einen weiteren Kommentar, wenn Sie weitere Hilfe benötigen. – villintehaspam

+0

Aber ich hatte kein Unicode-Projekt .... – Christoferw

3

Ist Ihr Projekt ein Unicode-Projekt? Wenn ja, glaube ich, TCHAR entspricht einem wchar_t eher als char machen Ihre Umwandlung Versuche ungültig. See here für weitere Informationen.

+0

Nein, es ist ein Multibyte-Projekt – Christoferw

+0

Nun, es ist offensichtlich nicht, oder Sie werden dieses Problem nicht bekommen ... – Goz

+0

Es ist in den Projekteinstellungen in Visual Studio ausgewählt: Zeichensatz: Multi-Byte-Zeichensatz verwenden – Christoferw

4

Hier einige Code, den Trick für Sie tun, es wurde zuerst hier www.wincli.com/?p=72 aber ich es in eine kleine Klasse gekapselt :)

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

Hier ist eine Demonstration der Verwendung des Codes:

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