AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) SysErrorMessage _ keine Netzwerkfehler?
Thema durchsuchen
Ansicht
Themen-Optionen

SysErrorMessage _ keine Netzwerkfehler?

Ein Thema von Luckie · begonnen am 30. Nov 2005 · letzter Beitrag vom 30. Nov 2005
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

SysErrorMessage _ keine Netzwerkfehler?

  Alt 30. Nov 2005, 00:38
Ich habe mir gerade eine eigene SysErrorMessage Funktion geschrieben:
Delphi-Quellcode:
function SysErrorMessage(ErrorCode: DWORD): string;

  function Trim(const S: WideString): WideString;
  var
    I, L : Integer;
  begin
    L := Length(S);
    I := 1;
    while (I <= L) and (S[I] <= ' ') do
      Inc(I);
    if I > L then
      Result := ''
    else
    begin
      while S[L] <= ' do
        Dec(L);
      Result := Copy(S, I, L - I + 1);
    end;
  end;

var
  Len : Integer;
  Buffer : array[0..255] of Char;
  hDll : THandle;
resourcestring
  rsErrMsg = 'Fehlercode nicht gefunden';
begin
  result := '';
  Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, ErrorCode, 0, Buffer, SizeOf(Buffer), nil);
  if Len = 0 then
  begin
    hDll := LoadLibraryEx('netmsg.dll', 0, DONT_RESOLVE_DLL_REFERENCES);
    if hDll <> 0 then
    begin
      Len := FormatMessage(FORMAT_MESSAGE_FROM_HMODULE or FORMAT_MESSAGE_FROM_SYSTEM, @hDll, ErrorCode, 0, Buffer,
        sizeof(Buffer), nil);
      FreeLibrary(hDll);
      if Len <> 0 then
        result := Trim(string(Buffer) + ' (Netzwerk)')
      else
        result := rsErrMsg;
    end;
  end
  else
    result := Trim(string(Buffer));
end;
Wie man sieht wird nach dem ersten Aufruf von FormatMessage der Rückgabewert geprüft und wenn der null ist wird in der netmsg.dll nach dem Fehlercode geguckt. In der netmsg.dll sind wohl die Netzwerkfehler hinterlegt. dan hab eichmir alle Fehlercodes mal in eine Textdaie ausgeben lassen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  sl : TStringList;
begin
  sl := TStringList.Create;
  for i := 0 to 15999 do
  begin
    sl.Add(IntToStr(i) + ': ' + SysErrorMessage(i));
  end;
  sl.SaveToFile('d:\erros.txt');
  FreeAndNil(sl);
end;
Aber dort taucht nie ein Netzwerkfehler auf. Jetzt frage ich mich, welche Fehlercodes haben Netzwerkfehler? Ich will die Funktion einfach mal durchtesten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#2

Re: SysErrorMessage _ keine Netzwerkfehler?

  Alt 30. Nov 2005, 07:10
Zitat von Luckie:
Jetzt frage ich mich, welche Fehlercodes haben Netzwerkfehler?
2100 aufwärts (LMErr.h).

Zitat von Luckie:
Ich will die Funktion einfach mal durchtesten.
Die ist buggy, ändere @hDll in Pointer(hDll).
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: SysErrorMessage _ keine Netzwerkfehler?

  Alt 30. Nov 2005, 12:49
OK wird gemacht. Aber auch ab 2100 läd er keine Fehlermeldung aus der netmsg.dll.

Sieht jetzt so aus:
Delphi-Quellcode:
function SysErrorMessage(ErrorCode: DWORD): string;
var
  Len : Integer;
  Buffer : array[0..2048] of Char;
  hDll : THandle;
resourcestring
  rsErrMsg = 'Fehlercode nicht gefunden';
begin
  SetLength(Result, 2048-16);
  Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, ErrorCode, 0, Buffer, SizeOf(Buffer), nil);
  if Len = 0 then
  begin
    hDll := LoadLibraryEx('netmsg.dll', 0, DONT_RESOLVE_DLL_REFERENCES);
    if hDll <> 0 then
    begin
      Len := FormatMessage(FORMAT_MESSAGE_FROM_HMODULE or FORMAT_MESSAGE_FROM_SYSTEM, Pointer(hDll), ErrorCode, 0, Buffer,
        sizeof(Buffer), nil);
      FreeLibrary(hDll);
      if Len <> 0 then
      begin
        while (Len > 0) and (Buffer[Len - 1] in [#0..#32, '.']) do
          Dec(Len);
        SetString(Result, Buffer, Len);
      end
      else
        result := rsErrMsg;
    end;
  end
  else
  begin
    while (Len > 0) and (Buffer[Len - 1] in [#0..#32, '.']) do
      Dec(Len);
    SetString(Result, Buffer, Len);
  end;
end;
Sind noch Vorschläge von Shmia(???) mit eingeflossen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#4

Re: SysErrorMessage _ keine Netzwerkfehler?

  Alt 30. Nov 2005, 15:55
Zitat von Luckie:
OK wird gemacht. Aber auch ab 2100 läd er keine Fehlermeldung aus der netmsg.dll.
Muss er auch nicht (da der Text schon beim ersten FormatMessage-Aufruf ermittelt wird - wie wäre es mit Debuggen ).
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

Re: SysErrorMessage _ keine Netzwerkfehler?

  Alt 30. Nov 2005, 16:03
Konstanten
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: SysErrorMessage _ keine Netzwerkfehler?

  Alt 30. Nov 2005, 16:13
Ja, die kenne ich. Aber die Texte dazu scheinen auch alle in der kernel32.dll zu liegen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 18:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz