RSS
StartseiteKnowledge LibraryTop 10Impressum

Als die Fehler Sprechen lernten...

Fehlerbeschreibungen zu Windows API Fehlernummern ermitteln

Für viele Funktionen des Windows API lässt sich über die LastDllError-Eigenschaft des Err-Objekts ein Fehlercode abfragen. Eine weitere API Funktion liefert die aussagekräftige Beschreibung dazu...

Viele Funktionen des Windows API geben über ihre direkte Rückgabe nur an, ob sie erfolgreich abgeschlossen wurden oder fehlgeschlagen sind. Den wahren Grund für einen Fehlschlag liefert die LastDllError-Eigenschaft des Err-Objekts in Form einer Fehlernummer.

Auch wenn in der MSDN immer von GetLastError die Rede ist, so ist diese API Funktion unter VB nicht zuverlässig, da man unter Umständen den letzten Fehler eines API Aufrufs der VB Runtime auswertet.

So eine Fehlernummer alleine ist aber meist wenig aussagekräftig und dem Err-Objekt fehlt eine entsprechende Eigenschaft, die den passenden Fehlertext zum API Fehlercode zurückgibt. Mithilfe der API Funktion FormatMessage, kann man hier allerdings nachhelfen und kommt so doch noch zu einer meist aussagekräftigen Beschreibung des Fehlers und kann diesen besser beheben:

Private Declare Function FormatMessage Lib "kernel32" Alias _
       "FormatMessageA" (ByVal dwFlags As Long, _
        ByRef lpSource As Any, ByVal dwMessageId As Long, _
        ByVal dwLanguageId As Long, ByVal lpBuffer As String, _
        ByVal nSize As Long, ByRef Arguments As Long) As Long

Private Const FORMAT_MESSAGE_FROM_SYSTEM    As Long = &H1000
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Long = &HFF
Private Const LANG_USER_DEFAULT             As Long = &H400&

Public Function ErrorDescription(ByVal Number As Long) As String
  Dim lBuffer As String
  Dim lRet    As Long
  
  lBuffer = Space$(512)
  lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or _
                       FORMAT_MESSAGE_MAX_WIDTH_MASK, _
                       ByVal 0&, Number, LANG_USER_DEFAULT, _
                       lBuffer, Len(lBuffer), ByVal 0)
  
  If CBool(lRet) Then
    ErrorDescription = Left$(lBuffer, lRet)
  End If
End Function