2017-04-06 88 views
3

虽然调用Windows API函数封装一样ExtractShortPathName后使用GetLastError我注意到,GetLastError不管调用ExtractShortPathName是成功还是失败返回非零错误代码。实际上,在我的程序执行之前,似乎有一个“最后的错误”,例如,为什么GetLastError在我的程序开始之前有错误?

program TestGetLastError; 

{$APPTYPE CONSOLE} 
{$R *.res} 

uses 
    System.SysUtils; 

var 
    ErrorCode: Integer; 

begin 
    try 
    ErrorCode := GetLastError; 
    if ErrorCode <> 0 then 
     RaiseLastOSError; 
    except 
    on E: Exception do 
     WriteLn(E.ClassName, ': ', E.Message); 
    end; 
end. 

结果:

EOSError: System Error. Code: 122. 
The data area passed to a system call is too small 

我误解的东西或者做错了什么?

如果Delphi运行时正在做某些事情导致GetLastError被设置,那么在我的程序开始执行之前清除该错误的正确方法是什么?我应该使用SetLastError(ERROR_SUCCESS);这样的例子来自德尔福API文档:

procedure TForm2.btRaiseLastClick(Sender: TObject); 
begin 
    { Set the last OS error to a bogus value. } 
    System.SetLastError(ERROR_ACCESS_DENIED); 

    try 
    RaiseLastOSError(); 
    except 
    on Ex : EOSError do 
     MessageDlg('Caught an OS error with code: ' + IntToStr(Ex.ErrorCode), mtError, [mbOK], 0); 
    end; 

    { Let the Delphi Exception dialog appear. } 
    RaiseLastOSError(ERROR_NOT_ENOUGH_MEMORY); 

    { Finally set the last error to none. } 
    System.SetLastError(ERROR_SUCCESS); 

    if GetLastError() <> ERROR_SUCCESS then 
    MessageDlg('Whoops, something went wrong in the mean time!', mtError, [mbOK], 0); 

    { No exception should be thrown here because last OS error is "ERROR_SUCCESS". } 
    CheckOSError(GetLastError()); 
end; 

http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/LastOSError_(Delphi)

+5

除非出现问题,否则不要调用GetLastError。这没有意义。 –

+1

我有完全相同的结果。有趣的是,当我从uses子句(以及所有需要的)中删除'SysUtils'时,我得到错误代码'50'('请求不支持')。但@乔纳森的权利,没有理由调用'GetLastError',除非实际发生错误。想象一下10分钟前在完全不同的窗口中发生的错误。然后,无论出于何种原因,您调用'GetLastError',从而从10分钟前返回相同的代码。 –

+3

API文档指出,只有在a)API调用失败时才使用GetLastError,以及b)失败的函数表示可以使用GetLastError获取有关原因的更多信息。随机地调用它或调用它而没有记录失败的功能是没有意义的。除非知道发生了错误,否则不能调用GetLastError,并且只有在您调用的特定函数指示失败后才调用GetLastError。 –

回答

4

GetLastError的文件表明,只有用的,如果

  • 的API调用失败,并
  • 失败的功能表示可以使用GetLastError关于为什么越来越多的信息。 从这个文档(重点煤矿

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

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

这表明,调用它时没有首先在记录失败时设置失败是没有意义的。除非知道发生了错误,否则不能调用GetLastError,并且只有在您调用的特定函数指示失败后才调用GetLastError。

13

通过GetLastError()返回的值是唯一相关的是,失败的Windows API的调用,并在那里为函数指定的文件后,立即通过调用GetLastError()可获得扩展错误信息。

调用它这方面之外将从先前调用,这可能是从你的代码,德尔福运行时,你已经叫,甚至一些Windows API中的DLL返回的东西...

由于为GetLastError()状态Windows的API文档:

你应该立即拨打GetLastError函数时 函数的返回值表示,这样的调用将返回有用 数据。

相关问题