Zum vorherigen AbschnittZum nächsten Abschnitt Ermitteln der Fehler-Rückmeldung eines API-Aufrufs
Fehlt bei einer VB-internen Funktion beispielsweise eine Angabe, wird sofort darauf hingewiesen und man erhält eine klare Fehlermeldung. Anders ist das bei API-Aufrufen: Diese geben (wenn überhaupt) nur zurück, ob sie fehlerfrei ausgeführt werden konnten oder nicht. Um diese genauen Fehler-Rückmeldungen zu ermitteln, muss man sich - wie so oft - einer weiteren API-Funktion bedienen.
Ihre Bewertung:
 12345
    

Bewertung dieses Tipps:  (bewertet von insgesamt 8 Besuchern)

 Zum vorherigen AbschnittZum nächsten Abschnitt Deklarationen und die Funktion
Um diese API-Funktion in Ihren eigenen Projekten verwenden zu können, muss Sie zuerst im Kopf der Datei deklariert werden. Zusätzlich werden noch einige Konstanten und eine Funktion benötigt. Ich empfehle Ihnen, diese Deklarationen und die Funktion in einem Modul zu plazieren, da die Funktion dann später im gesamten Projekt zur Verfügung steht.

Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000
Private Const FORMAT_MESSAGE_FROM_HMODULE = &H800
Private Const FORMAT_MESSAGE_FROM_STRING = &H400
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF

Function WinAPIError(ByVal lLastDLLError As Long) As String
   Dim sBuff As String
   Dim lCount As Long

   sBuff = String$(256, 0)
   lCount = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0, lLastDLLError, 0&, sBuff, Len(sBuff), ByVal 0)
   If lCount Then WinAPIError = Left$(sBuff, lCount)
End Function

 Zum vorherigen AbschnittZum nächsten Abschnitt Aufruf/Beispiel
Der Aufruf der Funktion ist nicht schwer. Hier ein kleines Beispiel, bei dem der API-Funktion "GetPrivateProfileString" (siehe INI-Dateien lesen und schreiben) u.a. kein Dateiname übergeben wird und es zur Fehlermeldung "Der angegebene Pfad wurde nicht gefunden" führt:

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Private Sub Form_Load()
   Dim Buf As String
   Dim Result As Long

   Buf = String(255, 0)
   Result = GetPrivateProfileString("", "Test", "", Buf, Len(Buf), "")
   If Result = 0 Then 'Wenn irgendetwas nicht geklappt hat...
      MsgBox WinAPIError(Err.LastDllError) '...den genauen Fehler ermitteln
   End If
End Sub

Achtung: Leider funktioniert die genaue Fehler-Ermittlung nicht bei allen API-Funktionen; manche geben einfach nur "Der Vorgang wurde ausgeführt" zurück.


Quellen: SHADOWare.de, vbAccelerator.com
Letzte Änderung: 17.00
©2000 by SHADOWare, Thomas Bachem