regsvr32.exeユーティリティの使用方法と理由[例]

時々、Windowsユーザーである場合、おそらくregsvr32.exeユーティリティを実行してDLLを「登録」する必要があったことがあるかもしれません。その場合、おそらく裏側で何が起こっているかを正確に把握していなかったかもしれません。この難解なユーティリティは、多くのWindowsアプリケーションで使用されるObject Linking and Embedding(OLE)コントロールを管理するために使用されます。

しかし、OLEコントロールとは具体的には何であり、なぜOLEコントロールを登録したいのでしょうか?このチュートリアルでは、regsvr32.exeユーティリティを使用してOLEコントロールをインストール、アンインストール、登録、または登録解除するためのさまざまな方法を学びます。

前提条件

regsvr32.exeユーティリティを実行するには、以下の要件を満たしていることを確認してください:

  • regsvr32.exeユーティリティはほとんどのWindowsバージョンに組み込まれているため、管理者アカウントを持つWindowsコンピューターが必要です。
  • このチュートリアルに含まれるPowerShellスクリプトを利用するには、PowerShell 7が必要です。

OLEコントロールとは何ですか?

regsvr32.exeユーティリティの使用方法を学ぶ前に、このツールが管理するOLEコントロールについて基本的な理解を持っている必要があります。

OLEコントロールは、文書や他のオブジェクトへの埋め込みやリンクを容易にするために開発されたWindows固有の技術です。この技術は年月を経て進化し、さまざまなコンポーネントがOLE技術をベースに構築されました。

おそらく、Component Object Model (COM)Distributed Component Object Model (DCOM)、またはActiveXコントロールについて聞いたことがあるかもしれません。これらの技術のそれぞれは、多言語で書かれた機能に対する標準インターフェースを定義するOLE技術をベースに構築されています。

ActiveXは非推奨ですが、Windows 10のInternet Explorerを介してまだ利用可能ですが、Microsoft Edgeでは利用できません。

OLEコントロールの登録

regsvr32.exeユーティリティの動作が理解できたので、OLEコントロールを登録する準備が整いました。登録するためのいくつかのコマンドバリアントがありますので、以下から1つのコマンドバリアントを選択するか、それぞれのコマンドを試してみてください。

PowerShellまたはWindowsコマンドプロンプトを介してOLEコントロールを登録することができます。どちらの方法でも、コントロールが適切に登録されるように、コマンドラインを管理者として実行していることを確認してください。

GUI結果の表示

DLL を regsvr32 で登録する場合、最も単純な使用例では、ツールに DLL のパスを渡す必要があります。デフォルトでは、regsvr32 は成功(または失敗)を示すポップアップを表示します。DLL を登録するには、以下に示すように DLL の名前または完全なパスを指定します。

以下のコマンドを実行すると、x64 インスタンスの場合はターゲットの OLE コントロールのための HKEY_CLASSES_ROOT\CLSID キー、または x86 インスタンスの場合は HKEY_CLASSES_ROOT\WOW6432Node\CLSID に必要なレジストリクラスが作成されます。

regsvr32 msxml3.dll

成功すると、DllRegisterServer が成功したことを示す GUI 結果が表示されます。

Registering a DLL

OLE コントロールを登録する場合、regsvr32.exe はシステムの検索パスを適用します。そのため、そのパスの外の特定のファイルを登録する必要がある場合は、ファイルへの絶対パスを指定するのが最適です。

OLE コントロールをサイレントに登録する

コマンドを実行する際、GUI プロンプトが表示されるのは常に望ましくない場合があります。OLE コントロールを登録する際に GUI プロンプトを抑制する方法について説明します。

GUI プロンプトを抑制するには、regsvr32 を実行し、DLL 名(msxml3.dll)の後に OLE コントロールをサイレントに登録するための /s スイッチを指定します。このコマンドの唯一の欠点は、エラーメッセージも抑制されることです。

未公開のスイッチ、/e が存在し、GUI 成功メッセージのみを抑制し、GUI エラーメッセージを表示します。賢いですね!

regsvr32 msxml3.dll /s
Registering a DLL silently

OLEコントロールの登録とインストールアクションの指定

OLE登録のためにDLLを指定するとき、単にDllRegisterServerメソッドを呼び出していますが、登録後にアクションを実行する必要がある場合もあります。そのためには、/iパラメータを指定できます。

たとえば、入力文字列(U)を/iパラメータに渡すことで、DllInstallメソッドとDllRegisterServerメソッドが同時に呼び出されます。

DllInstallメソッドを使用すると、regsvr32.exeユーティリティがDLLを複数の方法でインストールし、1つのDLLに対して複数のアクションが呼び出されます。

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

DllRegisterServerメソッドを呼び出さずにインストールアクションを指定する

たとえば、OLEコントロールを再登録せずにインストールしたい場合は、次のコマンドを実行します。

regsvr32 /n /i:U shell32.dll

上記のコマンドは、shell32.dll DLLに対してDllRegisterServerメソッドを呼び出さないように/nパラメータを使用して、インストールメソッドDllInstallを実行します。

Only running an install command but not registering a DLL

regsvr32.exeを使用してOLEコントロールを登録解除する

OLEコントロールの登録にエラーがなく完了した場合は、安心です。しかし、他のコントロールと競合している場合は、OLEコントロールをアンインストールする必要がある場合があります。幸いにも、regsvr32.exeはOLEコントロールの登録解除とアンインストールの機能を提供しています。

登録解除およびコントロールのアンインストールを行うには、regsvr32.exe を実行し、/u パラメータを渡してOLEコントロールを登録解除します。以下のGUIの結果で、msxml3.dll 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 はGUI出力を好むため、自動化は難しい場合があります。この課題を解消するには、regsvr32.exe ユーティリティをPowerShell関数でラップすることができます。PowerShell関数を作成することで、regsvr32.exe をネイティブなPowerShellコマンドレットとして実行できます。

例として、以下はInvoke-RegSvr32 PowerShell関数です。この関数はregsvr32ユーティリティを呼び出し、PowerShellを使用して終了コードを取得し、それに応じて処理します。事前に引数の検証を適用することで、エラーを完全に回避することさえできます!

以下の関数を試すには、新しいPowerShellコンソールを開き、コードをコピーして貼り付けてください。それから、以下に示すように関数を呼び出すことができます。

Function Invoke-RegSvr32 {
	<#
	.SYNOPSIS
	regsvr32.exe WindowsユーティリティをOLEコントロールを登録するためのPowerShell関数でラップして自動化を支援します。
	
	.PARAMETER FilePath
	regsvr32.exeに渡すDLLまたはコントロールの名前を指定します。有効なファイルパスである必要があります。
	
	.PARAMETER InstallString
	コントロールを登録するときにDllInstall関数に渡されるpszCmdLine値を指定します。
	
	.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 関数の使用例のいくつかです。

 # msxml3.dll に対して DllInstall のみを実行し、詳細な出力を試みる
 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 をさらに多くのチェックやエッジケースに対応させることができます。 CLSID レジストリの場所に登録されたコントロールをリストするための PowerShell 関数さえ作成できます!

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