VB 5/6-Tipp 0242: ActiveX-Komponenten zur Laufzeit registrieren
von ActiveVB
Beschreibung
ActiveDLLs und ActiveEXEs haben in ihrer Datei eine Funktion integriert, die es gestattet sie registrieren und wieder abzumelden, ohne daß dafür auf einen externen Registrierungsserver (RegSvr32) zugegriffen werden muß. Dieser Tipp zeigt, wie die beiden eingebauten Funktionen ansprechbar sind.
Update von Florian Rittmeier (Florian@ActiveVB.de) und Jochen Wierum(JoWi@ActiveVB.de): Das Registrieren von ActiveX-Exen wurde vereinfacht.
Dieser Tipp funktioniert entweder nur in kompilierter Form oder benötigt eine DLL/OCX-Datei. Diese Binärdateien sind dem Tipp hinzugefügt worden, um seinen Funktionsumfang darstellen zu können. Vor dem Upload wurden sie auf Viren geprüft.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: CloseHandle, CreateThread, ExitThread, FreeLibrary, GetExitCodeThread, GetProcAddress, LoadLibraryA (LoadLibrary), WaitForSingleObject | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Schaltfläche "Command3" (Index von 0 bis 1) ' Steuerelement: Schaltfläche "Command4" ' Steuerelement: Schaltfläche "Command1" (Index von 0 bis 1) ' Steuerelement: Schaltfläche "Command2" 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 Private APath As String Private Sub Command1_Click(Index As Integer) 'Un/Registrieren Dim mode As Boolean mode = IIf(Index = 0, True, False) Call RegServeDLL(APath & "Multi-dll.dll", mode) End Sub Private Sub Command2_Click() 'Testen Shell APath & "dll-test.exe", vbNormalFocus 'Der Sourcecode der DLL-Test.exe '---> Start Source Dll-Test 'On Error GoTo Abbruch 'Dim Calc As New Multiplikation 'Dim Ergebnis As Long 'Ergebnis = Calc.Multip(5, 8) 'Call MsgBox("Die DLL ist registriert!" & vbCrLf & "Sie " & _ ' "liefert bei Aufruf folgende Ausgabe:" & vbCrLf & _ ' vbCrLf & "5 * 8 = " & Ergebnis) 'Exit Sub 'Abbruch: 'MsgBox ("Die DLL ist nicht registiert und kann" & vbCrLf & _ ' "daher nicht ausgeführt werden!") '<--- Ende Source Dll-Test End Sub Private Sub RegServeDLL(ByVal Path As String, mode 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 MsgBox ("Fehler! Der Vorgang wurde abgebrochen.") Else MsgBox ("Der Vorgang war erfolgreich!") End If End Sub Private Sub Command3_Click(Index As Integer) 'Un/Registrieren Dim mode As Boolean mode = IIf(Index = 0, True, False) Call RegServeEXE(APath & "Multi-EXE.exe", mode) End Sub Private Sub RegServeEXE(ByVal Path As String, mode As Boolean) On Error Goto Fehler 'ActiveX-Exen besitzen von sich aus eine Methode, sich zu registrieren If mode Then Shell Path & " /regserver" Else Shell Path & " /unregserver" End If MsgBox ("Der Vorgang war erfolgreich!") Exit Sub Fehler: MsgBox ("Fehler! Der Vorgang wurde abgebrochen." & vbCrLf & Err.Number & ": " & Err.Description) End Sub Private Sub Command4_Click() 'Testen Shell APath & "exe-test.exe", vbNormalFocus End Sub Private Sub Form_Load() APath = App.Path If Right(App.Path, 1) <> "\" Then APath = APath & "\" End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 7 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Herbert Tomberger am 08.04.2007 um 10:36
meine frage?
wenn ich eine aurostart cd einlege bekomme ich immer die meltung
fehler beim registrieren des active x
für eine kleine hielfe währe ich dankbar.
gruß
herbert
Kommentar von Florian Rittmeier am 09.06.2005 um 20:39
Die Codezeilen:
Call GetExitCodeThread(hThd, lpExCode)
Call ExitThread(lpExCode)
können entfernt werden. Sie machen absolut keinen Sinn. Rein praktisch können sie sogar echt für Probleme sorgen.
Gruß Florian
Kommentar von Florian Rittmeier am 09.06.2005 um 20:36
@Hans Ohlerth:
Auch wenn dein Eintrag schon etwas her ist, aber dies bedeutet, dass man die Datei schlicht nicht auf diesem Weg registrieren muss.
Kommentar von hans ohlerth am 06.08.2004 um 18:41
Ich möchte gerne den VFW-kompatiblen Video-Codec mit der Commandozeile "regsrv32 pdvcodec.dll" in Win registrieren, damit er im Gerätemanager unter den Video-Codecs erscheint.
Der Codec pdvcodec.dll liegt am richtigen Ort in C:\Windows\system32. Beim Ausführen des Befehls erhalte ich aber immer die Meldung:
"pdvcodec.dll wurde geladen aber der DLLRegisterServer-Eingangspunkt wurde nicht gefunden". Können Sie mir bitte helfen u. am besten eine Datei vorformulieren, mit der ich das Problem lösen kann? Ich verstehe nichts von Programmiersprachen, falls diese gefragt sind. Vielen, vielen Dank
Hans
Kommentar von Florian Rittmeier am 16.07.2003 um 00:36
@HJHanstein:
Bei der Funktion geht es ja auch darum, eine ganz spezielle DLL zu registrieren. Und bei regsvr32 muss den Pfad auch nur dann nicht angeben, wenn sich die Datei im Standardsuchpfad befindet. Dieses Verhalten lässt sich aber ohne Probleme nachprogrammieren. Steht alles in der MSDN.
@HOhlerth:
Dann ist pdvcodec.dll keine ActiveX-Dll.
Gruß Florian
Kommentar von HOhlerth am 29.12.2002 um 20:02
Habe alles probiert u. komme nicht vorwärts. Möchte in XP mit regsrv32 den pdvcodec.dll registrieren, erhalte aber immer die Fehlermeldung "pdvcodec.dll wurde geladen, aber der DLLRegisterServer-Eingangspunkt wurde nicht gefunden". Was kann ich tun? Bitte um Hilfe-Antwort. Danke
Kommentar von HJHanstein am 15.11.2002 um 16:09
Danke - geht prima, nur muß man wissen, in welchem Pfad die registrierte Datei steht - bei regsvr32 muß man das nicht !