GetLastError
Adam Boduch
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ż:
- Kompletna lista błędów systemu (eng)
- GetLastError (Dział WinAPI)
- GetLastError (msdn.microsoft.com)
- Win32Check
- RaiseLastOSError
- RaiseLastWin32Error
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ść)
Hmm... GetLastError