Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0242: ActiveX-Komponenten zur Laufzeit registrieren

 von 

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 () und Jochen Wierum(): 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:

Schwierigkeitsgrad 3

Verwendete API-Aufrufe:

CloseHandle, CreateThread, ExitThread, FreeLibrary, GetExitCodeThread, GetProcAddress, LoadLibraryA (LoadLibrary), WaitForSingleObject

Download:

Download des Beispielprojektes [15,07 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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 !