3

我有这样的事情:

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

我收到错误:无法将参数 '1' 的 'const char*' 转换为 'const WCHAR*' 到 'DWORD GetFileAttributesW(const WCHAR*)'

如何转换const char*const WCHAR*

4

3 回答 3

3

不使用GetFileAttributesW,使用GetFileAttributes。添加_T到所有 const 字符串,并使用_TCHAR*. 而且INVALID_FILE_ATTRIBUES绝对不是字符串...

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

请参阅Unicode 编程摘要

于 2012-10-04T14:49:34.843 回答
1

您将一种编码的文本文字与另一种编码的函数调用混合在一起。

所有这些混乱都是由于微软放在他的标题中的#defines 和s 的模糊链。typedef

这个令人讨厌的 Microsoft 技巧之一是声明两个函数调用,它们之间存在一个字母AW项目设置的差异。有一个宏可以转换GetFileAttributestoGetFileAttributesAGetFileAttributesWifUNICODE被定义。

在您的情况下,您将摆脱宏并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]进行比较,比较是可能的,但它永远不会是真的!您必须阅读有关该功能以及如何使用它的信息;)

于 2012-10-04T15:13:07.057 回答
0

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

检查函数:memcmp(...)

于 2012-10-04T14:47:06.933 回答