2017-11-20 3 views
0

Es gibt drei verschiedene Rückgabe-/Fehler-/Statuscodetypen, die ich beim Aufruf der nativen Funktion mit Pinvoke erhalte. Der erste ist der übliche Fehlercode, den ich durch Aufruf der statischen Methode Marshal.GetLastWin32Error erhalte. Der zweite ist HRESULT, den ich beim Aufruf einiger COM-Hilfsfunktionen erhalte. Und der dritte ist NTSTATUS, den ich bekomme, während ich ein natives API aus der ntdll.dll-Bibliothek anrufe. Ich habe eine Log-Funktion, die den Rückgabe-/Fehler-/Statuscode als Hexadezimalzahl protokolliert. Wenn ein Fehler in den Logs gefunden wird, muss ich google verwenden, um herauszufinden, was der eigentliche Fehler ist.Protokollierungsfehler beim Pinnen?

Also möchte ich fragen, ob es eine gute Möglichkeit gibt, diese Rückkehr/Fehler/Status-Codes in Zeichenfolge (vorzugsweise in Englisch) zu konvertieren, um die Rückkehr/Fehler/Status-String-Beschreibung anstelle einer Zahl zu protokollieren? Gibt es eine Möglichkeit, zwischen LastError/HRESULT/NTSTATUS-Codes zu konvertieren, so dass die Semantik der Fehlermeldung gleich bleiben würde?

+1

Wenn Sie diese Fehler nicht als außergewöhnlich behandeln, ist das ziemlich problematisch, es ist nie etwas Nettes passiert, und die Chancen, dass Sie sie einfach abschlagen können, sollten ziemlich niedrig sein. Ziehen Sie in Betracht, eine Ausnahme auszulösen, können Sie sich immer einen Catch-Handler anmelden. Win32-Ausnahmen werden von Win32Exception generiert, ohne dass GetLastWin32Error() aufgerufen werden muss. COM-Ausnahmen werden mit Marshal.ThrowExceptionForHR() generiert. Sie machen beide die Arbeit, eine textliche Darstellung für den Fehler zu erhalten. NTSTATUS-Codes sind knifflig, da sie oft von einem bestimmten Modul erzeugt werden. Sie müssen FormatMessage() anpinnen. –

+0

Es gibt keine magische Kugel IMHO. FormatMessage ist oft nützlich, wie hier auf SO erklärt: https://stackoverflow.com/questions/7008047/is-there-a-way-to-get-the-string-representation-of-hresult-value-using-win- api sonst schlage ich dieses kostenlose Online-Tool vor (das ich kürzlich nach 20+ Jahren mit dem gleichen Problem geschrieben habe), das ist viel besser als zufälliges googeln: http://www.magnumdb.com es wird Ihnen Fehlercode nach Name oder Name durch Code usw. und die .h-Datei, die es definiert usw. –

Antwort

0

Sie können errorlook tools für diesen Zweck verwenden. Dieser Link ist etwas alt, ich habe das in meinen alten VC++ Tagen gelernt, und Sie können es als Ausgangspunkt verwenden, um moderne Tools zu finden.

Wie für die Protokollierung würde ich vorschlagen, dass Sie die ursprünglichen Fehlercodes behalten. Aussagekräftige Fehlermeldungen sind leichter zu lesen, aber die ursprünglichen Fehlercodes sind genaue Schlüsselwörter für die Suchmaschinen.

Verwandte Themen