Wie und warum man das Dienstprogramm regsvr32.exe verwendet [Beispiele]

Manchmal, wenn Sie ein Windows-Benutzer sind, haben Sie wahrscheinlich schon mal das Dienstprogramm regsvr32.exe ausgeführt, um eine DLL zu „registrieren“. Wenn ja, waren Sie sich wahrscheinlich nicht genau bewusst, was unter der Oberfläche passiert ist. Dieses kryptische Dienstprogramm wird verwendet, um Object Linking and Embedding (OLE) Steuerelemente zu verwalten, die viele Windows-Anwendungen verwenden.

Aber was genau ist ein OLE-Steuerelement und warum möchten Sie ein OLE-Steuerelement registrieren? In diesem Tutorial lernen Sie die verschiedenen Möglichkeiten kennen, ein OLE-Steuerelement mit dem Dienstprogramm regsvr32.exe zu installieren, zu deinstallieren, zu registrieren oder zu deregistrieren.

Voraussetzungen

Vergewissern Sie sich, dass Sie die folgenden Anforderungen erfüllen, um das Dienstprogramm regsvr32.exe auszuführen:

  • Da das Dienstprogramm regsvr32.exe in den meisten Versionen von Windows integriert ist, benötigen Sie nur einen Windows-Computer mit einem Administrator-Konto.
  • Sie benötigen PowerShell 7, um von dem in diesem Tutorial enthaltenen PowerShell-Skript zu profitieren.

Was sind OLE-Steuerelemente?

Bevor Sie lernen, wie Sie das Dienstprogramm regsvr32.exe verwenden, müssen Sie zunächst ein grundlegendes Verständnis dafür haben, was dieses Tool verwaltet, nämlich OLE-Steuerelemente.

OLE-Steuerungen sind eine Windows-spezifische Technologie, die entwickelt wurde, um das Einbetten und Verknüpfen von Dokumenten und anderen Objekten zu erleichtern. Diese Technologie hat sich im Laufe der Jahre weiterentwickelt, und verschiedene Komponenten wurden auf der Grundlage der OLE-Technologie entwickelt.

Sie haben vielleicht von Component Object Model (COM), Distributed Component Object Model (DCOM) oder ActiveX-Steuerungen gehört. Jede dieser Technologien basiert entweder auf der OLE-Technologie oder ist eine Erweiterung davon, die eine standardisierte Schnittstelle für Funktionen definiert, die in vielen verschiedenen Sprachen geschrieben wurden.

ActiveX ist veraltet, aber über Internet Explorer auf Windows 10 weiterhin verfügbar, jedoch nicht über Microsoft Edge.

Registrierung von OLE-Steuerungen

Jetzt, da Sie verstehen, was das Dienstprogramm regsvr32.exe tut, ist es an der Zeit, eine OLE-Steuerung zu registrieren, und es gibt mehrere Befehlsvarianten, um das zu tun. Wählen Sie eine der folgenden Befehlsvarianten aus oder probieren Sie einfach jede aus.

Sie können OLE-Steuerungen über PowerShell oder eine Windows-Eingabeaufforderung registrieren. Stellen Sie in jedem Fall sicher, dass Sie Ihre Befehlszeile als Administrator ausführen, um sicherzustellen, dass die Steuerung ordnungsgemäß registriert wird.

Anzeige eines GUI-Ergebnisses

Die Registrierung einer DLL mit regsvr32 erfolgt im einfachsten Anwendungsfall durch Angabe des DLL-Pfads an das Tool. Standardmäßig zeigt regsvr32 ein Popup-Fenster an, das den Erfolg oder Misserfolg anzeigt. Um eine DLL zu registrieren, geben Sie den Namen oder den vollständigen Pfad der DLL wie unten gezeigt an.

Das Ausführen des folgenden Befehls erstellt die erforderlichen Registrierungsklassen für die Ziel-OLE-Steuerelemente im Schlüssel HKEY_CLASSES_ROOT\CLSID für x64-Instanzen oder HKEY_CLASSES_ROOT\WOW6432Node\CLSID für x86-Instanzen.

regsvr32 msxml3.dll

Bei Erfolg wird ein GUI-Ergebnis angezeigt, das angibt, dass DllRegisterServer erfolgreich war.

Registering a DLL

Bei der Registrierung eines OLE-Steuerelements wendet regsvr32.exe den System-Suchpfad an. Wenn Sie also eine bestimmte Datei außerhalb dieses Pfads registrieren möchten, ist es am besten, den absoluten Pfad zur Datei anzugeben.

Stilles Registrieren eines OLE-Steuerelements

Beim Ausführen von Befehlen ist es nicht immer wünschenswert, dass ein GUI-Prompt angezeigt wird. Daher zeigen wir Ihnen, wie Sie jegliche GUI-Prompt beim Registrieren eines OLE-Steuerelements unterdrücken können.

