Entwickler-Ecke

Windows API - Fehlermeldungen durch API


Umgssda - Di 07.09.04 07:51
Titel: Fehlermeldungen durch API
Ich habe gelesen, dass man Fehlermeldungen per FormatMessage und GetLastError von der API anstatt von Delphi selbst mit einem Text versehen lassen kann. Jetzt habe ich aber noch das Problem, dass ich nicht weiss, wo ich diese Aufrufe anbringen soll, um alle Fehlermeldungen, die generiert werden koennten zu ersetzen.

Hat da jemand eine Idee?


Motzi - Di 07.09.04 10:18

Das geht eigentlich ganz einfach wenn man sich mal anschaut wie SysErrorMessage aus der Unit SysUtils.pas das macht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function SysErrorMessage(ErrorCode: Integer): string;
var
  Len: Integer;
  Buffer: array[0..255of Char;
begin
  Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or
    FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
    SizeOf(Buffer), nil);
  while (Len > 0and (Buffer[Len - 1in [#0..#32'.']) do Dec(Len);
  SetString(Result, Buffer, Len);
end;


Umgssda - Di 07.09.04 13:20

Motzi hat folgendes geschrieben:
Das geht eigentlich ganz einfach wenn man sich mal anschaut wie SysErrorMessage aus der Unit SysUtils.pas das macht:

Ich hatte eigentlich gehofft, es ginge auch anders, als direkt die System Units zu editieren.


Motzi - Di 07.09.04 13:28

Brauchst du ja nicht..!

Aber hier siehst du wie die Borländer das gemacht haben und kannst es bei Bedarf einfach übernehmen..!

Oder hab ich deine Frage falsch verstanden..? :?


Umgssda - Di 07.09.04 22:42

Motzi hat folgendes geschrieben:

Oder hab ich deine Frage falsch verstanden..? :?

Die Frage war "wo?". Ich kann deinem Beispiel zwar entnehmen, wie ich eine Fehlermeldung umstelle, aber ich will ja nicht nur eine, sondern gleich alle. Nur weiss ich eben nicht, wo ich die alle auf einmal abfangen kann, jetzt mal abgesehen von den System-Units.


Sprint - Mi 08.09.04 00:02

Umgssda hat folgendes geschrieben:
Nur weiss ich eben nicht, wo ich die alle auf einmal abfangen kann

Du willst Application-Wide Exceptionen abfangen die nicht mit try behandelt worden sind?
Schau dir mal das Ereignis OnExceptionan von TApplication an.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure AppWideException(Sender: TObject; E: Exception);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{--------------------------------------------------------------------------------------------------}

procedure TForm1.AppWideException(Sender: TObject; E: Exception);
begin

  Application.ShowException(E);

end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormCreate(Sender: TObject);
var
  S: String;
  I: Integer;
begin

  Application.OnException := AppWideException;

  S := 'Jetzt kommt ein Fehler.';
  I := StrToInt(S);

end;

{--------------------------------------------------------------------------------------------------}

end.


Umgssda - Mi 08.09.04 05:07

Sprint hat folgendes geschrieben:

Du willst Application-Wide Exceptionen abfangen die nicht mit try behandelt worden sind?
Schau dir mal das Ereignis OnExceptionan von TApplication an.


Danke, das hilft wirklich weiter.