Hoe en Waarom de regsvr32.exe Utility te Gebruiken [Voorbeelden]

Af en toe, als je een Windows-gebruiker bent, is de kans groot dat je waarschijnlijk de regsvr32.exe hulpprogramma hebt moeten uitvoeren om een DLL te “registreren”. Als dat het geval is, was je waarschijnlijk niet precies op de hoogte van wat er onder de motorkap gebeurde. Dit cryptische hulpprogramma wordt gebruikt om Object Linking and Embedding (OLE) controls te beheren die veel Windows-toepassingen gebruiken.

Maar wat is precies een OLE-control en waarom zou je een OLE-control willen registreren? In deze tutorial leer je de vele manieren om een OLE-control te installeren, deïnstalleren, registreren of deregistreren met behulp van het regsvr32.exe hulpprogramma.

Vereisten

Zorg ervoor dat je aan de onderstaande vereisten voldoet om het regsvr32.exe hulpprogramma uit te voeren:

  • Aangezien het regsvr32.exe hulpprogramma is ingebouwd in de meeste versies van Windows, heb je alleen een Windows-computer nodig met een beheerdersaccount.
  • Je hebt PowerShell 7 nodig om gebruik te kunnen maken van het PowerShell-script dat is opgenomen in deze tutorial.

Wat zijn OLE-controls?

Voordat je leert hoe je het regsvr32.exe hulpprogramma moet gebruiken, moet je eerst een rudimentair begrip hebben van wat dit hulpprogramma beheert, namelijk OLE-controls.

OLE-controls zijn een Windows-specifieke technologie die is ontwikkeld om het insluiten en koppelen van documenten en andere objecten te vergemakkelijken. Deze technologie heeft zich in de loop der jaren ontwikkeld en verschillende componenten zijn gebouwd bovenop de OLE-technologie.

Je hebt misschien gehoord van Component Object Model (COM), Distributed Component Object Model (DCOM), of ActiveX-controls. Elk van deze technologieën is gebouwd op of is een uitbreiding van de OLE-technologie die een standaardinterface definieert voor functies geschreven in verschillende programmeertalen.

ActiveX is verouderd maar nog steeds beschikbaar via Internet Explorer op Windows 10, maar niet op Microsoft Edge.

Registratie van OLE-controls

Nu je begrijpt wat het hulpprogramma regsvr32.exe doet, is het tijd om een OLE-control te registreren, en er zijn verschillende commando-varianten om dat te doen. Kies een van de onderstaande commando-varianten of probeer ze gewoon allemaal.

Je kunt OLE-controls registreren via PowerShell of een Windows-opdrachtprompt. Zorg er in beide gevallen voor dat je de opdrachtprompt uitvoert als beheerder om ervoor te zorgen dat de control correct wordt geregistreerd.

Weergave van een GUI-resultaat

Het registreren van een DLL met regsvr32, in het eenvoudigste geval, houdt in dat het DLL-pad aan de tool wordt doorgegeven. Standaard geeft regsvr32 een pop-up weer om succes (of mislukking) aan te geven. Om een DLL te registreren, dient u de naam of het volledige pad van de DLL zoals hieronder weergegeven op te geven.

Door de onderstaande opdracht uit te voeren, worden de benodigde registerklassen voor de doel-OLE-besturingselement gemaakt in de HKEY_CLASSES_ROOT\CLSID-sleutel voor x64-instanties of in de HKEY_CLASSES_ROOT\WOW6432Node\CLSID-sleutel voor x86-instanties.

regsvr32 msxml3.dll

Bij succes ziet u een GUI-resultaat waarin wordt vermeld dat DllRegisterServer succesvol was.

Registering a DLL

Wanneer u een OLE-besturingselement registreert, past regsvr32.exe het systeemzoekpad toe. Als u dus een specifiek bestand buiten dat pad moet registreren, kunt u het beste het absolute pad naar het bestand opgeven.

Een OLE-besturingselement stil registreren

Wanneer u opdrachten uitvoert, is het niet altijd wenselijk dat er een GUI-prompt wordt weergegeven. Laten we dus eens kijken hoe u elke GUI-prompt kunt onderdrukken bij het registreren van een OLE-besturingselement.

Om GUI-prompt te onderdrukken, voert u regsvr32 uit, gevolgd door de DLL-naam (bijv. msxml3.dll) en de /s-schakelaar om het OLE-besturingselement stil te registreren. Het enige nadeel van deze opdracht is dat u ook eventuele foutmeldingen onderdrukt.

Een ongedocumenteerde schakelaar, /e, bestaat waarmee u alleen het GUI-succesbericht kunt onderdrukken, maar het GUI-foutbericht wordt weergegeven – slim!

regsvr32 msxml3.dll /s
Registering a DLL silently

Het registreren van een OLE-besturingselement en het specificeren van een installatieactie

Wanneer u een DLL opgeeft voor een OLE-registratie, roept u alleen de methode DllRegisterServer aan, maar er zijn momenten waarop u actie moet ondernemen na registratie. Om dat te doen, kunt u de parameter /i specificeren.

Bijvoorbeeld, u kunt een invoerreeks (U) doorgeven aan de parameter /i die zowel de methode DllInstall als de methode DllRegisterServer zal oproepen.

