Rubrik: Entwicklungsumgebung · Fehlerbehandlung | VB-Versionen: VB4, VB5, VB6 | 13.09.02 |
Win32 API Fehlermeldung Eine Funktion, mit der sich der letzten Win32 API Fehler als Visual Basic Fehlermeldung ausgeben lässt. | ||
Autor: Jan Schöneboom | Bewertung: | Views: 22.236 |
www.silja-software.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Manchmal wäre es hilfreich den letzten Win32 API Fehler als VB Fehlermeldung auszugeben.
Um vielleicht einfach nur sein Programm besser debuggen zu können. Oder um einfach nur den späteren Benutzer zu signalisieren, das ein Fehler aufgetreten ist.
Ich habe hierfür eine Funktion geschrieben, die immer dann aufgerufen werden sollte, wenn eine Win32 API Funktion fehlgeschlagen ist.
Option Explicit ' Benötigte API-Deklarationen Private Declare Function FormatMessage Lib "kernel32" _ Alias "FormatMessageA" ( _ ByVal dwFlags As Long, _ lpSource As Any, _ ByVal dwMessageId As Long, _ ByVal dwLanguageId As Long, _ lpBuffer As Long, _ ByVal nSize As Long, _ Arguments As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ Destination As Any, _ Source As Any, _ ByVal Length As Long) Private Declare Function LocalFree Lib "kernel32" ( _ ByVal hMem As Long) As Long
' ---------------------------------------------------- ' Letzten Fehler einer WinAPI Funktion im Klartext ' ermitteln ' ---------------------------------------------------- Public Sub RaiseLastWin32Error() Const UNKNOW_WIN32API_ERROR = _ "Ein unbekannter Win32 API Fehler ist aufgetreten." Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100 Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000 Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200 Const LANG_NEUTRAL = &H0 Const ERROR_SUCCESS = 0& Dim Buffer As Long Dim Length As Long Dim ErrorMsg As String Dim LastError As Long ' Letzten Win32 API Fehler ermitteln LastError = Err.LastDllError ' Win32 API Fehler von Windows in einen Text ausgeben Length = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER Or _ FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, _ 0&, LastError, LANG_NEUTRAL, Buffer, 0, 0) ' Prüfen ob letzter Fehler wirklich ein Fehler war ' und prüfen ob FormatMessage einen Text bereit ' gestellt hat If (LastError <> ERROR_SUCCESS) And (Length <> 0) Then ErrorMsg = String$(Length, vbNullChar) Call CopyMemory(ByVal ErrorMsg, ByVal Buffer, Length) Call LocalFree(Buffer) Else ErrorMsg = UNKNOW_WIN32API_ERROR End If ' Fehlermeldung ausgeben Call Err.Raise(Number:=vbObjectError + LastError, _ Source:="RaiseLastWin32Error", Description:=ErrorMsg) End Sub ' ----------------------------------------------------