Cómo y por qué usar la utilidad regsvr32.exe [Ejemplos]

A veces, si eres usuario de Windows, es probable que hayas tenido que ejecutar la utilidad regsvr32.exe para “registrar un DLL”. Si es así, probablemente no estabas al tanto de lo que estaba sucediendo bajo la superficie. Esta críptica utilidad se utiliza para gestionar los controles de Object Linking and Embedding (OLE) que muchas aplicaciones de Windows utilizan.

Pero, ¿qué es exactamente un control OLE y por qué querrías registrar un control OLE? En este tutorial, aprenderás las muchas formas de instalar, desinstalar, registrar o anular el registro de un control OLE con la utilidad regsvr32.exe.

Prerrequisitos

Asegúrate de tener los requisitos a continuación para seguir ejecutando la utilidad regsvr32.exe:

  • Dado que la utilidad regsvr32.exe está integrada en la mayoría de las versiones de Windows, solo necesitas una computadora con Windows con una cuenta de administrador.
  • Necesitarás PowerShell 7 para aprovechar el script de PowerShell incluido en este tutorial.

¿Qué son los controles OLE?

Antes de aprender a usar la utilidad regsvr32.exe, primero debes tener una comprensión rudimentaria de lo que gestiona esta herramienta, los controles OLE.

Los controles OLE son una tecnología específica de Windows desarrollada para facilitar la inserción y vinculación de documentos y otros objetos. Esta tecnología ha evolucionado a lo largo de los años, y se han creado diferentes componentes sobre la base de la tecnología OLE.

Es posible que hayas oído hablar del Modelo de Objetos Componente (COM), Modelo de Objetos de Componentes Distribuidos (DCOM), o controles ActiveX. Cada una de estas tecnologías está construida sobre la tecnología OLE o es una extensión de la misma, definiendo una interfaz estándar para funciones escritas en varios lenguajes.

ActiveX está obsoleto pero aún está disponible a través de Internet Explorer en Windows 10, aunque no en Microsoft Edge.

Registro de controles OLE

Ahora que comprendes lo que hace la utilidad regsvr32.exe, es hora de registrar un control OLE, y hay varias variantes de comandos para hacerlo. Siéntete libre de elegir una variante de comando a continuación o simplemente probar cada una.

Puedes registrar controles OLE a través de PowerShell o de un símbolo del sistema de Windows. De cualquier manera, asegúrate de ejecutar tu línea de comandos como administrador para garantizar que el control se registre correctamente.

Mostrar un resultado en la interfaz gráfica

Registrando un DLL con regsvr32, en el caso de uso más simple, implica pasar la ruta del DLL a la herramienta. Por defecto, regsvr32 mostrará una ventana emergente indicando el éxito (o el fallo). Para registrar un DLL, proporciona el nombre o la ruta completa del DLL, como se muestra a continuación.

Ejecutar el comando a continuación creará las clases de registro necesarias para el control OLE de destino en la clave HKEY_CLASSES_ROOT\CLSID para instancias x64 o HKEY_CLASSES_ROOT\WOW6432Node\CLSID para instancias x86.

regsvr32 msxml3.dll

Al tener éxito, verás un resultado en la interfaz gráfica que indica que DllRegisterServer se realizó con éxito.

Registering a DLL

Cuando registras un control OLE, regsvr32.exe aplicará la ruta de búsqueda del sistema. Por lo tanto, si necesitas registrar un archivo específico fuera de esa ruta, es mejor especificar la ruta absoluta del archivo.

Registrando un Control OLE en Silencio

Cuando estás ejecutando comandos, no siempre es deseable que aparezca un cuadro de diálogo. Así que veamos cómo puedes suprimir cualquier cuadro de diálogo al registrar un control OLE.

Para suprimir los cuadros de diálogo, ejecuta regsvr32 seguido del nombre del DLL (msxml3.dll) y el interruptor /s para registrar el control OLE en silencio. La única desventaja de este comando es que también estarás suprimiendo cualquier mensaje de error.

Existe un interruptor no documentado, /e, que suprime solo el mensaje de éxito de la GUI pero muestra el mensaje de error de la GUI. ¡Inteligente!

regsvr32 msxml3.dll /s
Registering a DLL silently

Registrando un Control OLE y Especificando una Acción de Instalación

Cuando especificas una DLL para el registro de un OLE, solo estás llamando al método DllRegisterServer, pero hay momentos en los que necesitas tomar acción después del registro. Para hacer eso, puedes especificar el parámetro /i.

Por ejemplo, podrías pasar una cadena de entrada (U) al parámetro /i que invocará simultáneamente el método DllInstall y el método DllRegisterServer.

