Come e Perché Utilizzare l’Utility regsvr32.exe [Esempi]

A volte, se sei un utente Windows, è probabile che tu abbia dovuto eseguire l’utilità regsvr32.exe per “registrare una DLL”. Se è così, probabilmente non eri consapevole di ciò che stava accadendo sotto sotto. Questa criptica utility viene utilizzata per gestire i controlli Object Linking and Embedding (OLE) che molte applicazioni Windows utilizzano.

Ma cosa sono esattamente un controllo OLE e perché vorresti registrare un controllo OLE? In questo tutorial, imparerai i molti modi per installare, disinstallare, registrare o annullare la registrazione di un controllo OLE con l’utilità regsvr32.exe.

Prerequisiti

Assicurati di avere i requisiti seguenti per seguire l’utilizzo dell’utilità regsvr32.exe:

  • Dato che l’utilità regsvr32.exe è integrata nella maggior parte delle versioni di Windows, ti serve solo un computer Windows con un account amministratore.
  • Avrai bisogno di PowerShell 7 per usufruire dello script PowerShell incluso in questo tutorial.

Cosa sono i Controlli OLE?

Prima di imparare come utilizzare l’utilità regsvr32.exe, devi prima avere una comprensione rudimentale di cosa gestisce questo strumento, i controlli OLE.

Gli OLE controls sono una tecnologia specifica di Windows sviluppata per agevolare l’incorporamento e il collegamento a documenti e altri oggetti. Questa tecnologia si è evoluta nel corso degli anni e sono stati costruiti diversi componenti sulla base della tecnologia OLE.

Potresti aver sentito parlare di Component Object Model (COM), Distributed Component Object Model (DCOM) o controlli ActiveX. Ognuna di queste tecnologie è costruita su o estensione della tecnologia OLE, che definisce un’interfaccia standard per le funzioni scritte in molti linguaggi diversi.

Gli ActiveX sono deprecati, ma sono ancora disponibili tramite Internet Explorer su Windows 10, ma non su Microsoft Edge.

Registrazione degli OLE Controls

Ora che hai capito cosa fa l’utilità regsvr32.exe, è il momento di registrare un OLE control, e ci sono diverse varianti di comando per farlo. Scegli una delle varianti di comando qui sotto o prova ognuna di esse.

Puoi registrare gli OLE controls tramite PowerShell o un prompt dei comandi di Windows. In entrambi i casi, assicurati di eseguire la riga di comando come amministratore per garantire una corretta registrazione del controllo.

Visualizzazione di un risultato GUI

Registrare una DLL con regsvr32, nel caso d’uso più semplice, comporta passare il percorso della DLL al tool. Per impostazione predefinita, regsvr32 visualizzerà una finestra popup che indica il successo (o il fallimento). Per registrare una DLL, fornire il nome o il percorso completo della DLL come mostrato di seguito.

Eseguire il comando seguente creerà le classi di registro necessarie per il controllo OLE di destinazione nella chiave HKEY_CLASSES_ROOT\CLSID per le istanze x64 o HKEY_CLASSES_ROOT\WOW6432Node\CLSID per le istanze x86.

regsvr32 msxml3.dll

In caso di successo, verrà visualizzato un risultato GUI che indica che DllRegisterServer è stato eseguito correttamente.

Registering a DLL

Quando si registra un controllo OLE, regsvr32.exe applicherà il percorso di ricerca di sistema. Pertanto, se è necessario registrare un file specifico al di fuori di quel percorso, è meglio specificare il percorso assoluto del file.

Registrare un controllo OLE in modo silenzioso

Quando si eseguono comandi, non è sempre auspicabile visualizzare una finestra di dialogo GUI. Quindi vediamo come è possibile sopprimere eventuali finestre di dialogo GUI durante la registrazione di un controllo OLE.

Per sopprimere le finestre di dialogo GUI, eseguire regsvr32 seguito dal nome della DLL (msxml3.dll) e dallo switch /s per registrare il controllo OLE in modo silenzioso. L’unico inconveniente di questo comando è che si sopprimeranno anche eventuali messaggi di errore.

Esiste uno switch non documentato, /e, che sopprime solo il messaggio di successo GUI ma mostra il messaggio di errore GUI—intelligente!

regsvr32 msxml3.dll /s
Registering a DLL silently

Registrare un controllo OLE e specificare un’azione di installazione

Quando si specifica una DLL per una registrazione OLE, si chiama solo il metodo DllRegisterServer, ma ci sono momenti in cui è necessario agire dopo la registrazione. Per farlo, è possibile specificare il parametro /i.

Ad esempio, è possibile passare una stringa di input (U) al parametro /i, che invocherà contemporaneamente il metodo DllInstall e il metodo DllRegisterServer.

