◆はじめに◆

Windowsアプリケーションを作成したので、せっかくなのでインストーラも作成してみようと思いました。
市販のものは高価でとても買うことはできないし、フリーのものでも使ってみるかと思って、
検索したところWiXをたまたま見つけてたので使ってみることにしました。

WiXの使い方については、以下のサイトを参考にさせてもらいました。
CodeZine・・・連載記事がありました。
wiki・・・WiX@wikiに解説がありました。
日本語のサイトがあまりないようなので、これらのサイトはとても参考になりました。
こらから使う方は、一度読んでみるとよいと思います。

◆準備◆

インストーラの作成に必要となるツールをダウンロードする必要があります。
(ダウンロードする公式サイトから行いました。)
今回は、「wix-2.0.5805.0-binaries」のバージョンを使用しました。
zipファイルをダウンロードして、好きな場所に解凍するだけでした。
※バージョン3.0というのもあるみたいですが、まだ安定版(stable)がなかったようなのでバージョン2.0を使いました。
今(2009/12/13確認)は、バージョン3.0の安定版(stable)もあるようです。

インストーラの作成は、ファイルにインストーラの動作を記述し、
コマンド(コマンドプロンプト)でコンパイルするので、パスの設定が必要になると思います。
コマンドプロンプトを起動し、WiXを解凍したフォルダのパスを設定してください。
例)「D:\」にWiXを置いた場合
コマンドプロンプトで以下のコマンドを実行してください。
set path=%PATH%;d:\wix-2.0.5805.0-binaries
※この方法でのパスの設定は一時的なものになります。コマンドプロンプトを閉じて、再度起動した場合には無効となります。

◆作成内容◆

以下のようなインストーラを作成しました。
・インストール先をユーザが選択できる。
・インストール後のフォルダ構成は下記のようになる。
・アンインストールすると(Assistant以下の)全てのフォルダが削除される。

        
            Assistant(フォルダ)
                ├ Assistant.exe(実行ファイル)
                ├ Readme.txt(テキストファイル)
                ├ AsaWeeklyReport(フォルダ)
                └ AssistantData(フォルダ)
                    ├ AsaDaily(フォルダ)
                    └ AsaSchedule(フォルダ)
        
    

※「Assistant」、「AsaWeeklyReport」、「AsaDaily」、「AssistantData」、「AsaSchedule」
はインストール時にフォルダを新規に作成します。

◆インストーラの作成◆

インストーラは拡張子「wxs」というファイルにXMLを使用して作成するそうで、
そのファイルをコンパイル、リンクして「MSI(Microsoft Windows Installer)」を作成することになります。
コンパイル、リンクのコマンドは
コンパイル:candle *.wxs
リンク:light *.wixobj -out *.msi wixui.wixlib -loc WixUI_en-us.wxl
※「*.wixobj」はコンパイルされることにより、「*.wxs」ファイルから生成されるファイルです。

実際には、「Assistant.wxs」ファイルから「Assistant.msi」を作成したので、コマンドは、
コンパイル:candle Assistant.wxs
リンク:light Assistant.wixobj -out .\wix-2.0.5805.0-binaries\Assistant.msi .\wix-2.0.5805.0-binaries\wixui.wixlib -loc WixUI_en-us.wxl
となります。

◆作成したXMLファイルについて◆

