search
LoginSignup
2

More than 3 years have passed since last update.

posted at

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

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

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

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

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
What you can do with signing up
2