我有这样的事情:
if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}
我收到错误:无法将参数 '1' 的 'const char*' 转换为 'const WCHAR*' 到 'DWORD GetFileAttributesW(const WCHAR*)'
如何转换const char*
为const WCHAR*
?
我有这样的事情:
if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}
我收到错误:无法将参数 '1' 的 'const char*' 转换为 'const WCHAR*' 到 'DWORD GetFileAttributesW(const WCHAR*)'
如何转换const char*
为const WCHAR*
?
不使用GetFileAttributesW
,使用GetFileAttributes
。添加_T
到所有 const 字符串,并使用_TCHAR*
. 而且INVALID_FILE_ATTRIBUES
绝对不是字符串...
if(GetFileAttributes(_T("C:\\Directory"))!= INVALID_FILE_ATTRIBUTES )
{...}
请参阅Unicode 编程摘要。
您将一种编码的文本文字与另一种编码的函数调用混合在一起。
所有这些混乱都是由于微软放在他的标题中的#define
s 和s 的模糊链。typedef
这个令人讨厌的 Microsoft 技巧之一是声明两个函数调用,它们之间存在一个字母A
或W
项目设置的差异。有一个宏可以转换GetFileAttributes
toGetFileAttributesA
或GetFileAttributesW
ifUNICODE
被定义。
在您的情况下,您将摆脱宏并UNICODE
直接调用版本(以字母结尾的版本W
),但在您的调用中,您使用的是非宽字符串文字,您可以轻松修复它,将 a 附加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 十进制)。
所以,最后,你将一个整数与 achar[24]
进行比较,比较是可能的,但它永远不会是真的!您必须阅读有关该功能以及如何使用它的信息;)
您正在尝试比较指针地址而不是内容!
检查函数:memcmp(...)