Um GUI-Prompts zu unterdrücken, führen Sie regsvr32 gefolgt vom DLL-Namen (msxml3.dll) und dem Schalter /s aus, um das OLE-Steuerelement still zu registrieren. Der einzige Nachteil dieses Befehls besteht darin, dass auch alle Fehlermeldungen unterdrückt werden.

Es gibt einen nicht dokumentierten Schalter /e, der nur die GUI-Erfolgsmeldung unterdrückt, jedoch die GUI-Fehlermeldung anzeigt – clever!

regsvr32 msxml3.dll /s
Registering a DLL silently

Registrieren einer OLE-Steuerelement und Angeben einer Installationsaktion

Wenn Sie eine DLL für eine OLE-Registrierung angeben, rufen Sie nur die Methode DllRegisterServer auf, aber es gibt Zeiten, in denen Sie nach der Registrierung eine Aktion ausführen müssen. Dazu können Sie den Parameter /i angeben.

Zum Beispiel könnten Sie einen Eingabestring (U) an den Parameter /i übergeben, der die Methode DllInstall und die Methode DllRegisterServer gleichzeitig aufruft.

Die Methode DllInstall ermöglicht es dem Dienstprogramm regsvr32.exe, eine DLL auf mehr als eine Weise zu installieren und verschiedene Aktionen für eine DLL aufzurufen.

regsvr32 /i:U shell32.dll
Registering a DLL and running an install command

Angabe einer Installationsaktion ohne Aufruf der Methode DllRegisterServer

Vielleicht möchten Sie nur ein OLE-Steuerelement installieren, ohne es neu zu registrieren. Wenn ja, führen Sie den folgenden Befehl aus.

regsvr32 /n /i:U shell32.dll

Der obige Befehl verwendet den Parameter /n, um den Aufruf der Methode DllRegisterServer für die DLL shell32.dll für die Installationsmethode DllInstall zu verhindern.

Only running an install command but not registering a DLL

Deaktivieren einer OLE-Steuerung mit regsvr32.exe

Wenn Sie eine OLE-Steuerelement ohne Fehler registriert haben, ist das eine Erleichterung. Aber es kann eine Zeit geben, in der Sie eine OLE-Steuerelement deinstallieren müssen, wenn es mit anderen in Konflikt steht. Glücklicherweise bietet regsvr32.exe die Möglichkeit, eine OLE-Steuerelement zu deaktivieren und zu deinstallieren.

Um ein Steuerelement abzumelden und zu deinstallieren, führen Sie das regsvr32.exe aus und übergeben Sie den Parameter /u, um das OLE-Steuerelement abzumelden. Sie können im untenstehenden GUI-Ergebnis sehen, dass die DLL msxml3.dll erfolgreich deinstalliert wurde.

Um eine Aktion zusammen mit der Abmeldung auszuführen, übergeben Sie den Aktionsschlüssel (U) an den Parameter /i. Dann ruft der Befehl regsvr32 die Methode DllInstall mit dieser Aktion als Deinstallation auf, z. B.: regsvr32 /i:Aktion /U msxml3.dll.

regsvr32 /U msxml3.dll
Unregistering a DLL

Fehlerbehandlung für regsvr32.exe

Sie haben erfolgreich OLE-Steuerelemente registriert, aber was passiert, wenn der Registrierungsbefehl auf einen Fehler stößt? Es gibt eine Handvoll Fehler, die auftreten können, wenn Sie versuchen, Steuerelemente zu verwalten. Diese Nachrichten können manchmal kryptisch sein, aber unten sind die Ursachen aufgeschlüsselt, um Sie darüber zu informieren.

FAIL_ARGS ⦿ “Unrecognized flag”
⦿ “Extra argument on command line”
⦿ “This command is only valid when an OLE Custom Control project is open”
⦿ “No DLL name specified”
Implies that a command-line argument was incorrect.
FAIL_OLE “OleInitialize failed” Implies that there was an error in properly initializing the OLE subsystem.
FAIL_LOAD LoadLibary(<dllname) failed> This can be a host of reasons such as a dependent library missing, the DLL is inaccessible due to permissions, or the file is missing.
FAIL_ENTRY ⦿ ” was loaded, but the entry point was not found. does not appear to be an .DLL or .OCX file”
⦿ ” was loaded, but the entry point was not found. may not be exported or a corrupt version may be in memory. Consider using PView to detect and remove it.”
⦿ ” was loaded, but the entry point was not found. may not be exported, or a corrupt version may be in memory. Consider using WPS to detect and remove it.”
Implies that the entry point in the DLL, or function name, is missing.
FAIL_REG <DLLEntryPoint> in <DLLName> failed Implies that despite all the prior steps completing the system still failed to fully register the DLL.

Erweitern des Dienstprogramms regsvr32.exe mit PowerShell

Da regsvr32.exe die GUI-Ausgabe bevorzugt, kann die Automatisierung eine Herausforderung darstellen. Um diese Herausforderung zu bewältigen, können Sie das Dienstprogramm regsvr32.exe in eine PowerShell-Funktion einbetten. Durch das Erstellen einer PowerShell-Funktion können Sie regsvr32.exe ausführen, als ob es ein nativer PowerShell-Befehl wäre.

Als Beispiel, schauen Sie sich unten die Invoke-RegSvr32 PowerShell-Funktion an. Diese Funktion ruft das Dienstprogramm regsvr32 auf und verwendet PowerShell, um den Exit-Code zu erfassen und entsprechend zu verarbeiten. Und durch die Anwendung einer Argumentvalidierung im Voraus können Sie sogar Fehler ganz vermeiden!

Um mit der untenstehenden Funktion zu experimentieren, öffnen Sie eine neue PowerShell-Konsole und kopieren Sie den Code hinein. Dann können Sie die Funktion wie unten gezeigt aufrufen.

Function Invoke-RegSvr32 {
	<#
	.SYNOPSIS
	Wickeln Sie das Windows-Dienstprogramm regsvr32.exe zum Registrieren von OLE-Steuerungen in einer PowerShell-Funktion ein, um die Automatisierung zu unterstützen.
	
	.PARAMETER FilePath
	Gibt den DLL- oder Steuerungsnamen an, der an regsvr32.exe übergeben werden soll, muss ein gültiger Dateipfad sein.
	
	.PARAMETER InstallString
	Geben Sie einen Zeichenfolgenwert an, der als Wert für pszCmdLine in der Funktion DllInstall übergeben werden soll, wenn eine Steuerung registriert wird.
	
	.PARAMETER Unregister
	Melden Sie eine zuvor registrierte Steuerung ab.
	
	.PARAMETER InstallOnly
	Registrieren Sie keine Steuerung, führen Sie nur die Funktion DllInstall aus, für die ebenfalls eine InstallString übergeben werden muss.
	
	.EXAMPLE
	PS> Invoke-RegSvr32 "C:\\Windows\\System32\\msxml3.dll"
	#>
  [CmdletBinding()]
  
  Param (
    [ValidateScript({ Test-Path -Path $_ -PathType 'Leaf' })]
    [String]$FilePath,
    [ValidateScript({-Not [String]::IsNullOrWhiteSpace($_)})]
    $InstallString,
    [Switch]$Unregister,
    [Switch]$InstallOnly
  )

  Begin {
    # Fehlercodes sind in diesem Microsoft-Artikel dokumentiert
	  # <https://devblogs.microsoft.com/oldnewthing/20180920-00/?p=99785>
    $ExitCodes = @{
      0 = "SUCCESS";
      1 = "FAIL_ARGS - Invalid Argument";
      2 = "FAIL_OLE - OleInitialize Failed";
      3 = "FAIL_LOAD - LoadLibrary Failed";
      4 = "FAIL_ENTRY - GetProcAddress failed";
      5 = "FAIL_REG - DllRegisterServer or DllUnregisterServer failed.";
    }
  }

  Process {
    If ($InstallOnly -And -Not $InstallString) {
      Write-Error "If you are running DllInstall by itself, an install string must be included."
      Return
    }

    $Arguments = "/s{0}{1}{2} {3}" -f
      (($Unregister) ? ' /U': ''),
      (($InstallString) ? " /i:$InstallString": ''),
      (($InstallOnly) ? ' /n': ''),
      $FilePath

    Write-Verbose $Arguments

    Try {
      $Result = Start-Process -FilePath 'regsvr32.exe' -Args $Arguments -Wait -NoNewWindow -PassThru

      If ($Result.ExitCode -NE 0) {
        Write-Error $ExitCodes[$Result.ExitCode]
      }
    } Catch {
      Write-Error $_.Exception.Message
    }
	}
}

Nachfolgend finden Sie einige Beispiele zur Verwendung der Invoke-RegSvr32-Funktion.

 # Versuch, nur DllInstall gegen msxml3.dll mit ausführlicher Ausgabe auszuführen
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose -InstallOnly
 
 # Versuch, msxml3.dll still zu registrieren mit ausführlicher Ausgabe
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose
 
 # Versuch, msxml3.dll still zu registrieren, aber keine Ausgabe
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll"
Running Invoke-RegSvr32 PowerShell Command

Schlussfolgerung

Bis jetzt haben Sie gelernt, wie man DLLs registriert und deregistriert und Fehler behandelt. Obwohl regsrv32.exe bei alltäglichen Aufgaben vielleicht nicht so häufig verwendet wird, gibt es bestimmte Zeiten, in denen Sie eine DLL registrieren oder deregistrieren müssen.

Um dies noch weiter auszudehnen, könnten Sie PowerShell erweitern, um noch mehr Überprüfungen und Randfälle zu berücksichtigen. Sie könnten sogar eine PowerShell-Funktion erstellen, um die registrierten Steuerelemente im CLSID-Registrierungsort aufzulisten!

Source:
https://adamtheautomator.com/regsvr32-exe/