|
Wenn Ihre Anwendung eine bestimmte Standard-DLL verwenden soll, deren Funktionen Sie als DLL-Funktionen ("Declare Sub/Funktion...") deklariert haben, können Sie sich natürlich darauf verlassen, dass sich Visual Basic mit einem Laufzeitfehler bemerkbar macht, falls diese DLL nicht gefunden werden sollte. Allerdings prüft Visual Basic das Vorhandensein einer DLL nicht global gleich beim Programmstart, sondern erst bei der ersten Verwendung einer (deklarierten) Funktion dieser DLL.
Allerdings könnte sich Ihre Anwendung jedoch zu diesem Zeitpunkt in einem kritischen Zustand befinden, der trotz abfangbarem Laufzeitfehler nicht so einfach ohne Integritätsprobleme oder Seiteneffekte abzuwickeln wäre. Daher wäre es sinnvoll, die Verfügbarkeit einer DLL gleich beim Programmstart zu prüfen und die Anwendung beim Fehlen der DLL entweder abzubrechen, oder die kritischen Bereiche, in denen die DLL-Funktionen verwendet werden, zu sperren.
Zur Prüfung nutzen Sie die Möglichkeit, eine DLL mit der API-Funktion LoadLibrary unter Angabe ihres Dateipfades explizit zu laden (auch wenn Sie damit ansonsten in Visual Basic anfangen können). Ist der Ladeversuch erfolglos, gibt sie 0 zurück. Anderenfalls gibt sie ein Modul-Handle zurück, das sie anschließend mit der API-Funktion FreeLibrary noch entsorgen müssen.
Private Declare Function LoadLibrary Lib "kernel32" _
Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As Long) As Long
Public Function IsDLLAvailable(DLLPath As String) As Boolean
Dim nHMod As Long
nHMod = LoadLibrary(DLLPath)
If nHMod Then
IsDLLAvailable = True
FreeLibrary nHMod
End If
End Function
Natürlich könnten Sie das Vorhandensein einer DLL-Datei auch einfach auf der Ebene des Datei-Systems prüfen. Doch das hätte unter Umständen zuvor etwas Sucharbeit zur Folge, wenn der genaue Pfad nicht bekannt ist. Die API-Funktion LoadLibrary hingegen findet die DLL immerhin auch dann, wenn sie sich im aktuellen Suchpfad befindet (Verzeichnis der Anwendung, DOS-Pfad, speziell einer Anwendung zugeordnete Pfade).
Außerdem stellt sie sicher, dass es sich tatsächlich um eine DLL handelt - es könnte ja sein, dass ein Anwender irgendeine andere Datei darüberkopiert hat. Eine verbesserte Variante der Funktion IsDLLAvailable könnte daher noch das Vorhandensein einer der deklarierten Funktionen prüfen, über die API-Funktion GetProcAddress:
Private Declare Function LoadLibrary Lib "kernel32" _
Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As Long) As Long
Public Function IsDLLProcAvailable(DLLPath As String, _
Optional ProcName As String) As Boolean
Dim nHMod As Long
nHMod = LoadLibrary(DLLPath)
If nHMod Then
If StrPtr(ProcName) Then
IsDLLProcAvailable = CBool(GetProcAddress(nHMod, ProcName))
Else
IsDLLProcAvailable = True
End If
FreeLibrary nHMod
End If
End Function
|