2012-10-04 146 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]比較整數,比較是可能的,但是,它永遠不會是真的!您必須閱讀有關函數以及如何使用它;)

相關問題