El método DllInstall permite que la utilidad regsvr32.exe instale una DLL de más de una forma y se invoquen varias acciones para una DLL.

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

Especificar una Acción de Instalación sin Llamar al Método DllRegisterServer

Tal vez solo quieras instalar un control OLE sin volver a registrarlo. Si es así, ejecuta el siguiente comando.

regsvr32 /n /i:U shell32.dll

El comando anterior utiliza el parámetro /n para evitar llamar al método DllRegisterServer para la DLL shell32.dll en el método de instalación DllInstall.

Only running an install command but not registering a DLL

Anulando el Registro de un Control OLE con regsvr32.exe

Si has registrado un control OLE sin errores, eso es un alivio. Pero puede haber momentos en los que necesites desinstalar un control OLE cuando está en conflicto con otros. Afortunadamente, regsvr32.exe ofrece la capacidad de anular el registro y desinstalar un control OLE.

Para anular el registro y desinstalar un control, ejecuta el regsvr32.exe y pasa el parámetro /u para anular el registro del control OLE. Puedes ver en el resultado de la interfaz de usuario que el DLL msxml3.dll se desinstaló correctamente.

Para ejecutar una acción junto con la anulación del registro, pasa la cadena de acción (U) al parámetro /i. Entonces el comando regsvr32 llamará al método DllInstall con esa acción como una desinstalación, así: regsvr32 /i:acción /U msxml3.dll.

regsvr32 /U msxml3.dll
Unregistering a DLL

Manejo de Errores para regsvr32.exe

Has experimentado el registro exitoso de controles OLE, pero ¿qué pasa si el comando de registro se encuentra con un error? Hay un puñado de errores que pueden aparecer cuando intentas gestionar controles. Estos mensajes pueden ser crípticos a veces, pero se explican a continuación para informarte sobre lo que los 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.

Ampliando la Utilidad regsvr32.exe con PowerShell

Como regsvr32.exe prefiere la salida de la interfaz gráfica de usuario, la automatización puede ser un desafío. Para eliminar ese desafío, puedes envolver la utilidad regsvr32.exe en una función de PowerShell. Al crear una función de PowerShell, puedes ejecutar regsvr32.exe como si fuera un cmdlet nativo de PowerShell.

Como ejemplo, echa un vistazo a la función Invoke-RegSvr32 de PowerShell a continuación. Esta función invoca la utilidad regsvr32 y utiliza PowerShell para capturar el código de salida y procesarlo en consecuencia. Y aplicando una validación de argumentos de antemano, ¡incluso puedes evitar errores por completo!

Para experimentar con la función a continuación, abre una nueva consola de PowerShell y copia y pega el código en ella. Luego, podrás invocar la función como se muestra a continuación.

Function Invoke-RegSvr32 {
	<#
	.SINOPSIS
	Envuelve la utilidad regsvr32.exe de Windows para registrar controles OLE en una función de PowerShell para ayudar en la automatización.
	
	.PARAMETER RutaArchivo
	Especifica el archivo DLL o nombre del control para pasar a regsvr32.exe, debe ser una ruta de archivo válida.
	
	.PARAMETER CadenaInstalación
	Especifica un valor de cadena para pasar como valor de pszCmdLine en la función DllInstall al registrar un control.
	
	.PARAMETER Desregistrar
	Desregistrar un control registrado previamente.
	
	.PARAMETER SoloInstalar
	No registrar un control, solo ejecutar la función DllInstall, que también debe pasar una CadenaInstalación.
	
	.EJEMPLO
	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 {
    # Los códigos de error están documentados en este artículo de 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
    }
	}
}

A continuación, encontrarás algunos ejemplos de cómo utilizar la función Invoke-RegSvr32.

 # Intenta ejecutar solo DllInstall contra msxml3.dll con salida detallada
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose -InstallOnly
 
 # Intenta registrar msxml3.dll en silencio con salida detallada
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose
 
 # Intenta registrar msxml3.dll en silencio pero sin salida
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll"
Running Invoke-RegSvr32 PowerShell Command

Conclusión

Para este punto, has aprendido a registrar y anular el registro de DLL y manejar errores. Aunque regsrv32.exe puede que no se use tanto en las tareas diarias, hay momentos específicos en los que necesitarías registrar o anular el registro de una DLL.

Para ampliar aún más esto, podrías expandir PowerShell para tener en cuenta aún más verificaciones y casos particulares. ¡Incluso podrías crear una función de PowerShell para listar los controles registrados en la ubicación del registro CLSID!

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