Hi,
Da deine lieben Admins Eure PC's also so zugenagelt haben, dass sich nicht mal Dll's selbst registrieren können, so hier die ultimative Lösung.
Weil ja Nicolaus war, habe ich eine gute Tat vollbracht und einen universellen COM-Loader geschrieben, der es ermöglicht, COM-Objecte aus Dateien zu erzeugen. Die Dateien wären zB in VB geschriebene ActiveX.dll's. Die Funktion selbst habe ich in eine native DLL verpackt namens: GetCOMObject.dll.
Die habe ich als Download zur Verfügung gestellt, hier:
http://www.file-upload.net/download-6904961/GetCOMObject.dll.html
Zum Download: Den ganz kleinen Downloadbutton verwenden, sonst lädt man den Download-Manger herunter, der tuts nicht. Die Datei heißt:
GetCOMObject.DLL
und ist 16 kB groß - mehr nicht.
Die DLL hat nur eine einzige Funktion. Hier die Deklaration für VB:
Private Declare Function GetVBDllObject Lib _
"Dein_Pfad_zur_Dll\GetComObject.dll" ( _
ByVal sFile As String, _
ByVal sCLSID As String, _
ppV As Any) As Long GetVBDllObject
sFile: Pfad und Namen der ActiveX.dll
sCLSID: CLSID der von der ActiveX.dll exportierten Klasse in der Form:
(Beispiel) : "{453C54F1-2535-4C28-B86A-14E8541309C4}"
ppV: Ist die Objektvariable. Die Dll gibt die IDispatch-Schnittstelle zurück, womit
andere Compiler über late Binding mit der Objektinstanz arbeiten können.
Wenn man in VB eine ActiveX.dll erstellt hat, so kommt man mit einem COM-Viewer, Ole-View zum
Beispiel, an die CLSID, in dem man die ActiveX.dll in den Viewer lädt und der Viewer dann
die Typelib der Dll auslesen kann (ActiveX.dll's schleppen diese meist in den Resourcen mit).
Und zum Schluß noch ein Anwendungsbeispiel:
Eine Mini-Active.X.dll, die öffentliche Klasse wurde DllObject genannt und zwei Methoden:
Public Function GetA() As Long
GetA = 10
End Function
Public Function MakeNr(ByVal a As Long, ByVal b As Long) As Long
MakeNr = a + b
End Function Als MyMath.dll kompiliert
In VB dann:
Private Declare Function GetVBDllObject Lib "D:\ActDllTest\GetComObject.dll" ( _
ByVal sFile As String, _
ByVal sCLSID As String, _
ppV As Any) As Long
Private Sub Form_Load()
Dim o As Object
Dim rval As Long
Dim clsid As String
clsid = "{453C54F1-2535-4C28-B86A-14E8541309C4}"
rval = GetVBDllObject("D:\ActDllTest\MyMath.dll", clsid, o)
MsgBox o.MakeNr(11, 14)
End Sub Reicht mindestens dazu, bis deine Test's abgeschlossen sind und dann die ActiveX.dll
ordentlich durch die Admins registriert werden kann - oder auch nicht.
GetVBDllObject gibt S_OK zurück, wenn der Aufruf geklappt hat, ansonst E_NOTIMPL.
Die Konstante für S_OK ist 0. E_NOTIMPL ist also ungleich 0.
Beitrag wurde zuletzt am 09.12.12 um 11:03:03 editiert. |