Programowanie w języku Delphi

GetLastError

  • 2010-10-31 18:27
  • 4 komentarze
  • 1634 odsłony
  • Oceń ten tekst jako pierwszy
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 komentarze

manfredek 2008-06-10 15:43

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

Morris 2006-08-11 20:41

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).

Jojersztajner 2006-08-11 07:32

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ść)