我有一个类似这样的东西:
if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}
我收到了错误信息:无法将“const char*”转换为“const WCHAR*”,用于参数“1”以便于使用“DWORD GetFileAttributesW(const WCHAR*)”。
如何将“const char*”转换为“const WCHAR*”?
我有一个类似这样的东西:
if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}
我收到了错误信息:无法将“const char*”转换为“const WCHAR*”,用于参数“1”以便于使用“DWORD GetFileAttributesW(const WCHAR*)”。
如何将“const char*”转换为“const WCHAR*”?
GetFileAttributesW
,请使用GetFileAttributes
。将所有const字符串添加_T
,并使用_TCHAR*
。而INVALID_FILE_ATTRIBUES
绝对不是一个字符串...if(GetFileAttributes(_T("C:\\Directory"))!= INVALID_FILE_ATTRIBUTES )
{...}
你正在混合一种编码方式的文本字面量和另一种编码方式的函数调用。
所有这些混乱都是由于微软在头文件中使用的晦涩的#define
和typedef
链引起的。
微软的其中一个令人恼火的技巧是声明两个函数调用,根据项目设置用字母A
或W
区分。如果定义了UNICODE
,则有一个宏将GetFileAttributes
转换为GetFileAttributesA
或GetFileAttributesW
。
在你的情况下,你正在摆脱宏并直接调用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]
进行比较,比较是可能的,但永远不会为真! 您必须阅读有关该函数及其使用方法的信息 ;)
你正在尝试比较指针地址而不是内容!
请检查函数:memcmp(...)
GetFileAttributesW
返回一个 DWORD 值,与const char[]
并没有有意义的比较。你可能不想引用INVALID_FILE_ATTRIBUTES
。 - Robᵩ