Il metodo DllInstall consente all’utilità regsvr32.exe di installare una DLL in più modi e di invocare varie azioni per una DLL.

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

Specifica di un’azione di installazione senza chiamare il metodo DllRegisterServer

Forse si desidera solo installare un controllo OLE senza ri-registrarlo. In tal caso, eseguire il seguente comando.

regsvr32 /n /i:U shell32.dll

Il comando sopra utilizza il parametro /n per evitare la chiamata del metodo DllRegisterServer per la DLL shell32.dll nel metodo di installazione, DllInstall.

Only running an install command but not registering a DLL

Annullare la registrazione di un controllo OLE con regsvr32.exe

Se hai completato la registrazione di un controllo OLE senza errori, allora è un sollievo. Ma potrebbe esserci un momento in cui è necessario disinstallare un controllo OLE quando entra in conflitto con altri. Fortunatamente, regsvr32.exe offre la possibilità di annullare la registrazione e disinstallare un controllo OLE.

Per disiscrivere e disinstallare un controllo, eseguire il regsvr32.exe e passare il parametro /u per disiscrivere il controllo OLE. Puoi vedere nel risultato GUI sottostante che la DLL msxml3.dll è stata disinstallata con successo.

Per eseguire un’azione insieme alla disiscrizione, passare la stringa dell’azione (U) al parametro /i. Quindi il comando regsvr32 chiamerà il metodo DllInstall con quell’azione come disinstallazione, così: regsvr32 /i:azione /U msxml3.dll.

regsvr32 /U msxml3.dll
Unregistering a DLL

Gestione degli errori per regsvr32.exe

Hai avuto successo nel registrare i controlli OLE, ma cosa succede se il comando di registrazione si imbatte in un errore? Ci sono alcuni errori che possono apparire quando si tenta di gestire i controlli. Questi messaggi possono essere criptici a volte ma vengono scomposti di seguito per farti sapere cosa li causa.

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.

Estendere l’utilità regsvr32.exe con PowerShell

Poiché regsvr32.exe preferisce l’output GUI, l’automazione può essere una sfida. Per superare questa sfida, è possibile avvolgere l’utilità regsvr32.exe in una funzione PowerShell. Creando una funzione PowerShell, è possibile eseguire regsvr32.exe proprio come se fosse un cmdlet nativo di PowerShell.

Come esempio, controlla la funzione PowerShell Invoke-RegSvr32 qui sotto. Questa funzione invoca l’utilità regsvr32 e utilizza PowerShell per catturare il codice di uscita e elaborarlo di conseguenza. E applicando una convalida degli argomenti in anticipo, puoi anche evitare errori del tutto!

Per sperimentare con la funzione sottostante, apri una nuova console PowerShell e copia-incolla il codice in essa. Quindi, sarai in grado di invocare la funzione come mostrato di seguito.

Function Invoke-RegSvr32 {
	<#
	.SINTESI
	Avvolgi l'utilità Windows regsvr32.exe per registrare i controlli OLE in una funzione PowerShell per aiutare nell'automazione.
	
	.PARAMETRO PercorsoFile
	Specifica il nome del file DLL o del controllo da passare a regsvr32.exe, deve essere un percorso file valido.
	
	.PARAMETRO InstallString
	Specifica un valore di stringa da passare come valore pszCmdLine nella funzione DllInstall durante la registrazione di un controllo.
	
	.PARAMETRO Deregistrare
	Deregistra un controllo precedentemente registrato.
	
	.PARAMETRO InstallazioneSolo
	Non registrare un controllo, esegui solo la funzione DllInstall, che deve anche passare un InstallString.
	
	.ESEMPIO
	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 {
    # I codici di errore sono documentati in questo articolo Microsoft
	  # <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
    }
	}
}

Di seguito troverai alcuni esempi su come utilizzare la funzione Invoke-RegSvr32.

 
# Tentativo di eseguire solo il DllInstall contro msxml3.dll con output Dettagliato

 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose -InstallOnly
 
 
# Tentativo di registrare msxml3.dll in modo silenzioso con output Dettagliato

 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose
 
 
# Tentativo di registrare msxml3.dll in modo silenzioso ma senza output

 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll"
Running Invoke-RegSvr32 PowerShell Command

Conclusione

A questo punto, hai imparato a registrare e deregistrare le DLL e a gestire gli errori. Anche se regsvr32.exe potrebbe non essere utilizzato così spesso nelle attività quotidiane, ci sono certi momenti in cui è necessario registrare o deregistrare una DLL.

Per estendere ulteriormente questo concetto, potresti ampliare PowerShell per gestire ancora più controlli e casi particolari. Potresti addirittura creare una funzione PowerShell per elencare i controlli registrati nella posizione del registro CLSID!

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