Как и зачем использовать утилиту regsvr32.exe [Примеры]

Иногда, если вы пользователь Windows, вероятно, вам приходилось запускать утилиту regsvr32.exe для “регистрации DLL-файла”. Если это так, вероятно, вы не знали точно, что происходит под капотом. Эта загадочная утилита используется для управления элементами управления объектами и встраивания (OLE) , которые используют многие приложения Windows.

Но что такое элемент управления OLE и зачем его регистрировать? В этом руководстве вы узнаете много способов установки, удаления, регистрации или отмены регистрации элемента управления OLE с помощью утилиты regsvr32.exe.

Предварительные требования

Убедитесь, что у вас есть необходимые требования, чтобы следовать за выполнением утилиты regsvr32.exe:

  • Поскольку утилита regsvr32.exe встроена в большинство версий Windows, вам нужен только компьютер с Windows и учетной записью администратора.
  • Вам понадобится PowerShell 7, чтобы воспользоваться скриптом PowerShell, включенным в этом руководстве.

Что такое элементы управления OLE?

Прежде чем вы узнаете, как использовать утилиту regsvr32.exe, вам необходимо иметь простое представление о том, что управляет этим инструментом, элементы управления OLE.

Контроли OLE – это технология, специфичная для Windows, разработанная для упрощения встраивания и связывания документов и других объектов. Эта технология развивалась на протяжении многих лет, и на ее основе были созданы различные компоненты.

Возможно, вы слышали о Модели объектов компонентов (COM), Распределенной модели объектов компонентов (DCOM) или контролах ActiveX. Каждая из этих технологий либо построена на основе, либо является расширением технологии OLE, которая определяет стандартный интерфейс для функций, написанных на множестве различных языках.

ActiveX устарел, но все еще доступен через Internet Explorer в Windows 10, но не в Microsoft Edge.

Регистрация контролов OLE

Теперь, когда вы понимаете, что делает утилита regsvr32.exe, пришло время зарегистрировать контрол OLE, и существует несколько вариантов команд для этого. Выберите один из вариантов команды ниже или просто попробуйте каждый из них.

Вы можете зарегистрировать контроли OLE с помощью PowerShell или командной строки Windows. В любом случае убедитесь, что вы запускаете командную строку от имени администратора, чтобы гарантировать правильную регистрацию контрола.

Отображение результата в графическом интерфейсе (GUI)

Регистрация DLL с использованием regsvr32, в самом простом случае, включает передачу пути к DLL инструменту. По умолчанию regsvr32 отобразит всплывающее окно, указывающее на успешность (или неудачу). Чтобы зарегистрировать DLL, укажите имя или полный путь к DLL, как показано ниже.

Запуск команды ниже создаст необходимые классы реестра для целевого элемента управления OLE в ключе HKEY_CLASSES_ROOT\CLSID для экземпляров x64 или HKEY_CLASSES_ROOT\WOW6432Node\CLSID для экземпляров x86.

regsvr32 msxml3.dll

При успехе вы увидите результат в виде графического интерфейса, указывающего, что DllRegisterServer прошел успешно.

Registering a DLL

При регистрации элемента управления OLE regsvr32.exe применяет системный путь поиска. Поэтому, если вам нужно зарегистрировать конкретный файл за пределами этого пути, лучше указать абсолютный путь к файлу.

Регистрация элемента управления OLE молча

Когда вы выполняете команды, не всегда удобно видеть всплывающий запрос. Давайте рассмотрим, как подавить любой всплывающий запрос при регистрации элемента управления OLE.

Чтобы подавить всплывающие запросы, выполните regsvr32, за которым следует имя DLL (msxml3.dll) и переключатель /s для тихой регистрации элемента управления OLE. Единственным недостатком этой команды является подавление любых сообщений об ошибках.

Существует недокументированный переключатель, /e, который подавляет только сообщение об успешном выполнении в графическом интерфейсе, но отображает сообщение об ошибке — умно!

regsvr32 msxml3.dll /s
Registering a DLL silently

Регистрация OLE-контроллера и указание действия установки

При указании DLL для регистрации OLE вы вызываете только метод DllRegisterServer, но бывают случаи, когда вам нужно выполнить действие после регистрации. Для этого вы можете указать параметр /i.

Например, вы можете передать строку ввода (U) параметру /i, который вызовет метод DllInstall и метод DllRegisterServer одновременно.

Метод DllInstall позволяет утилите regsvr32.exe устанавливать DLL несколькими способами и вызывать различные действия для одной DLL.

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

