Win32-API-Fehlermeldungen unter .NET ermitteln

Veröffentlicht: 11. Okt 2004 | Aktualisiert: 14. Nov 2004
Von Mathias Schiffer

Arbeiten Sie mit Win32-API-Funktionen, erhalten Sie als Fehlerwerte zumeist nur kryptisch anmutende Rückgabewerte. Das .NET Framework vereinfacht diese Aufgabe.

Wenn Sie unter Visual Basic schon früher gerne (oder zumindest doch oft) mit dem Win32-API in Berührung gekommen sind, dann haben Sie hoffentlich einen der üblichsten Fehler nicht gemacht: Den jeweiligen Empfehlungen der API-Dokumentation zu folgen, dass ein Fehlerwert mithilfe der API-Funktion GetLastError zu ermitteln sei.

Denn da auch die Visual Basic Runtime sich massiv des Win32-APIs bedient, kann nicht garantiert werden, dass der Aufruf von GetLastError einen Fehlerwert für die vom Programmierer zuletzt aufgerufene Funktion zurückliefert. Ebenso kann die VB-Runtime den zugehörigen letzten API-Aufruf abgesetzt haben.

Um dieses Problem zu umgehen, besitzt Visual Basic die Error-Objekteigenschaft Err.LastDllError. Diese Eigenschaft ist zum Glück auch unter Visual Basic .NET noch verfügbar, denn dort ändert sich am Problem eigentlich nur der Name der Runtime: Sie nennt sich jetzt .NET Framework.

Nun hilft eine Fehlernummer jedoch nur selten dabei weiter, das Problem zu erkennen. Hilfreicher ist hier eine natürlichsprachige Beschreibung der Fehlerursache. Dabei hilft Ihnen das Win32-API nicht ganz intuitiv über die Funktion FormatMessage. Im MSDN Quickie "API Fehlermeldungen im Klartext" finden Sie weitere Hinweise zum entsprechenden Vorgehen unter Visual Basic 5/6.

Das .NET Framework macht Ihnen die Aufgabe hier einfacher: Unter Verwendung der für diesen Zweck etwas versteckten Klasse System.ComponentModel.Win32Exception: Übergeben Sie ihr im Kontruktor einfach den per Err.LasrDllError ermittelten Fehlerwert, so können Sie die Klartextbeschreibung der Fehlerursache über die Eigenschaft Message abfragen!

Dim intLastErrorCode As Integer ' Fehlercode
Dim strErrorMessage As String   ' Fehlertext
  
  ' [................]
  ' [Win32-API-Aufruf]
  ' [................]
  
  ' GetLastError-Kapselung verwenden (*nicht* GetLastError!):
  intLastErrorCode = Err.LastDllError
  
  ' Ggf. Fehlerwert auswerten
  If intLastErrorCode <> 0 Then
  
    ' Ermitteln der Klartext-Fehlerbeschreibung:
    strErrorMessage = New System.ComponentModel.Win32Exception(intLastErrorCode).Message
  
    ' Ausgabe der Klartext-Fehlermeldung
    MsgBox(strErrorMessage)
  
  End If

Anzeigen: