DLL laden

06/02/2009 - 21:34 von Mike Wesling | Report spam
Hallo,

ich müsste aus einem VBA-Makro heraus eine .NET-DLL zur Laufzeit
einbinden/registrieren/laden und auf eine Methode zugreifen. Ich habe
schon mal mit der Win32-API Funktion LoadLibrary die DLL geladen und
daher einen gültigen Handle.

Wie geht es aber dann weiter? Hat jemand ein Beispiel hierfür?
 

Lesen sie die antworten

#1 Hartwig Constien
09/02/2009 - 09:51 | Warnen spam
"Mike Wesling" schrieb:

ich müsste aus einem VBA-Makro heraus eine .NET-DLL zur Laufzeit
einbinden/registrieren/laden und auf eine Methode zugreifen. Ich habe
schon mal mit der Win32-API Funktion LoadLibrary die DLL geladen und
daher einen gültigen Handle.

Wie geht es aber dann weiter? Hat jemand ein Beispiel hierfür?



Hallo Mike,

für VB6-ActiveX-DLLs verwende ich die nachstehenden Proceduren. Ob das mit
.Net-DLLs auch so geht, musst Du ausprobieren.

Wenn Deine DLL dauerhaft registriert ist, kannst Du sie im VBA-Editor über
Extras\Verweise fest einbinden. Dann funktioniert auch Intellisence.

Bei dem Weg über LoadLibrary findet keine dauerhaft Registrierung statt. Du
musst dann mit Object arbeiten, hast also kein Intellisence. Da musst Du dann
schon selber wissen, wie Du welche Proceduren anzusprechen hast.

In meinen eigenen VB6-DLLs habe ich immer eine Funktion "IsLoaded"
integriert die True liefert, wenn die DLL angesprochen werden kann, um
bereits registrierte DLLs nicht erneut zu laden.

Hang loose, Hartwig


Option Explicit

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 WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long

Private Declare Function CreateThread Lib "kernel32" _
(lpThreadAttributes As Any, ByVal dwStackSize As Long, _
ByVal lpStartAddress As Long, ByVal lParameter As Long, _
ByVal dwCreationFlags As Long, lpThreadID As Long) As _
Long

Private Declare Function GetExitCodeThread Lib "kernel32" _
(ByVal hThread As Long, lpExitCode As Long) As Long

Private Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode As Long)

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As
Long) As Long

Const STATUS_WAIT_0 = &H0

'Es muss einmalig RegServeDLL gerufen sein, damit getDLL ein Klassenobject
zurückliefert
Public Function getDLL(sClassName As String) As Object
On Error Resume Next
Set getDLL = CreateObject(sClassName)
End Function

'Vor Aufruf muss geklàrt sein, dass die DLL-Datei existiert
'Liefert True, wenn ein Fehler auftrat!
Public Function RegServeDLL(ByVal Path As String, mode As Boolean) As Boolean
Dim insthLib As Long, lpLibAdr As Long, hThd As Long, lpExCode As Long
Dim procName As String, Result As Long, okFlag As Boolean
'DLL in den Speicher laden
insthLib = LoadLibrary(Path)
'Aktion wàhlen
If insthLib Then
If mode Then
procName = "DllRegisterServer"
Else
procName = "DllUnregisterServer"
End If
'Adresse der DLL im Speicher
lpLibAdr = GetProcAddress(insthLib, procName)
If lpLibAdr <> 0 Then
'Aktion starten
hThd = CreateThread(ByVal 0, 0, ByVal lpLibAdr, ByVal 0&, 0&, 0&)
If hThd Then
'Maximal 5 sec warten
Result = WaitForSingleObject(hThd, 5000)
If Result = STATUS_WAIT_0 Then
'Vorgang erfolgreich in 5 Sec beendet
Call CloseHandle(hThd)
okFlag = True
Else
'5 sec überschritten -> Thread schließen
Call GetExitCodeThread(hThd, lpExCode)
Call ExitThread(lpExCode)
Call CloseHandle(hThd)
End If
End If
End If
'Speicher wieder freigeben
Call FreeLibrary(insthLib)
End If
If Not okFlag Then
RegServeDLL = True
Else
RegServeDLL = False
End If
End Function

Ähnliche fragen