De methode DllInstall stelt het hulpprogramma regsvr32.exe in staat om een DLL op meer dan één manier te installeren en verschillende acties op te roepen voor één DLL.

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

Het specificeren van een installatieactie zonder de methode DllRegisterServer aan te roepen

Misschien wilt u alleen een OLE-besturingselement installeren zonder het opnieuw te registreren. Als dat het geval is, voer dan de volgende opdracht uit.

regsvr32 /n /i:U shell32.dll

De bovenstaande opdracht gebruikt de parameter /n om te voorkomen dat de methode DllRegisterServer wordt aangeroepen voor de DLL shell32.dll bij de installatiemethode DllInstall.

Only running an install command but not registering a DLL

Een OLE-besturingselement afmelden met regsvr32.exe

Als u een OLE-besturingselement zonder fouten heeft geregistreerd, is dat een opluchting. Maar er kan een moment komen waarop u een OLE-besturingselement moet verwijderen als het conflicteert met andere besturingselementen. Gelukkig biedt regsvr32.exe de mogelijkheid om een OLE-besturingselement af te melden en te verwijderen.

Om een controle te deregistreren en te verwijderen, voer je regsvr32.exe uit en geef je de parameter /u mee om de OLE-controle te deregistreren. In de onderstaande GUI-resultaat kun je zien dat de DLL msxml3.dll succesvol is verwijderd.

Om een actie uit te voeren samen met het deregistreren, geef je de actiestring (U) mee aan de parameter /i. Dan zal het regsvr32-commando de methode DllInstall aanroepen met die actie als een de-installatie, zoals: regsvr32 /i:actie /U msxml3.dll.

regsvr32 /U msxml3.dll
Unregistering a DLL

Foutafhandeling voor regsvr32.exe

Je hebt succesvol OLE-controles geregistreerd, maar wat als het registratiecommando een fout tegenkomt? Er zijn een paar fouten die kunnen optreden wanneer je probeert controles te beheren. Deze meldingen kunnen soms cryptisch zijn, maar hieronder worden ze uitgelegd zodat je weet wat ze veroorzaakt.

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.

Uitbreiding van het hulpprogramma regsvr32.exe met PowerShell

Aangezien regsvr32.exe de GUI-uitvoer verkiest, kan automatisering een uitdaging zijn. Om die uitdaging aan te gaan, kun je het hulpprogramma regsvr32.exe in een PowerShell-functie verpakken. Door een PowerShell-functie te maken, kun je regsvr32.exe uitvoeren alsof het een ingebouwde PowerShell-cmdlet is.

Als voorbeeld, bekijk de Invoke-RegSvr32 PowerShell-functie hieronder. Deze functie roept het regsvr32-hulpprogramma aan en gebruikt PowerShell om de exitcode vast te leggen en deze dienovereenkomstig te verwerken. En door vooraf argumentvalidatie toe te passen, kun je zelfs fouten volledig vermijden!

Om te experimenteren met de onderstaande functie, open een nieuwe PowerShell-console en kopieer en plak de code erin. Vervolgens kun je de functie oproepen zoals hieronder weergegeven.

Function Invoke-RegSvr32 {
	<#
	.SYNOPSIS
	Omsluit het regsvr32.exe Windows-hulpprogramma voor het registreren van OLE-besturingselementen in een PowerShell-functie om te helpen bij automatisering.
	
	.PARAMETER FilePath
	Geeft het DLL- of besturingsnaam op om door te geven aan regsvr32.exe, moet een geldig bestandspad zijn.
	
	.PARAMETER InstallString
	Geeft een tekenreekswaarde op die moet worden doorgegeven als de waarde pszCmdLine in de DllInstall-functie bij het registreren van een besturingselement.
	
	.PARAMETER Unregister
	Meld een eerder geregistreerd besturingselement af.
	
	.PARAMETER InstallOnly
	Registreer geen besturingselement, voer alleen de DllInstall-functie uit, waarbij ook een InstallString moet worden doorgegeven.
	
	.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 {
    # Foutcodes worden gedocumenteerd in dit Microsoft-artikel
	  # <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
    }
	}
}

Hieronder vind je een paar voorbeelden van hoe je de functie Invoke-RegSvr32 kunt gebruiken.

 # Probeer alleen de DllInstall uit te voeren tegen msxml3.dll met Verbose output
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose -InstallOnly
 
 # Probeer msxml3.dll stil te registreren met Verbose output
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose
 
 # Probeer msxml3.dll stil te registreren maar zonder output
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll"
Running Invoke-RegSvr32 PowerShell Command

Conclusie

Op dit moment heb je geleerd hoe je DLL’s kunt registreren en deregistreren en hoe je fouten kunt afhandelen. Hoewel regsrv32.exe misschien niet zo vaak wordt gebruikt bij dagelijkse taken, zijn er bepaalde momenten waarop je een DLL moet registreren of deregistreren.

Om dit nog verder uit te breiden, zou je PowerShell kunnen aanpassen om nog meer controles en uitzonderingen te omvatten. Je zou zelfs een PowerShell-functie kunnen maken om de geregistreerde controls in de CLSID-registerlocatie weer te geven!

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