-1

CopyFileEx 与对 GetLastError 的以下调用返回 ERROR_INVALID_PARAMETER 即使从大约 2 个月前(可能从 2015 年 12 月开始)在 Win2012R2 上复制成功。在 Windows XP 到 Windows 7 和 Win 2k3 到 Win2k8R2 上,这不会发生,GetLastError 总是返回 0 (ERROR_SUCCESS)。

这是这种 Win32 API 的预期行为吗?您是否必须同时添加结果和 GetLastError 代码以确保结果?

此 KB 似乎与问题有关,但应用此补丁不会改变 API 行为。可能有另一个 KB 导致问题出现,但我一直无法找到它 https://support.microsoft.com/en-us/kb/2963918

GetLastError 的文档:

返回值

返回值是调用线程的最后一个错误代码。

设置最后一个错误代码的每个函数的文档的返回值部分记录了函数设置最后一个错误代码的条件。大多数设置线程最后错误代码的函数在失败时都会设置它。但是,某些函数在成功时也会设置最后一个错误代码。如果该函数没有记录设置最后一个错误代码,则该函数返回的值只是最近设置的最后一个错误代码; 一些函数在成功时将最后一个错误代码设置为 0,而其他函数则没有。

4

1 回答 1

3

文档中:

返回值

如果函数成功,则返回值非零。

如果函数失败,则返回值为零。要获取扩展错误信息,请调用 GetLastError。

换句话说,如果函数成功了,你就不会调用GetLastError,并且不会承诺如果你这样做会返回什么。

GetLastError因此,您将意义赋予不应赋予意义的返回值。

这是 Win32 中的常见模式。很多功能都是类似的。仅当函数的返回值指示失败时,返回的GetLastError值才有意义。不过,这不是一个通用规则,因此您确实需要逐个函数检查文档。

调用此类 Win32 函数的典型形式如下所示:

if (CopyFileEx(...))
{
    // function call succeeded, continue
}
else
{
    DWORD err = GetLastError();
    // do something with err
}

请注意,GetLastError仅当函数通过其返回值指示失败时才调用。

于 2016-02-24T16:31:39.110 回答