如何将const char*转换为const WCHAR*

3

我有一个类似这样的东西:

if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}

我收到了错误信息:无法将“const char*”转换为“const WCHAR*”,用于参数“1”以便于使用“DWORD GetFileAttributesW(const WCHAR*)”。

如何将“const char*”转换为“const WCHAR*”?


2
GetFileAttributesW 返回一个 DWORD 值,与 const char[] 并没有有意义的比较。你可能不想引用 INVALID_FILE_ATTRIBUTES - Robᵩ
1
INVALID_FILE_ATTRIBUTES 是一个整数标识符,而不是字符串。你应该去掉它周围的引号。 - user213313
@Robᵩ 哎呀,我真的需要休息一下...谢谢你... - burtek
3个回答

3
不要使用GetFileAttributesW,请使用GetFileAttributes。将所有const字符串添加_T,并使用_TCHAR*。而INVALID_FILE_ATTRIBUES绝对不是一个字符串...
if(GetFileAttributes(_T("C:\\Directory"))!= INVALID_FILE_ATTRIBUTES ) 
 {...}

请查看Unicode编程概述

1
或者只使用 L"" 并忘记 ASCII 构建? - Mark Ingram

1

你正在混合一种编码方式的文本字面量和另一种编码方式的函数调用。

所有这些混乱都是由于微软在头文件中使用的晦涩的#definetypedef链引起的。

微软的其中一个令人恼火的技巧是声明两个函数调用,根据项目设置用字母AW区分。如果定义了UNICODE,则有一个宏将GetFileAttributes转换为GetFileAttributesAGetFileAttributesW

在你的情况下,你正在摆脱宏并直接调用UNICODE版本(以字母W结尾),但在你的调用中,你正在使用非宽字符串字面量,你可以轻松地通过在字面量后添加L来修复它(正如其他用户建议的那样):

if(GetFileAttributesW(L"C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}

因此,如果您正在调用以A结尾的版本,则可以使用非宽字符串文字:

if(GetFileAttributesA("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}

另一种解决方法是使用_T宏(请参见此答案):

if(GetFileAttributesW(_T("C:\\Directory"))!="INVALID_FILE_ATTRIBUTES") {...}

但是如果未定义UNICODE,您的原始问题将再次出现;最终,您可以向微软的做法屈服,并使用提供的所有宏:

// Note the lack of W or A, it's a macro, not a function call!!
if(GetFileAttributes(_T("C:\\Directory"))!="INVALID_FILE_ATTRIBUTES") {...}

使用这两个宏(一个将GetFileAttributes更改为UNICODE或非UNICODE版本,另一个在文字中添加L),无需担心项目设置,因为宏会为您承担这个责任。

编辑。

我的错,我几乎忘记了最重要的部分。

正如其他用户指出的那样,您正在将GetFileAttributes的返回值与文本文字进行比较;它返回一个DWORD,根据Microsoft文档:

DWORD是32位无符号整数(范围:0到4294967295十进制)。

因此,最终,您正在将整数与char[24]进行比较,比较是可能的,但永远不会为真! 您必须阅读有关该函数及其使用方法的信息 ;)


0

你正在尝试比较指针地址而不是内容!

请检查函数:memcmp(...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接