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

Em certos momentos, se você é um usuário do Windows, é provável que você já tenha precisado executar o utilitário regsvr32.exe para “registrar uma DLL”. Se sim, você provavelmente não estava ciente do que exatamente estava acontecendo nos bastidores. Este utilitário críptico é usado para gerenciar controles de Object Linking and Embedding (OLE) que muitos aplicativos do Windows utilizam.

Mas o que exatamente é um controle OLE e por que você gostaria de registrar um controle OLE? Neste tutorial, você aprenderá as muitas maneiras de instalar, desinstalar, registrar ou cancelar o registro de um controle OLE com o utilitário regsvr32.exe.

Pré-requisitos

Assegure-se de ter os requisitos abaixo para seguir executando o utilitário regsvr32.exe:

  • Como o utilitário regsvr32.exe está incorporado na maioria das versões do Windows, você só precisa de um computador Windows com uma conta de administrador.
  • Você precisará do PowerShell 7 para aproveitar o script do PowerShell incluído neste tutorial.

O que são Controles OLE?

Antes de aprender como usar o utilitário regsvr32.exe, você deve primeiro ter uma compreensão rudimentar do que essa ferramenta gerencia, controles OLE.

OLE controls são uma tecnologia específica do Windows desenvolvida para facilitar a incorporação e a vinculação a documentos e outros objetos. Essa 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, porém não no Microsoft Edge.

Registrando 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 simplesmente tentar cada uma.

Você pode registrar controles OLE via PowerShell ou prompt de comando do Windows. De qualquer forma, 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á um pop-up indicando sucesso (ou falha). Para registrar um DLL, forneça o nome ou o caminho completo do DLL conforme mostrado abaixo.

Executar o comando abaixo criará as classes de registro necessárias para o controle OLE alvo na chave HKEY_CLASSES_ROOT\CLSID para instâncias x64 ou HKEY_CLASSES_ROOT\WOW6432Node\CLSID para instâncias x86.

regsvr32 msxml3.dll

Após o sucesso, você verá um resultado de GUI observando 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 para o arquivo.

Registrando um Controle OLE Silenciosamente

Quando você está executando comandos, nem sempre é desejável que um prompt de GUI seja exibido. Então, vamos ver como você pode suprimir qualquer prompt de GUI ao registrar um controle OLE.

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

Um switch não documentado, /e, existe, que suprime apenas a mensagem de sucesso de GUI, mas mostra a mensagem de erro de GUI – inteligente!

regsvr32 msxml3.dll /s
Registering a DLL silently

Registrando um Controle OLE e Especificando uma Ação de Instalação

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

Por exemplo, você pode 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 várias maneiras e invoque várias ações para uma DLL.

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

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

Talvez você queira apenas instalar um controle OLE sem registrá-lo novamente. Se for o caso, execute o seguinte comando.

regsvr32 /n /i:U shell32.dll

O comando acima usa o parâmetro /n para evitar a chamada do 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

Desregistrando um Controle OLE com regsvr32.exe

Se você passou pelo registro de um controle OLE sem erros, então é um alívio. Mas pode haver momentos em que você precisa desinstalar um controle OLE quando está conflitando com outros. Felizmente, regsvr32.exe oferece a capacidade de desregistrar e desinstalar um controle OLE.

Para cancelar o registro e desinstalar um controle, execute o regsvr32.exe e passe o parâmetro /u para cancelar 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 o cancelamento 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, assim: regsvr32 /i:action /U msxml3.dll.

regsvr32 /U msxml3.dll
Unregistering a DLL

Tratamento de Erros para regsvr32.exe

Você já teve sucesso ao registrar 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 criptografadas à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, confira 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 conforme necessário. E ao aplicar uma validação de argumento com antecedência, você pode até evitar erros por completo!

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 regsvr32.exe do Windows para registrar controles OLE em uma função PowerShell para auxiliar na automação.
	
	.PARAMETER FilePath
	Especifica o DLL ou nome do controle a ser passado para regsvr32.exe, deve ser um caminho de arquivo válido.
	
	.PARAMETER InstallString
	Especifique um valor de string a ser passado como valor pszCmdLine na função DllInstall ao registrar um controle.
	
	.PARAMETER Unregister
	Cancela o registro de um controle previamente registrado.
	
	.PARAMETER InstallOnly
	Não registre um controle, apenas execute a função DllInstall, que também deve passar um 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.

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

Conclusão

Agora, você aprendeu a lidar com o registro e desregistro de DLLs e a lidar com erros. Embora regsrv32.exe não seja usado tanto nas tarefas do dia a dia, há momentos em que você precisa registrar ou desregistrar uma DLL.

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

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