2012-10-04 196 views
1

我有这样的事情:如何为const char *转换为const WCHAR *

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

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

如何转换const char*const WCHAR*

+2

'GetFileAttributesW'返回一个DWORD,它与'const char []'没有用处比较。你可能不想引用'INVALID_FILE_ATTRIBUTES'。 –

+1

INVALID_FILE_ATTRIBUTES是一个不是字符串的整数标识符。你应该从附近删除引号。 –

+0

@RobᵩGosh,我真的得休息一下......谢谢你...... – burtek

回答

3

不要使用GetFileAttributesW,使用GetFileAttributes。将_T添加到所有常量字符串,并使用_TCHAR*。和INVALID_FILE_ATTRIBUES绝对一个字符串是...

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

Unicode Programming Summary

+1

或者只是使用L“”而忘记ASCII构建? –

+0

@MarkIngram出色的建议。 – bames53

0

您试图比较指针地址而不是comtent!

检查功能:memcmp(...)

1

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

所有这些困惑都是由于微软放在他头上的#define s和typedef的隐含链。

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

在你的情况,你正在摆脱宏并直接调用UNICODE版本(以字母W结尾的版本),但在您的调用中,您使用的是非宽字符文字,您可以轻松修复它追加L字面(由其他用户的建议):

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

所以,如果你调用A结束的版本,你可以使用无WideString的文字:

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

其他方式t o修复它使用的是_T宏(检查this answer):

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") {...} 

使用两个宏(就是那个改变GetFileAttributesUNICODE或无UNICODE版本,并且追加了一个L),不需要担心项目设置,因为宏为您提供了这种责任。

编辑。

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

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

A DWORD is a 32-bit unsigned integer (range: 0 through 4294967295 decimal).

所以,到最后,你与char[24]比较整数,比较是可能的,但是,它永远不会是真的!您必须阅读有关函数以及如何使用它;)