nullplan001
Goto Top

Viele Fehler nach FormatMessage

Nachdem ich schon zwei Usenet-Foren damit belästigt habe, seid ihr jetzt auch dran face-wink .

Hi all,
wie nicht anders zu erwarten war, habe ich ein Problem mit dem Win-API. Ich habe schon einiges an dem Programm gefixt, aber irgendwie geht es immer noch nicht.
Ich wollte mir die Arbeit ersparen, wegen jeden Fehler-Codes, den mir meine Apps zurückgeben können, in der winerror.h (oder wie die heißt) nachzugucken. Also schrieb ich folgendes Programm (knappe Übersetzung nach C, weil kürzer):
char string[256];
dword processed, code, stdout, stdin;

int __stdcall main()
{
  stdin = GetStdHandle(STD_INPUT_HANDLE);
  stdout = GetStdHandle(STD_OUTPUT_HANDLE);
  WriteConsoleA(stdout, "Bitte Fehlercode eingeben: ", 28, &processed, NULL);  
  ReadConsoleA(stdin, string, 10, &processed,  NULL);
  string[10] = 0;
  code = strtol(string, &processed, 10);
  stdin = FormatMessageA(
    FORMAT_MESSAGE_FROM_SYSTEM | 80,
    NULL,
    code,
    SUBLANG_GERMAN << 10 | LANG_GERMAN,
    string,
    255,
    NULL
  );
  string[stdin] = 0;
  CharToOem(string,string);
  WriteConsoleA(stdout, string, stdin, &processed, NULL);
  return 0;
}

Nach allen API-Funktionen wird auf deren Fehlschlag geprüft. Wenn sie fehlgeschlagen sind, beendet sich das Programm mit dem letzten Fehlercode (GetLastError()).
Nun habe ich ein interessantes Problem: Wenn ich das Programm starte und "80" eintippe, funktioniert alles. Wenn ich irgend etwas anderes eintippe, wird mir etwas über einen Fehler im Code nachgesagt. Manchmal ist es eine Acess Violation, manchmal privileged code. Es scheint so, als würde mein Code irgendwo hin hüpfen, wo er nicht hin soll. Nur habe ich keine Ahnung, was ich dagegen tun soll.
Interessant ist, dass ohne den Aufruf zu CharToOem und die dazugehörigen Verrenkungen, um eax zu erhalten, keine Fehler entstehen... nur dass die Meldung eben sehr blöd aussieht, wenn sie Umlaute enthalten würde (tut sie nach ihrer Verhackstückung nicht mehr).
Ich könnte natürlich mir die englischen Nachrichten antun und so die Sache mit CharToOem umgehen. Aber ich will dem Problem nicht aus dem Weg gehen, ich will es lösen.
Laut Dr. Watson kommt es in einer Symbol-losen Funktion zu dem Fehler. Das könnte entweder meine Hauptfunktion sein, oder irgendeine undokumentierte Windows-Funktion. Da der call-Stack aber ansonsten leer ist, tippe ich mal auf ersteres.
Kann jemand helfen?
tia und tschö,
Markus
P.S.: ich verwende Yasm und ALINK.

Content-Key: 42956

Url: https://administrator.de/contentid/42956

Printed on: April 19, 2024 at 02:04 o'clock