WiX でレジストリ読み書き

WiX 記事一覧


単に読み書きするだけなら簡単。
どこに書くか、x64 と x86 をまたがるときのどうするか、を考え始めると途端に難しい(まだすっかりわかってはいない)。


ちなみに、特に断りのないリンク先は全部英語。

レジストリに書き込み

<Component Id="RegistryEntries" Guid="PUT-GUID-HERE" Directory="TARGETDIR">
    <RegistryKey Root="HKLM"
                 Key="Software\[Manufacturer]\[ProductName]"
                 Action="createAndRemoveOnUninstall">
        <RegistryValue Type="string" Name="REGISTORY_NAME" Value="[SOME_PROPERTY]"/>
    </RegistryKey>
</Component>
  • RegistryKey@Root には "HKLM" = HKEY_LOCAL_MACHINE を指定
  • RegistryKey@Key は "Software\[Manufacturer を指す文字列]"
  • RegistryKey@Action は createAndRemoveOnUninstall(アンインストール時に消す)、create(アンインストール時に消さない) などを指定
  • もちろん Feature にて ComponentRef を指定するのを忘れずに。

レジストリから読み込み

<Property Id="NETFRAMEWORK20">
    <RegistrySearch Id="NetFramework20"
                    Root="HKLM"
                    Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727"
                    Name="Install"
                    Type="raw" />
</Property>
  • "ほにゃららSearch" で検索条件を指定して、Property に値を設定、というのはレジストリに限らず WiX(msi) の基本。

インストーラが書いていいレジストリ

問題を未然に防止するためにも、Microsoft の推奨する範囲でお行儀良くするのが望ましい。
この手の情報が一箇所にまとまっていれば良いのだけれど。

  • 実行時に HKLM (HKEY_LOCAL_MACHINE) への書き込みは行わないようにしてください。
  • インストール時に、アプリケーションで HKCU と HKLM に合計 128K を超えるデータを保存してはいけません。

S2.8 アプリケーションはレジストリを適切に使用すること

・インストール時に HKCU への書き込みは行わないようにしてください。アプリケーションは、インストールする人が特定のユーザーであると想定してはなりません。アプリケーションは、実行時ではなくインストール時に、ユーザーごとの情報を HKCU または %windows% ディレクトリに書き込んではなりません。この書き込みが行われると、HKCU からのエントリが使用できなくなったり、アプリケーションをインストールしたユーザーと異なるユーザーに対して更新が行われなくなります。


つまり、

  • (通常の Per Machine Installations な)アプリケーションのインストール時に、アプリ(ないしベンダー)固有の情報を書き込んで良いのは HKLM のみ。
  • ユーザ固有の情報は HKCU に書き込む(HKLM には書けない)が、アプリケーションの実行時に行うべきであり、インストール時はアウト。*1

x86(32bit) と x64 の違い

(まだいろいろ調べ中)


64bit Windows (x64) には WOW64 (Windows on Windows 64) という、64ビット環境で 32ビット(x86)アプリケーションを動かすための仕組みがある。
"Program Files (x86)" とかもその一つ。


レジストリについては、32ビットアプリケーションが HKLM\Software へアクセスした場合、WOW64 によって HKLM\Software\Wow6432Node にリダイレクトされる。
64ビットアプリケーションが HKLM\Software に書き込んだ内容は、(通常の操作の範囲では) x86 アプリからは見えない。


WiX で制御するには下記のように記述する(未検証)。

レジストリ書き込み
Component@Win64 に "yes" を指定すると x64 として振る舞う(リダイレクト無し)。デフォルトは "no" (x86 扱い、リダイレクト有り)
レジストリ読み込み
RegistrySearch@Win64 に "yes" を指定すると x64 として振る舞う(リダイレクト無し)。デフォルトは "no" (x86 扱い、リダイレクト有り)

たとえ msiexec が x64 で動いていても、インストールするアプリが x64 であっても、x86 のふりをするのがデフォルトであることに注意。


x64 の場合にリダイレクトされる全てのレジストリパスについては "Registry Keys Affected by WOW64" にまとめられている*2が、通常は HKLM\SOFTWARE についてのみ意識しておけば十分だろう。



WiX 記事一覧

*1:でも WiX の How to は HKCU に書き込むサンプルを……

*2:Windows 7 および Windows Server 2008 R2 以降では x86 と x64 の統合が進んでいることがわかっておもしろい