GetLastError

Adam Boduch
GetLastError
Moduł: Windows
function GetLastError: Cardinal; stdcall;

Zwraca numer błędu jaki wystąpił podczas ostatniego wywołania funkcji systemowego API.

Większość funkcji WinAPI zwracają wynik swojego działania w postaci uchwytu lub numeru. Podczas niepowodzenia zwracają wartość 0 i aby dowiedzieć się co poszło nie tak możemy posłużyć się funkcją GetLastError. Zwróci ona nam kod błędu dzięki któremu możemy zidentyfikować co się stało.

Opis każdej funkcji na MSDN zawiera listę błędów jakie może wygenerować dana funkcja oraz ich znaczenie. Każdy kod błędu jest zdefiniowany w postaci stałej np. ERROR_ACCESS_DENIED, ERROR_FILE_NOT_FOUND, ERROR_BAD_FORMAT. Możemy użyć tych stałych np. w instrukcji Case aby rozróżnić błędy. Wartość 0 jest reprezentowana przez stałą ERROR_SUCCESS.

Inną metodą interpretacji błędu może być rzucenie wyjątku zawierającego dane błędu. Pomocne ku temu są funkcje Win32Check, RaiseLastOSError, RaiseLastWin32Error.

Możemy również zamienić kod błędu na jego tekstowy odpowiednik z pomocą funkcji FormatMessage. Poniżej przykład jak to zrobić:

procedure ShowError(Error: LongWord; Info: string);
var
  lpMsgBuf: PChar;
begin
  FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER or
    FORMAT_MESSAGE_FROM_SYSTEM or
    FORMAT_MESSAGE_IGNORE_INSERTS,
    nil, Error, LANG_NEUTRAL or (SUBLANG_DEFAULT shl 10),
    PChar(@lpMsgBuf), 0, nil );
  ShowMessage(Info + #10#13 + string(lpMsgBuf));
  LocalFree(Cardinal(lpMsgBuf));
end;
 
//gdzieś w programie...
Uchwyt := CreateWindow(...);
if Uchwyt = 0 then
begin
  blad := GetLastError;
  ShowError(blad, 'Wywołanie funkcji "CreateWindow" nie powiodło się. Przyczyna:')
end;

Zobacz też:

4 komentarzy

Zrób ktoś coś z tym modułem System, bo GetLast Error jest w module Windows.

Hmmm, a w którym Delphi? Bo w D5 moduł System nie udostępnia funkcji GetLastError (jest tylko w sekcji implementation, czyli niewidoczna na zewnątrz).

Masz rację, Coldpeer. Ale Delphi udostępnia dwie metody GetLastError. Jedną w module Windows, a drugą w System, choć zupełnie nie wiem nie wiem po co (może ze względu na przenośność)