64bit版プログラム用のフォルダとインストーラー
64bit版Windowsでは、64bit版プログラムだけでなく32bit版プログラムも動作します。しかも、両者を1つの環境にインストールすることもできます。この仕組みのためにProgram Files
フォルダーが2つ用意されています。64bit版プログラム用にProgram Files
が、32bit版プログラム用にProgram Files (x86)
が使われます。とはいえ、OSがプログラムの格納場所に応じて「32bit版アプリしか動かない」とか「64bit版アプリしか動かない」といった制限をかけている訳ではないので、どこにアプリを置いても動作します。
しかし、インストーラーでファイルを配置する際には明確に使い分けられます。MSIのコンポーネントには32bit版と64bit版を区別する属性があり、32bit版コンポーネントでは64bit版WindowsのProgram Files
にファイルを置けませんし、64bit版コンポーネントではProgram Files (x86)
にファイルを置くことができません。例えば、下記の様にWiXで64bit版コンポーネントでProgram Files (x86)
にファイルを置くコードを書くと、エラーが出てビルドできません。
1:<Directory Id="TARGETDIR" Name="SourceDir">
2: <Directory Id="ProgramFilesFolder">
3: <Directory Id="INSTALLFOLDER" Name="SetupProject1">
4: <Component Id="prg" Guid="{466B1C91-5BFE-412A-9D9E-23A5745986CB}" Win64="yes">
5: <File Id="fCalc" Source="C:\Windows\System32\calc.exe" />
6: </Component>
7: </Directory>
8: </Directory>
9:</Directory>
このエラーをFixするには、ComponentエレメントのWin64=yes
を外すか、2行目のDirectoryエレメントのIdをId="ProgramFiles64Folder"
に変更する必要があります。
例えば、32bit版Windows上で下記のパスにファイルを置く32bit版のインストーラーがあったとしましょう。
C:\Program Files\VenderName\ProductName
このインストーラーを64bit版Windowsで動かすと、下記のパスにファイルが置かれます。
C:\Program Files (x86)\VenderName\ProductName
気を付けなければいけないのは、64bit版WindowsのProgram Files
にファイルを置くインストーラーは64bit版のMSIとして作成する必要があり、32bit版Windowsでは動作しない、ということです。また、32bit版のMSIは64bit版Windowsでも動作するが、Program Files
にはファイルを置けない(Program Files (x86)
には置ける)、ということです。
64bit版プログラム用のレジストリとインストーラー
64bit版のWindowsでは、レジストリも32bit版プログラム用の領域と64bit版プログラム用の領域に分かれています。32bit版プログラムでレジストリにアクセスすると32bit版プログラム用の領域にリダイレクトされ、64bit版プログラム用の領域にはアクセスできません。
例えば、32bit版Windows上で下記のキーにデータを置く32bit版のプログラムがあったとしましょう。
HKEY_LOCAL_MACHINE\SOFTWARE\VenderName\ProductName
このプログラムを64bit版Windowsで動かすと下記32bit版プログラム用のキーにリダイレクトされます。
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\VenderName\ProductName
同様に、下記のキー
HKEY_CURRENT_USER\Software\VenderName\ProductName
は
HKEY_CURRENT_USER\Software\Wow6432Node\VenderName\ProductName
にリダイレクトされます。
インストーラーで64bit版Windows上でレジストリにアクセスする際の挙動は、先に説明したフォルダにアクセスする際の挙動と同じです。
- 32bit版コンポーネントでは32bit版プログラム用のレジストリキーにしかアクセスできない。
- 64bit版コンポーネントでは64bit版プログラム用のレジストリキーにしかアクセスできない。
- 64bit版MSIで32bit版コンポーネントを使って32bit版プログラム用のレジストリ領域にアクセスすることはできるが、32bit版Windowsで動かすことはできない。
- 32bit版MSIは64bit版Windowsで動かすことはできるが、64bit版プログラム用のレジストリキーにアクセスすることはできない。
MSIを構成する上で注意すべきこと
64bit版MSIには32bit版コンポーネントも64bit版コンポーネントも混在することができますが、32bit版MSIには64bit版コンポーネントを入れることができません。これは、32bit版Windowsで動作するプログラムも配布する場合、32bit版プログラムと64bit版プログラムを一つのMSIにまとめることができないことを意味します。このような要求がある場合は、32bit版のインストーラーと64bit版のインストーラーの2つを配布するか、どちらのOS上で起動したか判断し、環境に合ったインストーラーを起動するセットアップランチャーを用意することになります。