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
インストール先フォルダ(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) |
システムフォルダ
システムフォルダ(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の方を指していました。なんでだろう??