Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi CopyFileEx返回错误\无效\参数,即使在Win2012R2上复制成功_Winapi_Windows2012 - Fatal编程技术网

Winapi CopyFileEx返回错误\无效\参数,即使在Win2012R2上复制成功

Winapi CopyFileEx返回错误\无效\参数,即使在Win2012R2上复制成功,winapi,windows2012,Winapi,Windows2012,CopyFileEx调用GetLastError返回ERROR_INVALID_参数,即使复制在Win2012R2上成功,因为大约2个月前,可能从2015年12月开始。在Windows XP直到Windows 7和Win 2k3直到Win2k8R2上,这不会发生,并且GetLastError始终返回0 ERROR\u SUCCESS 这是这种Win32 API的预期行为吗? 您是否必须同时添加result和GetLastError代码以确保结果 此知识库似乎与问题有关,但应用此修补程序不会改变A

CopyFileEx调用GetLastError返回ERROR_INVALID_参数,即使复制在Win2012R2上成功,因为大约2个月前,可能从2015年12月开始。在Windows XP直到Windows 7和Win 2k3直到Win2k8R2上,这不会发生,并且GetLastError始终返回0 ERROR\u SUCCESS

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

此知识库似乎与问题有关,但应用此修补程序不会改变API行为。可能是另一个KB导致问题出现,但我一直无法找到它

GetLastError的文档:

返回值

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

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

从:

返回值

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

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

换句话说,如果函数成功,则不希望您调用GetLastError,也不承诺如果您这样做将返回什么

因此,您将意义归于GetLastError返回的值,其中不应赋予任何意义

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

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

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

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

当我阅读GetLastError的文档时,它指出某些函数使用它设置0以获得成功。正如您所说,CopyFileEx的文档并没有声明它将为成功复制设置ERROR_SUCCESS。但在任何文档中,它都没有说CopyFileEx如果没有失败,就会将最后一个错误设置为实际的错误代码。除非Microsoft在其内部代码中编码了一个bug,该bug在每个线程内部都会得到一个错误。在我的书中,MS调用带有无效参数internall的东西更糟糕,如果这是暗示的话?当CopeFileEx成功时,最后一个错误代码的值是未定义的。我不知道吗?如果CopyFileEx成功,则根本不会设置最后一个错误。上一个错误没有垃圾值,并且不能取消定义,因为它属于调用线程。如果调用方me没有设置它,并且在调用CopyFileEx之前和之后对其进行了更改,则CopyFileEx中的另一个API调用将其设置为错误代码。David完全正确,如果成功,CopyFile不能保证不会将最后一个错误代码设置为非零值。例如,CopyFile可能会在内部使用另一个函数,该函数有时会以不妨碍CopyFile成功的方式失败。好吧,让我们调用这个函数,它可以进行快速复制。那没用?哦,没关系,我们将调用执行慢速复制的函数。成功了吗?很好,我们完成了。编程错误出现在代码中,当不应推断出任何意义时,您可以推断错误代码的意义。可能是ProgressCallback例程正在设置错误。但我想这是在另一个线程上调用的?因此在调用线程中不可见?或者是当前线程上的回调和另一个线程上的复制操作?还是两者都一样?然后,回调中冗长的UI操作可能会减慢速度,并告诉您仅在失败时调用GetLastError。在CopyFileEx成功返回后调用它不会产生定义良好的值。您的代码依赖于未指定的行为,只是在一个系统上运气不好。它有四轮马车,你需要修理它。API没有问题。@IInspectable CopyFileEx不拥有线程LastErrorCode的结果。对同一线程的任何调用都会将其设置为错误。CopyFileEx的Documentations意味着,如果成功,LastErrorCode不会被触发,只有在失败时才会被设置。这意味着CopyFileEx内部的某些东西失败了,或者我自己的回调失败了,如果它在同一个线程上
斯蒂恩现在还没被包起来。已经回答了。我们正在努力了解您仍然停留在哪些方面。在这一点上,我猜您希望看到一个答案,说明哪些更新或其他更改引入了您描述的更改,以及可能的原因。微软或其他供应商可能知道它是由第三方软件引入的,但这里的常客不太可能注意到这一变化,或者如果他们注意到任何细节进行调查,他们也不会足够在意。在任何情况下,由于更改不会影响正确编写的软件,因此原因和/或动机不在堆栈溢出的范围之内。