Указание действия установки без вызова метода DllRegisterServer

Возможно, вам просто нужно установить OLE-контроллер без повторной регистрации его. Если это так, выполните следующую команду.

regsvr32 /n /i:U shell32.dll

Вышеупомянутая команда использует параметр /n, чтобы предотвратить вызов метода DllRegisterServer для DLL shell32.dll в методе установки DllInstall.

Only running an install command but not registering a DLL

Отмена регистрации OLE-контроллера с помощью regsvr32.exe

Если вы успешно зарегистрировали OLE-контроллер без ошибок, то это облегчает. Но может возникнуть ситуация, когда вам нужно удалить OLE-контроллер, когда он конфликтует с другими. К счастью, regsvr32.exe позволяет отменить регистрацию и удалить OLE-контроллер.

Чтобы отменить регистрацию и удалить элемент управления, выполните команду regsvr32.exe и передайте параметр /u, чтобы отменить регистрацию OLE-элемента управления. Вы можете видеть в результатах GUI ниже, что DLL-библиотека msxml3.dll была успешно удалена.

Чтобы выполнить действие вместе с отменой регистрации, передайте строку действия (U) параметру /i. Затем команда regsvr32 вызовет метод DllInstall с этим действием в качестве деинсталляции, например: regsvr32 /i:action /U msxml3.dll.

regsvr32 /U msxml3.dll
Unregistering a DLL

Обработка ошибок для regsvr32.exe

Вы успешно зарегистрировали OLE-элементы управления, но что делать, если при выполнении команды регистрации возникает ошибка? Существует несколько ошибок, которые могут появиться при управлении элементами управления. Эти сообщения могут быть иногда криптичными, но ниже разбиты, чтобы вы знали, что вызывает их появление.

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.

Расширение утилиты regsvr32.exe с помощью PowerShell

Поскольку regsvr32.exe предпочитает графический интерфейс, автоматизация может быть вызовом к вызову. Чтобы избежать этой сложности, вы можете обернуть утилиту regsvr32.exe в функцию PowerShell. Создав функцию PowerShell, вы сможете выполнять regsvr32.exe так, как если бы это была встроенная команда PowerShell.

Как пример, ознакомьтесь с функцией PowerShell Invoke-RegSvr32 ниже. Эта функция вызывает утилиту regsvr32 и использует PowerShell для захвата кода выхода и его соответствующей обработки. И, применяя проверку аргумента заранее, вы даже можете избежать ошибок вообще!

Чтобы экспериментировать с приведенной ниже функцией, откройте новую консоль PowerShell и скопируйте код в нее. Затем вы сможете вызвать функцию, как показано ниже.

Function Invoke-RegSvr32 {
	<#
	.SYNOPSIS
	Оберните утилиту Windows regsvr32.exe для регистрации OLE-контролов в функцию PowerShell для помощи в автоматизации.
	
	.PARAMETER FilePath
	Указывает имя DLL или контрола для передачи в regsvr32.exe, должен быть допустимым путем к файлу.
	
	.PARAMETER InstallString
	Укажите строковое значение, которое будет передано как значение pszCmdLine в функции DllInstall при регистрации контрола.
	
	.PARAMETER Unregister
	Отменить регистрацию ранее зарегистрированного контрола.
	
	.PARAMETER InstallOnly
	Не регистрируйте контрол, только запустите функцию DllInstall, для которой также необходимо передать InstallString.
	
	.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 {
    # Коды ошибок документированы в этой статье 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
    }
	}
}

Ниже вы найдете несколько примеров того, как использовать функцию Invoke-RegSvr32.

 # Попробуйте запустить только DllInstall против msxml3.dll с подробным выводом
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose -InstallOnly
 
 # Попытайтесь зарегистрировать msxml3.dll бесшумно с подробным выводом
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose
 
 # Попытайтесь зарегистрировать msxml3.dll бесшумно, но без вывода
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll"
Running Invoke-RegSvr32 PowerShell Command

Заключение

К настоящему моменту вы научились регистрировать и удалять DLL, а также обрабатывать ошибки. Хотя regsrv32.exe может не использоваться так часто в повседневных задачах, иногда вам все же может понадобиться зарегистрировать или удалить DLL.

Чтобы уйти еще дальше, вы можете расширить функционал PowerShell, чтобы учитывать еще больше проверок и крайних случаев. Вы даже можете создать функцию PowerShell для списка зарегистрированных элементов управления в реестре CLSID!

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