|
Wenn Sie wissen möchten, ob eine DLL eine ActiveX-DLL ist,
können Sie dies über eine Versuch-Irrtum-Konstruktion in Erfahrung
bringen. Wir haben wie üblich die notwendigen API-Aufrufe in eine
Hilfsfunktion verpackt - in die Funktion IsDLLActiveX.
Mit der API-Funktion LoadLibrary
laden Sie die betreffende DLL und versuchen anschließend über die
API-Funktion GetProcAddress
die Adresse der Funktion DllRegisterServer zu ermitteln. Das ist
eine Funktion, die jede ActiveX-DLL anbieten muss - über sie wird
die DLL aufgefordert (zum Beispiel von dem Tool RegSvr32.EXE),
sich zu registrieren. Wurde die Prozeduradresse ermittelt, wird von
unserer Hilfsfunktion True zurückgegeben. Abschließend wird die
DLL über die API-Funktion FreeLibrary
wieder entladen.
Unter Umständen kann die DLL erst gar nicht geladen werden.
Dafür gibt es verschiedene Gründe. In der Regel können Sie dann
aber davon ausgehen, dass es sich nicht um eine ActiveX-DLL handelt
(wir setzen voraus, Sie übergeben einen gültigen Dateipfad). Falls
Sie der tatsächliche Grund dennoch interessiert, übergeben Sie im
optionalen Parameter RaiseError den Wert True. Dann wird ein
Laufzeitfehler ausgelöst, über den Sie den Fehlercode der
LoadLibrary-Funktion erhalten und auswerten können. Sie brauchen
lediglich vom zurückgegebenen Fehlerwert (Err.Number)
den Basiswert 10000 abzuziehen. Da uns jedoch die
Bedeutung dieses Fehlerwerts hier nicht näher interessiert,
überlasse ich es Ihnen, die Bedeutung der Fehlercodes zu bewerten.
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 IsDLLActiveX(DLLPath As String, _
Optional ByVal RaiseError As Boolean) As Boolean
Dim nHMod As Long
Dim nLastDllError As Long
nHMod = LoadLibrary(DLLPath)
If nHMod = 0 Then
If RaiseError Then
nLastDllError = Err.LastDllError
Err.Raise 10000 + nLastDllError, "IsDLLActiveX", _
"LoadLibrary-Error: " & nLastDllError
End If
End If
IsDLLActiveX = Abs(CBool(GetProcAddress(nHMod, _
"DllRegisterServer")))
FreeLibrary nHMod
End Function
|