AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) GetLastError und falsche Fehlermeldungen, z.b. in TFileStream
Thema durchsuchen
Ansicht
Themen-Optionen

GetLastError und falsche Fehlermeldungen, z.b. in TFileStream

Ein Thema von mael · begonnen am 8. Feb 2016 · letzter Beitrag vom 8. Feb 2016
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: GetLastError und falsche Fehlermeldungen, z.b. in TFileStream

  Alt 8. Feb 2016, 10:05
Wir meinten beide tatsächlich wohl das gleiche. Ich sehe nur nicht wozu der direkte "GetLastError()"-Aufruf notwendig ist, es gibt ja

Win32Check( CreateFile(..) <> INVALID_HANDLE_VALUE ); oder
if (CreateFile(..) = INVALID_HANDLE_VALUE) then RaiseLastOSError(); Die Fundstelle in TFileStream.Create() ist wirklich gut. Wenn man im Internet nach "tfilestream create getlasterror" sucht findet man auch einen QC-Eintrag bei Embarcadero aber der Server streikt ausnahmsweise mal wieder.


Was ich in der Shoutbox noch meinte war der umgekehrte Fall: Manche WinApi-Routinen rufen SetLastError(ERROR_SUCCESS) nicht auf wenn sie erfolgreich waren. Deshalb sollte man nicht GetLastError() nehmen und einen Fehler annehmen wenn dieser nicht ERROR_SUCCESS (also Null) ist.
  Mit Zitat antworten Zitat
Benutzerbild von mael
mael

Registriert seit: 13. Jan 2005
391 Beiträge
 
Delphi XE3 Professional
 
#2

AW: GetLastError und falsche Fehlermeldungen, z.b. in TFileStream

  Alt 8. Feb 2016, 10:18
Wir meinten beide tatsächlich wohl das gleiche. Ich sehe nur nicht wozu der direkte "GetLastError()"-Aufruf notwendig ist, es gibt ja

Win32Check( CreateFile(..) <> INVALID_HANDLE_VALUE ); oder
if (CreateFile(..) = INVALID_HANDLE_VALUE) then RaiseLastOSError();
Z.b. wenn man Fehlermeldungen zusammensetzen möchte: <Meine Fehlermeldung><OS-Fehlermeldung>.
Oder man will einfach auf konkrete Fehlercodes reagieren um z.B. eine Datei die gesperrt war wieder nach x Sekunden zu laden zu versuchen, aber wenn der Dateiname sowieso ungültig ist es lassen.

Manche WinApi-Routinen rufen SetLastError(ERROR_SUCCESS) nicht auf wenn sie erfolgreich waren. Deshalb sollte man nicht GetLastError() nehmen und einen Fehler annehmen wenn dieser nicht ERROR_SUCCESS (also Null) ist.
Ist auch ein guter Hinweis. Vielleicht sollte man das irgendwo in der CodeLib oder so aufnehmen?
HxD, schneller Hexeditor:
http://mh-nexus.de/hxd
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#3

AW: GetLastError und falsche Fehlermeldungen, z.b. in TFileStream

  Alt 8. Feb 2016, 11:34
Zitat:
Manche WinApi-Routinen rufen SetLastError(ERROR_SUCCESS) nicht auf wenn sie erfolgreich waren.
Was im Prinzip ja richtig ist, da diese API GetLastError und nicht GetLastStatus heißt.

Aber, wie in der Shoutbox bereits gesagt wurde, sollte/muß man den gewünschten Fehlercode direkt nach der "fehlerhaften" API abrufen und zwischenspeichern, wenn er nicht sofort verwendet wird, damit das Ergebnis nicht eventuell durch eine andere "fehlerhafte" API zwischenzeitlich verändert werden könnte.

Delphi-Quellcode:
constructor EFileStreamError.Create(ResStringRec: PResStringRec; const FileName: string);
begin
  inherited CreateResFmt(ResStringRec, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
end;
Hier könnte nicht nur ExpandFileName quer schießen, sondern auch der Constructor, da doch im Begin der Speicher für die Instanz reserviert wird.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
493 Beiträge
 
Delphi 12 Athens
 
#4

AW: GetLastError und falsche Fehlermeldungen, z.b. in TFileStream

  Alt 8. Feb 2016, 11:50
GetLastError wird leider auch dann auf 0 gesetzt, wenn der Code in einer DLL ausgelagert ist und man diesen im Except abfragt.

Wünschenswert wäre es, wenn EFileStreamError um LastError erweitert wird.

Bis dahin verwende ich (wenn möglich) meine eigenen TFSFileStream.
Delphi-Quellcode:
TFSFileStream = class(THandleStream)
  strict private
    FFileName: string;
  public
    constructor Create(const AFileName: string; Mode: Word); overload;
    destructor Destroy; override;
    property FileName: string read FFileName;
  end;

  EFSFileStreamError = class(EFileStreamError)
  private
    FLastError: Cardinal;
  public
    constructor Create(ResStringRec: PResStringRec; const FileName: string);
    property LastError: Cardinal read FLastError;
  end;
  EFSCreateError = class(EFSFileStreamError);
  EFSOpenError = class(EFSFileStreamError);
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz