Delphi 重置GetLastError值

Delphi 重置GetLastError值,delphi,winapi,Delphi,Winapi,德尔福Xe 在delphi帮助中:“…调用此函数通常会重置操作系统错误状态…” 如何重置0上的当前错误?即GetLastError=0 例如: Try // There is an error except showmessage(inttostr(getlasterror)); // Ok, getlasterror<>0 end; .... // no errors .... // How to reset a current error on 0? showmessage(in

德尔福Xe

在delphi帮助中:“…调用此函数通常会重置操作系统错误状态…”

如何重置0上的当前错误?即GetLastError=0

例如:

Try
// There is an error
except
showmessage(inttostr(getlasterror)); // Ok, getlasterror<>0
end;
....
// no errors
....
// How to reset a current error on 0?
showmessage(inttostr(getlasterror)); // Again will be <> 0
试试看
//有一个错误
除了
showmessage(inttostr(getlasterror));//好的,getlasterror0
结束;
....
//没有错误
....
//如何重置0上的当前错误?
showmessage(inttostr(getlasterror));//再次将是0

它实际上是一个Win32调用(不是Delphi本身)

您可以使用“SetLastError()”清除它

以下是MSDN文档:


只有在实际发生错误时,才应该调用
GetLastError
。某些Windows API函数在成功时会将错误重置为0,有些则不会。无论哪种方式,您都应该只在需要知道最新错误时询问错误状态


请注意,还有一个
SetLastError
方法,但这对您没有帮助;如果将最后一个错误设置为0,那么当然
GetLastError
将返回0。

这是一个低质量文档的示例
GetLastError
WinAPI函数将保留其返回值,直到下一次调用
SetLastError
为止,因此重复调用将无效

SetLastError(42);
for I := 1 to 100 do
  Assert(GetLastError() = 42); // all of those assertions evaluates to True
此外,在Delphi文档中,GetLastError被错误地放入异常处理例程中;这也是错误的,这些错误处理机制彼此无关

在引用中那个愚蠢的“通常”字上:之所以发生这种情况,是因为用于输出GetLastError返回值的函数调用了SetLastError。例如:

  SetLastError(42);
  OutputDebugString(PChar(Format('GetLastError() = %d', [GetLastError()]))); // 42
  OutputDebugString(PChar(Format('GetLastError() = %d', [GetLastError()]))); // 0! (ERROR_SUCCESS set by the previous OutputDebugString call)

-对何时调用GetLastError没有实际限制。GetLastError是确定性函数。@也许我不清楚,但我并不是说GetLastError有什么神奇之处。我刚才说的是a)有些函数会在成功时重置错误,而有些函数不会(100%正确,事实上你已经指出了这一点)和b)除非函数报告了错误,否则没有很好的理由询问最后一个错误。该方法的要点不是问“是否发生了错误?”而是问“为什么我上次的API调用返回了错误?”鉴于OP的问题,我认为这些都是有效且相关的要点。@Downvoter,要点是除非您被告知有错误,否则您不应该麻烦调用
GetLastError
。不要用它来检测是否有错误。也就是说,顾的预期用例是有缺陷的。即使真的没有任何错误,也不能保证
GetLastError
将返回0。@dlev,@Rob Kennedy,我不同意,鉴于被调用方设置扩展错误信息并返回基本错误信息,调用方可能会坚持仅扩展错误检查(这可能会提高代码可读性)。为了让我相信不是这样,被调用方必须返回TRUE,但不能事先使用SetLastError(ERROR\u SUCCESS)。@Downvoter,
GetLastError
文档清楚地说明:“大多数设置线程最后一个错误代码的函数在失败时设置它。但是,有些函数在成功时也会设置最后一个错误代码。如果未记录函数以设置最后一个错误代码,则此函数返回的值仅为最近设置的最后一个错误代码;某些函数在成功时将最后一个错误代码设置为0,而其他函数则不设置为0。“除非有文档记录某个函数在成功时设置代码,否则您不应假设是这样,并且您不能使用它来检测错误。