Como e Por Que Usar o Utilitário regsvr32.exe [Exemplos]

Nas vezes em que és um utilizador do Windows, é provável que tenhas tido de executar a utilidade regsvr32.exe para “registar uma DLL”. Se assim for, provavelmente não estavas ciente do que estava a acontecer nos bastidores. Esta utilidade enigmática é usada para gerir controlos Object Linking and Embedding (OLE) que muitas aplicações do Windows utilizam.

Mas afinal, o que é um controlo OLE e por que razão gostarias de registar um controlo OLE? Neste tutorial, vais aprender as diversas formas de instalar, desinstalar, registar ou anular o registo de um controlo OLE com a utilidade regsvr32.exe.

Pré-requisitos

Assegura-te de que tens os requisitos abaixo para seguir em frente e executar a utilidade regsvr32.exe:

  • Como a utilidade regsvr32.exe está incorporada na maioria das versões do Windows, apenas precisas de um computador com Windows e uma conta de administrador.
  • Vais precisar do PowerShell 7 para tirar partido do script do PowerShell incluído neste tutorial.

O que são Controlos OLE?

Antes de aprenderes como utilizar a utilidade regsvr32.exe, deves ter uma compreensão rudimentar do que esta ferramenta gere, que são os controlos OLE.

Os controles OLE são uma tecnologia específica do Windows desenvolvida para facilitar a incorporação e a vinculação a documentos e outros objetos. Esta tecnologia evoluiu ao longo dos anos, e diferentes componentes foram construídos sobre a tecnologia OLE.

Você pode ter ouvido falar do Component Object Model (COM), Distributed Component Object Model (DCOM) ou controles ActiveX. Cada uma dessas tecnologias é construída sobre a tecnologia OLE ou é uma extensão dela, definindo uma interface padrão para funções escritas em várias linguagens diferentes.

O ActiveX está obsoleto, mas ainda disponível via Internet Explorer no Windows 10, não sendo suportado no Microsoft Edge.

Registro de Controles OLE

Agora que você entende o que a utilidade regsvr32.exe faz, é hora de registrar um controle OLE, e existem várias variantes de comando para fazer isso. Sinta-se à vontade para escolher uma variante de comando abaixo ou experimentar cada uma delas.

Você pode registrar controles OLE via PowerShell ou prompt de comando do Windows. De qualquer maneira, certifique-se de estar executando sua linha de comando como administrador para garantir que o controle seja registrado corretamente.

Exibindo um Resultado de GUI

Registrando um DLL com regsvr32, no caso de uso mais simples, envolve passar o caminho do DLL para a ferramenta. Por padrão, o regsvr32 exibirá uma janela pop-up indicando sucesso (ou falha). Para registrar um DLL, forneça o nome ou o caminho completo do DLL, conforme mostrado abaixo.

A execução do comando abaixo criará as classes de registro necessárias para o controle OLE de destino na chave HKEY_CLASSES_ROOT\CLSID para instâncias x64 ou HKEY_CLASSES_ROOT\WOW6432Node\CLSID para instâncias x86.

regsvr32 msxml3.dll

Em caso de sucesso, você verá um resultado GUI indicando que DllRegisterServer foi bem-sucedido.

Registering a DLL

Ao registrar um controle OLE, regsvr32.exe aplicará o caminho de busca do sistema. Portanto, se você precisar registrar um arquivo específico fora desse caminho, é melhor especificar o caminho absoluto do arquivo.

Registrando um Controle OLE Silenciosamente

Ao executar comandos, nem sempre é desejável exibir um prompt GUI. Vamos ver como suprimir qualquer prompt GUI ao registrar um controle OLE.

Para suprimir prompts GUI, execute regsvr32 seguido do nome do DLL (msxml3.dll) e da opção /s para registrar o controle OLE silenciosamente. A única desvantagem deste comando é que você também suprimirá quaisquer mensagens de erro.

Existe um interruptor não documentado, /e, que suprime apenas a mensagem de sucesso GUI, mas mostra a mensagem de erro GUI. Inteligente!

regsvr32 msxml3.dll /s
Registering a DLL silently

Registar um Controlo OLE e Especificar uma Ação de Instalação

Ao especificar uma DLL para um registo OLE, está apenas a chamar o método DllRegisterServer, mas há momentos em que precisa de tomar ação após o registo. Para isso, pode especificar o parâmetro /i.

Por exemplo, poderia passar uma string de entrada (U) para o parâmetro /i, que invocará o método DllInstall e o método DllRegisterServer simultaneamente.

