Win32 Fehlercodes verlässlich ?
-
Hallo,
ich benutze in einer Applikation ein bissl pinvoke. Zur Fehlersuche hab ich mal die Win32 errorcodes bemüht und festgestellt, dass sich diese auch bei der Ausführung von managed code ändern was mich etwas wundert. Konkret:Debug.WriteLine("Error: " + Marshal.GetLastWin32Error()); Process curProcess = System.Diagnostics.Process.GetCurrentProcess(); Debug.WriteLine("Error: " + Marshal.GetLastWin32Error()); ProcessModule curModule = curProcess.MainModule; Debug.WriteLine("Error: " + Marshal.GetLastWin32Error());
Liefert:
Error: 127
Error: 127
Error: 2Der Zugriff selbst funktioniert jedoch. So liefert
Debug.WriteLine("Module Name: " + curModule.ModuleName); IntPtr ModuleHandle = GetModuleHandle(curModule.ModuleName); Debug.WriteLine("Module Handle: " + ModuleHandle);
beispielsweise:
Module Name: App.exe
Module Handle: 285212672Ich verstehe nicht warum
1)überhaupt der Fehlercode geändert wird
2)dieser Fehlercode zurückgegeben wird (file not found macht für mich keinen Sinn da es sich ja um den eigenen gerade laufenden Prozess handelt)So bringen die Fehlercodes auf jeden Fall wenig zur Fehlersuche bei pinvoke...
Nachtrag: curModule.FileName liefert den vollständigen und korrekten Pfad zur App.exe
Danke und Gruß
CBecker
-
In Deinen Beispielen sieht man keinen einzigen P/Invoke Aufruf.
-
Warum willst Du überhaupt einen Fehlercode auslesen, wenn nichts vorher einen Fehler verursacht hat? Merke: Solange nicht eine Funktion Dir sagt "ein Fehler ist aufgetreten", interessiert GetLastError Dich nicht.
-
@Knuddlbaer: genau darum geht es ja.
-
Nochmal: GetLastError ist nur von belang, wenn die Funktion, die Du vorher aufgerufen hast, einen Fehler gemeldet hat (z.B. durch Rückgabe von NULL). Ansonsten steht dort irgendwas drin, was von Win32-Interna gesetzt wurde.
Und natürlich benutzen auch .NET-Funktionen intern Win32-Funktionen.
-
Ja danke das wollte ich wissen, so "natürlich" war das für mich nicht. Und zum anderen Punkt: um zu schauen ob dann ein bestimmtes pinvoke einen Fehlercode geliefert hat, muss ja ich auch jeweils den vorherigen Code betrachten um zu sehen ob es eine Änderung gab. Irgendwie umständlich.
-
Wieso? Methode aufrufen, GetLastError prüfen. Im guten alten C Stiel prüfst Du den Rückgabewert der API Funktion doch auch nicht irgendwann mal.