雖然調用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)
除非出現問題,否則不要調用GetLastError。這沒有意義。 –
我有完全相同的結果。有趣的是,當我從uses子句(以及所有需要的)中刪除'SysUtils'時,我得到錯誤代碼'50'('請求不支持')。但@喬納森的權利,沒有理由調用'GetLastError',除非實際發生錯誤。想象一下10分鐘前在完全不同的窗口中發生的錯誤。然後,無論出於何種原因,您調用'GetLastError',從而從10分鐘前返回相同的代碼。 –
API文檔指出,只有在a)API調用失敗時才使用GetLastError,以及b)失敗的函數表示可以使用GetLastError獲取有關原因的更多信息。隨機地調用它或調用它而沒有記錄失敗的功能是沒有意義的。除非知道發生了錯誤,否則不能調用GetLastError,並且只有在您調用的特定函數指示失敗後才調用GetLastError。 –