作成した「Assistant.wxs」の内容です。
実際に動作させて、どうのように動くのか探りながら行ったので、
正しいのかは残念ながら不明です。

    
        <?xml version="1.0" encoding="UTF-8"?>

        <Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">

	        <Product Id="????????-????-????-????-????????????"
		        Name="Assistant"
		        Version="1.0.0"
		        Manufacturer="Sagami Design Corporation"
		        Language="1041"
		        Codepage="932">

		        <!-- Installer Property -->
		        <Package Id="????????-????-????-????-????????????"
			        Description="Assistant Instraller"
			        Comments="Assistant Instraller"
			        Compressed="yes"
			        Manufacturer="Sagami Design Corporation"
			        Keywords="Installer,MSI,Database"
			        Languages="1041"
			        SummaryCodepage="932"/>

		        <Media Id="1" Cabinet="disk1.cab" EmbedCab="yes"/>

		        <Directory Id="TARGETDIR" Name="Source">
			        <Directory Id="DIR1" Name="dir1" LongName="Assistant">
				        <Component Id="COMPONENT1" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a1" DiskId="1">
					        <CreateFolder/>
					        <File Id="EXEFILE" Name="Assistan.exe" LongName="Assistant.exe"/>
					        <File Id="README" Name="Readme.txt"/>
					        <RemoveFile Id="EXEFILE" On="uninstall"/>
					        <RemoveFile Id="README" On="uninstall"/>
					        <RemoveFolder Id="DIR1" On="uninstall"/>
				        </Component>
				        <Directory Id="DIR2" Name="dir2" LongName="AsaWeeklyReport">
					        <Component Id="COMPONENT2" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a2" DiskId="1">
						        <CreateFolder/>
						        <RemoveFolder Id="DIR2" On="uninstall"/>
					        </Component>
				        </Directory>
				        <Directory Id="DIR3" Name="dir3" LongName="AssistantData">
					        <Component Id="COMPONENT3" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a3" DiskId="1">
						        <CreateFolder/>
						        <RemoveFolder Id="DIR3" On="uninstall"/>
					        </Component>
					        <Directory Id="DIR4" Name="dir4" LongName="AsaDaily">
						        <Component Id="COMPONENT4" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a4" DiskId="1">
							        <CreateFolder/>
							        <RemoveFolder Id="DIR4" On="uninstall"/>
						        </Component>
					        </Directory>
					        <Directory Id="DIR5" Name="dir5" LongName="AsaSchedule">
						        <Component Id="COMPONENT5" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a5" DiskId="1">
							        <CreateFolder/>
							        <RemoveFolder Id="DIR5" On="uninstall"/>
						        </Component>
					        </Directory>
				        </Directory>
			        </Directory>
		        </Directory>

		        <Feature Id="MAINFEATURE" Level="1">
			        <ComponentRef Id="COMPONENT1"/>
			        <ComponentRef Id="COMPONENT2"/>
			        <ComponentRef Id="COMPONENT3"/>
			        <ComponentRef Id="COMPONENT4"/>
			        <ComponentRef Id="COMPONENT5"/>
		        </Feature>

		        <!-- Select UI -->
		        <UIRef Id="WixUI_ErrorProgressText"/>
		        <UIRef Id="WixUI_InstallDir"/>
		        <Property Id="WIXUI_INSTALLDIR" Value="TARGETDIR"/>

	        </Product>

        </Wix>
    

◆困った点◆

実際に使ってみて、どうやってやるのか困った点です。

〓〓〓 インストール先を選択するために 〓〓〓
インストール先を選択するときに、デフォルトのパスを指定する必要があるようでした。
指定は、
Property Id="WIXUI_INSTALLDIR" Value="TARGETDIR"
で行います。
「Value="TARGETDIR"」がデフォルトのパスになるようです。
「TARGETDIR」とするとデフォルトのパスは「c:\」となりました。
「Value」には「C:\」のようにパスを指定することはできませんでした。
ここの指定が正しくできていないとインストール時に下記のようなエラーが出ました。
The installer has encountered an unexpected error installing this package.
This may indicate a problem with the package.
The error code is 2343.

〓〓〓 ファイル名について 〓〓〓
ファイル名はWindowsの制約により「8.3形式」となっているそうです。
そのため、ファイル名は「8文字」、拡張子は「3文字」で指定することになります。
Fileタグでファイル名を指定する場合には、
Nameにはショートファイル名(8.3形式)のみしか設定できませんでした。
長いファイル名を指定する場合には、「LongName」を使用する必要がありました。

〓〓〓 Componentタグを複数使用している場合 〓〓〓
「Component」タグを使用したら、「Feature」タブに追加する必要がありました。
追加しないとコンパイルエラーとなりました。

〓〓〓 アンインストール時の問題 〓〓〓
「Component」タグを複数使用している場合には「Guid」が一緒だとアンインストールが正常に行えませんでした。
エクスプローラで見ているとフォルダが存在しているが、クリックするとフォルダが存在しないとエラーがでます。
コピー&ペーストで作成していたので、この問題にひっかかってしまいました。
・コントロールパネルから確認すると削除されていますが、フォルダは残ったままになっていました。