错误C2664:'strcpy':无法将参数1从'TCHAR *'转换为'char *' 代码:
LPCTSTR name, DWORD value
strcpy (&this->valueName[0], name);
错误C2664:'strlen':无法将参数1从'LPCTSTR'转换为'const char *'
LPCTSTR name;
strlen (name)
上面的代码在另一个项目中工作正常的类,我找不到它在MS VS2010项目中不起作用的原因。
答案 0 :(得分:13)
定义_UNICODE时,需要使用wcstombs等函数。或者只是在TCHAR字符串上使用_tcslen(在 Generic-Text Routine Mappings 下查看),编译器会将它传输到strlen或wcslen,具体取决于您是否使用unicode。
答案 1 :(得分:7)
可能是因为TCHAR在你的一个项目中被定义为char,但在VS2010中可能不是wchar_t。
如果您的项目定义了UNICODE / _UNICODE,这与在项目设置中将其指定为Unicode构建相同,则TCHAR将为wchar_t。
你基本上需要决定是否使用Unicode,如果你这样做,你需要将对strncpy等的常规调用更改为宽字符等效或使用改变与TCHAR相同方式的t变体。查看strncpy或其他函数的帮助,以查看调用宽变量或t变量的内容。
您还可以查看MSDN以获取strcpy等调用,您可以在其中看到宽字符版本称为wcscpy,而t版本称为_tcscpy。如果你打算在不同项目中使用UNICODE或不使用UNICODE的代码,或者做出明智的决定你将使用哪一个然后坚持下去,我建议你坚持使用t版本。哪个更好取决于我会说的情景,并可能会引用一些“宗教”意见......
答案 2 :(得分:4)
您的项目是否为unicode项目?如果是这样,我认为TCHAR
将等同于wchar_t
而不是char
,这会使您的转化尝试无效。 See here了解更多信息。
答案 3 :(得分:4)
这里有一些代码可以帮到你,它最初发布在www.wincli.com/?p=72但在这里我把它封装成一个小类:)
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; }
};
以下是使用代码的演示:
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;
}