3

私はこのようなものを持っています:

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

エラーが発生します:引数「1」の「constchar*」を「constWCHAR*」に変換できません「DWORDGetFileAttributesW(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

ある種類の成文化のテキストリテラルと、別の種類の成文化を伴う関数呼び出しを混合しています。

この混乱はすべて、Microsoftがヘッダーに付けた#definesとsのあいまいなチェーンによるものです。typedef

この厄介なMicrosoftのトリックの1つは、文字AまたはWプロジェクト設定に応じて異なる2つの関数呼び出しを宣言することです。GetFileAttributestoGetFileAttributesAまたはGetFileAttributesWifUNICODEが定義されている場合に変換するマクロがあります。

あなたの場合、マクロを取り除き、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されるものと、リテラルにを追加するもの)を使用すると、マクロがこの責任を負うため、プロジェクト設定について心配する必要はありません。UNICODEUNICODEL

編集。

私の悪い、私はほとんど最も重要な部分を忘れています。

GetFileAttributes他のユーザーが指摘しているように、の戻り値をテキストリテラルと比較しています。DWORDを返し、Microsoftのドキュメントによると次のようになります。

DWORDは、32ビットの符号なし整数(範囲:0〜4294967295 10進数)です。

したがって、最終的には、整数をaと比較しているchar[24]ので、比較は可能ですが、決して真になることはありません。関数とその使用方法について読む必要があります;)

于 2012-10-04T15:13:07.057 に答える
0

コンテンツではなくポインタアドレスを比較しようとしています!

関数のチェック:memcmp(...)

于 2012-10-04T14:47:06.933 に答える