2

ディレクトリの作成に使用する関数があります。CreateDirectoryA()を使用します

CreateDirectoryは失敗したと報告しますが、GetLastError()を使用してエラーコードを確認すると、ERROR_SUCCESSと報告されます

コード:

BOOL isDirCreated = CreateDirectoryA(dirName.c_str(), NULL);
DWORD dw = GetLastError();
if (isDirCreated) {
        if (!SetFileAttributesA(dirName.c_str(), attributes)) {
            printf("SetFileAttributes() %s failed with (%d)", dirName.c_str(), GetLastError()));
            return;
        }
    } else {
        printf("CreateDirectory() %s Failed with (%d)", dirName.c_str(), dw));
        if(ERROR_ALREADY_EXISTS != dw) {
            return;
        }
    }

これは次を返します:(関数への複数の呼び出し)

CreateDirectory() testDir Failed with (0)
CreateDirectory() testDir\dir Failed with (183)

CreateDirectoryAがfalseを返しても、ディレクトリは作成されます。失敗は、関数の最初の呼び出しで常に発生します。以降のすべての呼び出しは、期待どおりに機能します。

ディレクトリの作成に成功したときにCreateDirectoryがfalseを返す理由についてのアイデア。

これは同様の投稿ですが、解決策は私には機能しません:

ReadFile()は失敗したと言っていますが、エラーコードはERROR_SUCCESSです

UPDATE このエラーは、コードに含まれている別のヘッダーに関数 "GetLastError"があり、他の関数が別の名前空間にあるため、次のようにGetLastErrorを呼び出すことが原因であることが判明しました。

/*
 * the :: will tell it to use the GetLastError that is available on the global 
 * scope.  Most of Microsoft's calls don't have any namespace.
 */
DWORD dw = ::GetLastError();
4

1 に答える 1

2

このエラーの原因は、コードに含まれている別のヘッダーに関数 "GetLastError"があり、他の関数が別の名前空間にあるため、次のようにGetLastErrorを呼び出すことでした。

/*
 * the :: will tell it to use the GetLastError that is available on the global 
 * scope.  Most of Microsoft's calls don't have any namespace.
 */
DWORD dw = ::GetLastError();
于 2012-06-21T16:40:44.550 に答える