NSISでx64対応のインストーラを作成する

NSIS(Nullsoft Scriptable Install System)は、オープンソースのインストーラ作成環境で、独自のスクリプト言語で作成したスクリプトをコンパイルしてWindows用インストーラを作成することができます。Tomcatなどオープンソースソフトウェアのインストーラでもよく使用されています。スクリプトは柔軟に記述可能でプラグインも充実しており、だいたいのことはできます。このエントリーはNSISでx64プラットフォーム対応のインストーラを作成する場合のメモです。

x64環境の判定

インストーラがx64環境で動作しているかの判定は、x64.nshというスクリプトをインクルードして、以下のようなスクリプトを記述します。

# x64判定用マクロ
!include x64.nsh 
# Ifマクロ
!include LogicLib.ns 

${If} ${RunningX64}
  MessageBox MB_OK "running on x64"
${Else}
  MessageBox MB_OK "running on x86"
${EndIf}

レジストリへのアクセス

インストーラから、レジストリを読み書きすることが多いと思います。x86のアプリケーションからレジストリにアクセスすると、Wow6432Nodeという特別なレジストリの配下にリダイレクトされます(こちらを参照)。プログラムから見ると透過的な処理ですが、例えばx64用のJDKのインストール先を取得する場合に、x64用のキーを参照する必要があるのにリダイレクトされたキーを参照してしまうと正常に値を取得できません。
NSISでは、リダイレクトされないx64用のキーを参照する場合にはスクリプト中で以下の設定を行います。

SetRegView 64

Scripting Reference

インストール先フォルダ(Program Files)

インストール先に"Program Files"を使用する場合には、環境に合わせて$PROGRAMFILES, $PROGRAMFILES32, $PROGRAMFILES64 の三種類のシステム定数のいずれかを利用します。それぞれ以下のような値になります。x86,x64両対応のインストーラであれば、$PROGRAMFILES64になりますかね。x64でWOW64を使用して32bitアプリケーションをインストールするのであれば$PROGRAMFILES。

constants x86 x64
$PROGRAMFILES Program Files Program Files (x86)
$PROGRAMFILES64 Program Files Program Files
$PROGRAMFILES32 Program Files Program Files (x86)

Scripting Reference

システムフォルダ

システムフォルダ(C:\Windows\System32)についてもWOW64のリダイレクトの対象になります。32bitプログラムからシステムフォルダにアクセスする場合には、通常C:\Windows\SysWOW64にリダイレクトされます。DLLをコピーする場合に考慮する必要があります。NSISでは、$SYSDIRという定数でシステムフォルダにアクセスできます。先ほど紹介したx64.nshではリダイレクトを無効にすることができます。

   ${DisableX64FSRedirection}
   MessageBox MB_OK $SYSDIR # C:\Windows\System32
   ${EnableX64FSRedirection}
   MessageBox MB_OK $SYSDIR # C:\Windows\SysWOW64

と、なるはずなのですが、、私がx64のPCで試した限りはいずれもSystem32の方を指していました。なんでだろう??