CreateDirectory报告如果失败但错误代码是ERROR_SUCCESS

时间:2012-04-06 15:20:12

标签: c++ windows error-code create-directory

我有一个用于创建目录的函数。它使用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() says it failed, but the error code is ERROR_SUCCESS

更新 事实证明这个错误是由于代码中包含的另一个头具有函数“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();

1 个答案:

答案 0 :(得分:1)

事实证明这个错误是由于代码中包含的另一个头部有一个函数“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();