Hi,
sorry ich komm etwas spät, aber ich denke ich kann eventuell was konstruktives beisteuern.
Ich habe mal ein kleines Proggie gemacht, das ActiveX-DLLs, die in einem bestimmten Verzechnis waren registriert hat und einen neuen Menüpunkt im Programm daraufhin erzeugt hat. Hier ein paar Code-Schnipsel:
zuerst alle DLL-Dateien eines Verzeichnisses herausfinden. Code dazu findest du in unserem Tipp & Tricks-Archiv. Dann die Dateien nacheinander mit der RegServeFunktion oder Code aus den VB@archiv Tipps&Tricks registrieren
'Hier sind die bis Plugins drin
Public plug() As Object
'Anzahl Plugins
Public pp As Long If RegServe(PluginFile,True) = True Then
Redim Preserve Plug(pp)
'Das plugin erstellen
Set plug(pp) = GetObject("", GetFileNameFromPath(Pluginfile" &" & _
"".PluginClass")
plug(pp).Plugininfo ps, pt, LanguageMode
'Einen neuen Menüpunkt sichtbar machen
Me.mnuplugin(pp).Caption = ps
Me.mnuplugin(pp).Tag = pt
Me.mnuplugin(pp).Visible = True
pp = pp + 1
Else
MsgBox "Plugin konnte nicht geladen werden!" & vbCrLf & vbCrLf & _
PluginFile, vbCritical
End If Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal _
lpLibFileName As String) As Long
Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
ByVal lpProcName As String) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As _
Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As _
Long
Public 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
Public Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As _
Long, lpExitCode As Long) As Long
Public Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode As Long)
Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) _
As Long
Public Const STATUS_WAIT_0 = &H0
Public Function RegServe(ByVal Path$, Mode As Boolean)
Dim insthLib&, lpLibAdr&, hThd&, lpExCode&
Dim procName$, Result&, 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
RegServe = okFlag
End Function In dem Programm benutze ich die Plugins dann wie folgt. Sie zeigten einfach eine neue Form an.
Private Sub mnuPlugin_Click(Index As Integer)
plug(Index).LoadPlugin LanguageMode
End Sub Die Plugins selbst müssen hierbei wie folgt in VB erstellt werden:
- Eine ActiveX-Dll die eine Klasse enthält namens "PluginClass"
- Der Projektname muss dem Dateinamen entsprechen
Nun musst du noch verschieden Schnittstellen-funktionen definieren, die du dann über plug.<funktion> benutzt. Diese Funktionen müssen natürlcih alle Plugins haben, damit keine Fehler auftauchen.
Bye
illuminator
(Programmers don't die, they GOSUB without RETURN...)
|