私はこのようなものを持っています:
if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}
エラーが発生します:引数「1」の「constchar*」を「constWCHAR*」に変換できません「DWORDGetFileAttributesW(const WCHAR *)」
に変換する方法const char*
はconst WCHAR*
?
私はこのようなものを持っています:
if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}
エラーが発生します:引数「1」の「constchar*」を「constWCHAR*」に変換できません「DWORDGetFileAttributesW(const WCHAR *)」
に変換する方法const char*
はconst WCHAR*
?
使用しないでくださいGetFileAttributesW
、使用してくださいGetFileAttributes
。_T
すべてのconst文字列に追加し、を使用します_TCHAR*
。そしてINVALID_FILE_ATTRIBUES
、間違いなく文字列ではありません...
if(GetFileAttributes(_T("C:\\Directory"))!= INVALID_FILE_ATTRIBUTES )
{...}
Unicodeプログラミングの概要を参照してください。
ある種類の成文化のテキストリテラルと、別の種類の成文化を伴う関数呼び出しを混合しています。
この混乱はすべて、Microsoftがヘッダーに付けた#define
sとsのあいまいなチェーンによるものです。typedef
この厄介なMicrosoftのトリックの1つは、文字A
またはW
プロジェクト設定に応じて異なる2つの関数呼び出しを宣言することです。GetFileAttributes
toGetFileAttributesA
またはGetFileAttributesW
ifUNICODE
が定義されている場合に変換するマクロがあります。
あなたの場合、マクロを取り除き、UNICODE
バージョンを直接呼び出します(文字で終わるものW
)が、呼び出しでワイドストリングなしのリテラルを使用している場合はL
、リテラルにaを追加して簡単に修正できます(他のユーザーが提案したように):
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
定義されていない場合、元の問題が再び発生します。最後に、Microsoftのやり方に身を任せて、提供されているすべてのマクロを使用できます。
// Note the lack of W or A, it's a macro, not a function call!!
if(GetFileAttributes(_T("C:\\Directory"))!="INVALID_FILE_ATTRIBUTES") {...}
2つのマクロ(orまたはno-バージョンで変更GetFileAttributes
されるものと、リテラルにを追加するもの)を使用すると、マクロがこの責任を負うため、プロジェクト設定について心配する必要はありません。UNICODE
UNICODE
L
編集。
私の悪い、私はほとんど最も重要な部分を忘れています。
GetFileAttributes
他のユーザーが指摘しているように、の戻り値をテキストリテラルと比較しています。DWORDを返し、Microsoftのドキュメントによると次のようになります。
DWORDは、32ビットの符号なし整数(範囲:0〜4294967295 10進数)です。
したがって、最終的には、整数をaと比較しているchar[24]
ので、比較は可能ですが、決して真になることはありません。関数とその使用方法について読む必要があります;)
コンテンツではなくポインタアドレスを比較しようとしています!
関数のチェック:memcmp(...)