LoginSignup
5
5

More than 1 year has passed since last update.

Windows Installer手引書 Part.3 Directory

Last updated at Posted at 2018-08-18

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

Directory

Directoryエレメントの使い方

Windows InstallerでDirectoryを定義する際には、必ずルートをTARGETDIRというIdで作成します。引き続きPart.2で例示したフォルダ構造を使います。
Part3Fig01.png
この構造をWiXのソースで表現すると、例えば次のように書くことができます。

 1: <Directory Id="TARGETDIR" Name="SourceDir">
 2:   <Directory Id="ProgramFilesFolder">
 3:     <Directory Id="PRODUCT1FOLDER" Name="Product1">
 4:       <Directory Id="DataFolder" Name="Data" />
 5:     </Directory>
 6:   </Directory>
 7: </Directory>

1行目はどのインストーラーにも存在する決まり文句です。Directoryエレメントが構成する階層構造のルートのIdは必ずTARGETDIRプロパティ1です。SourceDir1はインストールを実行したときに、インストール物のファイルをどのフォルダからコピーしてくるか指定するプロパティです。インストール実行時にカスタムアクションで内容を変更することも可能ですが、".cab"ファイルの置き場所もMediaエレメントで制御できるので、利用する機会はないでしょう。

2行目はシステムで定義済みのProgramFilesFolderプロパティを指定します。システムで定義済みのプロパティは、System Folder Propertiesに一覧があります。この一覧を見れば分かるように、Windows Installerでは使えるフォルダが少なく困ることもあります2。そのようなときは、WiXがシステムからパスを取得する仕組みを用意しているので、これを使います。例えば、共有ドキュメントへのパスが欲しいときは次のようにします。
Visual Studioのプロジェクトの下のReferencesの下にWixUtilExtension.dll3を追加。
Part3Fig02.png
そして、WiXのソースに下記の行を追加。

<PropertyRef Id="WIX_DIR_COMMON_DOCUMENTS" />

これだけで、共有ドキュメントへのパスが格納されたWIX_DIR_COMMON_DOCUMENTSプロパティが利用可能になります。Directoryエレメントで利用する際には、Idにこのプロパティを指定します。他のパスも必要であれば、PropertyRefエレメントを追加していきます。利用可能なプロパティはこちらを参照してください。

3行目のIdは全て大文字で名付けてあります。こうするとId部分がPublic Propertyとして扱われ、msiexecのコマンドラインにパスを指定できるようになります。この仕組みを利用することで、フォルダのパスを".msi"の外部から与えることが可能になります。例えば下記の様にインストールを開始します。

msiexec PRODUCT1FOLDER=C:¥TESTDIR /i Part3_01.msi

そうすると、下図のようにインストールされます。
Part3Fig01.png
Directoryエレメントの階層構造を構成する上で基本的な考え方は次のようになります。

  • 階層のルートはIdがTARGETDIRの決まり文句を配置
  • その子階層にシステムが定義するプロパティをIdにしてDirectoryエレメントを配置
  • その子階層にインストールする製品が必要としている名前でDirectoryエレメントを配置

32bit版Windowsと64bit版Windowsで利用可能なDirectory

Windows Installerを利用したインストーラーでは、32bit版Windowsと64bit版Windowsの両方で利用可能な32bit版インストーラーと、64bit版Windowsだけで利用可能な64bit版インストーラーが存在します。32bit版インストーラーを64bit版Windowsで利用すると、64bit用のフォルダや64bit用のレジストリにアクセスできません。そのため、システムが定義するプロパティのうち64bit版が存在するものには注意が必要です。以下にProgramFilesFolderとProgramFiles64Folderの例を示します。

  • ProgramFilesFolderプロパティが指し示すパス
32bit版Windows 64bit版Windows
32bit版インストーラー C:¥Program Files C:¥Program Files (x86)
64bit版インストーラー インストーラー
起動不可
C:¥Program Files (x86)
  • ProgramFiles64Folderプロパティが指し示すパス
32bit版Windows 64bit版Windows
32bit版インストーラー プロパティ
利用不可4
プロパティ
利用不可4
64bit版インストーラー インストーラー
起動不可
C:¥Program Files

Windows Installerにはこのような制約があるため、32bit版インストーラーと64bit版インストーラーの両方を作成することもあります。さらに製品として配布するために、OSが32bit版か64bit版か判別して適切なインストーラーを起動する、セットアップランチャーを開発することもあります。

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

  1. システムが定義済みなので、自分で定義する必要はありません。 2

  2. 私は共有ドキュメントのパスが取得できなくて困りました。このときはよく調べもせず、C言語でカスタムアクションを書いて解決しました。

  3. C:\Program Files (x86)\WiX Toolset v3.11\binにあります。

  4. 64bit指定しないComponentでDirectoryとして利用するとエラーでコンパイルできない。そして、Componentを64bit指定すると、インストーラー全体を64bit版に指定しないとコンパイルできない。結局32bit版インストーラーでは利用できないのです。 2

5
5
2

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
5
5