Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   SysErrorMessage _ keine Netzwerkfehler? (https://www.delphipraxis.net/58008-syserrormessage-_-keine-netzwerkfehler.html)

Luckie 29. Nov 2005 23:38


SysErrorMessage _ keine Netzwerkfehler?
 
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.

NicoDE 30. Nov 2005 06:10

Re: SysErrorMessage _ keine Netzwerkfehler?
 
Zitat:

Zitat von Luckie
Jetzt frage ich mich, welche Fehlercodes haben Netzwerkfehler?

2100 aufwärts (LMErr.h).

Zitat:

Zitat von Luckie
Ich will die Funktion einfach mal durchtesten.

Die ist buggy, ändere @hDll in Pointer(hDll).

Luckie 30. Nov 2005 11:49

Re: SysErrorMessage _ keine Netzwerkfehler?
 
OK wird gemacht. Aber auch ab 2100 läd er keine Fehlermeldung aus der netmsg.dll. :gruebel:

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.

NicoDE 30. Nov 2005 14:55

Re: SysErrorMessage _ keine Netzwerkfehler?
 
Zitat:

Zitat von Luckie
OK wird gemacht. Aber auch ab 2100 läd er keine Fehlermeldung aus der netmsg.dll. :gruebel:

Muss er auch nicht (da der Text schon beim ersten FormatMessage-Aufruf ermittelt wird - wie wäre es mit Debuggen ;) ).

toms 30. Nov 2005 15:03

Re: SysErrorMessage _ keine Netzwerkfehler?
 
:arrow: Konstanten

Luckie 30. Nov 2005 15:13

Re: SysErrorMessage _ keine Netzwerkfehler?
 
Ja, die kenne ich. Aber die Texte dazu scheinen auch alle in der kernel32.dll zu liegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 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