LoginSignup
3
2

More than 5 years have passed since last update.

Windows Installer手引書 Part.6 64bit版Windowsにおけるフォルダとレジストリ

Posted at

前の記事へ  目次へ  次の記事へ

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上で起動したか判断し、環境に合ったインストーラーを起動するセットアップランチャーを用意することになります。

前の記事へ  目次へ  次の記事へ

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2