O método DllInstall permite que a utilidade regsvr32.exe instale uma DLL de mais de uma forma e invoque várias ações para uma DLL.

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

Especificar uma Ação de Instalação Sem Chamar o Método DllRegisterServer

Talvez queira apenas instalar um controlo OLE sem o registar novamente. Se for o caso, execute o seguinte comando.

regsvr32 /n /i:U shell32.dll

O comando acima utiliza o parâmetro /n para evitar chamar o método DllRegisterServer para a DLL shell32.dll no método de instalação, DllInstall.

Only running an install command but not registering a DLL

Desregistrar um Controlo OLE com regsvr32.exe

Se já passou pelo registo de um controlo OLE sem erros, então é um alívio. Mas pode haver momentos em que precisa de desinstalar um controlo OLE quando está em conflito com outros. Felizmente, regsvr32.exe oferece a capacidade de desregistar e desinstalar um controlo OLE.

Para anular o registro e desinstalar um controle, execute o regsvr32.exe e passe o parâmetro /u para anular o registro do controle OLE. Você pode ver no resultado da GUI abaixo que o DLL msxml3.dll foi desinstalado com sucesso.

Para executar uma ação junto com a anulação do registro, passe a string de ação (U) para o parâmetro /i. Então o comando regsvr32 chamará o método DllInstall com essa ação como uma desinstalação, como: regsvr32 /i:ação /U msxml3.dll.

regsvr32 /U msxml3.dll
Unregistering a DLL

Tratamento de Erros para regsvr32.exe

Você conseguiu registrar com sucesso controles OLE, mas e se o comando de registro encontrar um erro? Existem alguns erros que podem aparecer ao tentar gerenciar controles. Essas mensagens podem ser enigmáticas às vezes, mas estão detalhadas abaixo para informar sobre suas causas.

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.

Ampliando a Utilidade regsvr32.exe com PowerShell

Como o regsvr32.exe prefere a saída da GUI, a automação pode ser um desafio. Para superar esse desafio, você pode encapsular a utilidade regsvr32.exe em uma função do PowerShell. Ao criar uma função do PowerShell, você pode executar o regsvr32.exe como se fosse um cmdlet nativo do PowerShell.

Como exemplo, veja abaixo a função PowerShell Invoke-RegSvr32. Esta função invoca a utilidade regsvr32 e usa o PowerShell para capturar o código de saída e processá-lo adequadamente. E aplicando uma validação de argumento antecipadamente, você pode até evitar erros completamente!

Para experimentar a função abaixo, abra um novo console do PowerShell e copie e cole o código nele. Em seguida, você poderá invocar a função conforme mostrado abaixo.

Function Invoke-RegSvr32 {
	<#
	.SINOPSE
	Envolve a utilidade do Windows regsvr32.exe para registrar controles OLE em uma função PowerShell para auxiliar na automação.
	
	.PARÂMETRO FilePath
	Especifica o DLL ou nome do controle a ser passado para regsvr32.exe, deve ser um caminho de arquivo válido.
	
	.PARÂMETRO InstallString
	Especifique um valor de string a ser passado como valor pszCmdLine na função DllInstall ao registrar um controle.
	
	.PARÂMETRO Unregister
	Cancelar o registro de um controle previamente registrado.
	
	.PARÂMETRO InstallOnly
	Não registrar um controle, apenas executar a função DllInstall, que também deve passar uma InstallString.
	
	.EXEMPLO
	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 {
    # Os códigos de erro estão documentados neste artigo da 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
    }
	}
}

Abaixo, você encontrará alguns exemplos de como usar a função Invoke-RegSvr32.

 # Tente executar apenas o DllInstall no msxml3.dll com saída detalhada
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose -InstallOnly
 
 # Tente registrar o msxml3.dll silenciosamente com saída detalhada
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose
 
 # Tente registrar o msxml3.dll silenciosamente, mas sem saída
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll"
Running Invoke-RegSvr32 PowerShell Command

Conclusão

Agora, você aprendeu como registrar e desregistrar DLLs e lidar com erros. Embora regsrv32.exe possa não ser usado com tanta frequência nas tarefas diárias, há momentos em que você precisa registrar ou desregistrar uma DLL.

Para expandir ainda mais, você poderia estender o PowerShell para lidar com mais verificações e casos específicos. Você até poderia criar uma função PowerShell para listar os controles registrados na localização do registro CLSID!

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