目次
サンプル定義ファイル
WiX の導入
公式サイトから WiX Toolset build tools をダウンロード、インストールする。

使うツールは "candle.exe" と "light.exe" の2つで、コマンドラインからの起動になるため、"C:\Program Files (x86)\WiX Toolset v3.11\bin" にPATHを通しておく。
使うツールは "candle.exe" と "light.exe" の2つで、コマンドラインからの起動になるため、"C:\Program Files (x86)\WiX Toolset v3.11\bin" にPATHを通しておく。
WixEdit
インストーラー作成用XMLファイル
ここでは、エディタを使って WiX に読み込ませるインストーラー作成用XMLファイルを作ってゆく。
拡張子は .wxs で保存する。
拡張子は .wxs で保存する。
解説:変数定義
cpp-01.wxs
<!-- 変数定義 -->
<?define GUID_Product = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ?>
<?define GUID_MenuAppComponent = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ?>
<?define GUID_ApplicationComponent = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ?>
<?define GUID_EtcComponent = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ?>
<?define GUID_Upgrade = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ?>
<?define GUID_MenuPahooComponent = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ?>
<?define ProductName = "googlenewswin" ?>
<?define ProductNameJP = "Googleニュース検索" ?>
<?define ProductVersion = "1.1" ?>
<?define MinumumVersion = "1.0" ?>
<?define ProductComment = "インターネット経由でGoogleニュース検索を行い,検索結果を一覧表示・ファイル保存する.記事タイトルをクリックすると,ブラウザを使って当該ニュースを表示する." ?>
<?define SourceFolder = "C:\SampleProgrram\cpp\googlenewswin\" ?>
XML内で何カ所か同じ文字列を記述することがあるので、これらを変数として用意しておく。
<?define 変数名 ="変数の内容" ?>
| GUID_Product | プロダクトのGUID |
| GUID_MenuAppComponent | アプリケーションメニューのGUID |
| GUID_ApplicationComponent | アプリケーションコンポーネントのGUID |
| GUID_EtcComponent | etcコンポーネントのGUID |
| GUID_Upgrade | アップグレードGUID |
| GUID_MenuPahooComponent | pahooメニューコンポーネントのGUID |
| ProductName | プロダクト名称(英数字) |
| ProductNameJP | プロダクト名称(日本語) |
| ProductVersion | プロダクト・バージョン(小数) |
| MinumumVersion | アップデート可能なの最小(最古)バージョン |
| ProductComment | プロダクトに関する説明。 |
Windowsインストーラーはコンポーネントごとに GUID を要求する。GUIDは、前述の WixEdit を使って生成できる。また、「C++でGUID生成」から生成ツールをダウンロードできる。

インストールやアップデートは GUID_Upgrade を参照するので、同一プロダクトにつき、この GUID は同一にすること。
これから作るプログラムは、デフォルトでスタートメニューに pahoo.org フォルダを作成し、その配下にショートカットを配置していく。そこで、GUID_MenuPahooComponent の GUID も同一にすること。
これ以外のGUIDについては、アップデートの度にあらたに生成すること。

XML中で変数を参照するときは $(var.GUID_Product) のように記述する。
インストールやアップデートは GUID_Upgrade を参照するので、同一プロダクトにつき、この GUID は同一にすること。
これから作るプログラムは、デフォルトでスタートメニューに pahoo.org フォルダを作成し、その配下にショートカットを配置していく。そこで、GUID_MenuPahooComponent の GUID も同一にすること。
これ以外のGUIDについては、アップデートの度にあらたに生成すること。
XML中で変数を参照するときは $(var.GUID_Product) のように記述する。
解説:Productエレメント
cpp-01.wxs
<!-- WiX開始 -->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="$(var.GUID_Product)" Name="$(var.ProductNameJP)" Language="1041" Version="$(var.ProductVersion)" Manufacturer="www.pahoo.org" UpgradeCode="$(var.GUID_Upgrade)" Codepage="932">
Product エレメントはC++のmain()関数に似ており、このエレメントに対して.msiファイルが生成される。
| Id | プロダクトコードGUID |
| Name | プロダクトの説明的な名前 |
| Language | 言語ID:日本語は1041 |
| Version | バージョン番号 |
| Manufacturer | プロダクトのメーカー |
| UpgradeCode | プロダクトのためのアップグレードコードGUID(同一プロダクトでは常に同一) |
| Codepage | MSIファイルのコードページ:日本語は932 |
解説:Packageエレメント
cpp-01.wxs
<!-- パッケージ -->
<Package Description="$(var.ProductNameJP)" Comments="$(var.ProductNameJP)" InstallerVersion="500" Compressed="yes" SummaryCodepage="932" Platform="x64" InstallScope="perMachine" InstallPrivileges="elevated" />
<Media Id="1" Cabinet="simple.cab" EmbedCab="yes" />
Package エレメントは、サマリーインフォメーションストリームに置かれるパッケージについてのプロパティである。
| Description | プロダクトフルネームまたは説明。 |
| Comments | ブラウズのためのオプションのコメント。 |
| InstallerVersion | このパッケージをインストールするために必要な Windows Installer の最小のバージョン。200は Windows インストーラー 2.0 を表す。 |
| Compressed | ソース中に圧縮ファイルを持つには 'yes' に設定。 |
| SummaryCodepage | サマリーインフォメーション文字列だけのためのコードページ整数値またはウェブ名。 |
| Platform | x64 はパッケージが x64 パッケージであることを表す。 |
| InstallScope | perMachine はパッケージがマシンごとのインストールであり、インストールするために昇格された特権を必要とすると宣言する。 |
解説:Upgradeエレメント
cpp-01.wxs
<!-- アップグレード -->
<Upgrade Id='$(var.GUID_Upgrade)'>
<UpgradeVersion OnlyDetect='yes' Property='SELFFOUND' Minimum='$(var.MinumumVersion)' IncludeMinimum='yes' Maximum='$(var.ProductVersion)' IncludeMaximum='yes' />
</Upgrade>
Upgrade エレメントは、特定の UpgradeCode のためのアップグレード情報を示す。
解説:Directoryエレメント
cpp-01.wxs
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="DesktopFolder" SourceName="Desktop" />
<!-- スタートメニュー -->
<Directory Id="ProgramMenuFolder">
<Directory Id="MenuPahoo" Name="pahoo.org">
<Component Id="MenuPahooComponent" Guid="$(var.GUID_MenuPahooComponent)" Permanent="yes" Win64="yes">
<CreateFolder Directory="MenuPahoo" />
</Component>
<Directory Id="MenuApplication" Name="$(var.ProductName)">
<Component Id="MenuApplicationComponent" Guid="$(var.GUID_MenuAppComponent)" Win64="yes">
<CreateFolder Directory="MenuApplication" />
<RemoveFolder Id="MenuApplication" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\pahoo.org\$(var.ProductName)\Menu" Name="Installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</Directory>
</Directory>
</Directory>
<!-- プログラム配置 -->
Directory エレメントは、プロダクトのためのディレクトリーレイアウトや、ソースとターゲットディレクトリーの間のマッピングを指定する。

ここでは、スタートメニューのディレクトリーレイアウトを定義している。
ProgramMenuFolder は、スタートメニューの実ディレクトリを指す定数である。
ここでは、スタートメニューのディレクトリーレイアウトを定義している。
ProgramMenuFolder は、スタートメニューの実ディレクトリを指す定数である。
解説:プログラム配置
cpp-01.wxs
<!-- プログラム配置 -->
<Directory Id="ProgramFiles64Folder" Name="PFiles">
<Directory Id="PAHOO_ORG" Name="pahoo.org">
<Directory Id="ApplicationFolder" Name="$(var.ProductName)">
<Component Id="ApplicationComponent" Guid="$(var.GUID_ApplicationComponent)" Win64="yes">
<RemoveFolder Id="ApplicationFolderRemove" On="uninstall" />
<File Id="APPLICATION_EXE" Name="$(var.ProductName).exe" Source="$(var.SourceFolder)Release\$(var.ProductName).exe" />
<File Id="INSTALLER_MSI" Name="$(var.ProductName).msi" Source="$(var.SourceFolder)$(var.ProductName).msi" />
<!-- DLL -->
<File Id="LIBCRYPTO_1_1_X64.DLL" Name="libcrypto-1_1-x64.dll" Source="$(var.SourceFolder)Release\libcrypto-1_1-x64.dll" />
<File Id="LIBSSL_1_1_X64.DLL" Name="libssl-1_1-x64.dll" Source="$(var.SourceFolder)Release\libssl-1_1-x64.dll" />
<File Id="LIBCURL_X64.DLL" Name="libcurl-x64.dll" Source="$(var.SourceFolder)Release\libcurl-x64.dll" />
実際にプログラムを配置するディレクトリレイアウトを定義している。
解説:Shortcutエレメント
cpp-01.wxs
<!-- スタート・メニュー -->
<Shortcut Id="startMenuShotcut" Name="$(var.ProductNameJP)" Description="$(var.ProductComment)" WorkingDirectory="ApplicationFolder" Icon="application.ico" Directory="MenuApplication" Target="[ApplicationFolder]$(var.ProductName).exe" />
<!-- デスクトップ・ショートカット -->
<Shortcut Id="DesktopShortcut" Name="$(var.ProductNameJP)" Description="$(var.ProductComment)" WorkingDirectory="ApplicationFolder" Icon="application.ico" Directory="DesktopFolder" Target="[ApplicationFolder]$(var.ProductName).exe" />
<!-- アンインストーラ -->
<Shortcut Id="UninstallProduct" Name="$(var.ProductNameJP)アンインストール" Description="$(var.ProductNameJP)をアンインストールする." Directory="MenuApplication" Target="[System64Folder]msiexec.exe" Arguments="/x {$(var.GUID_Product)} /qb" />
<Shortcut Id="UninstallDesktopShortcut" Name="$(var.ProductNameJP)アンインストール" Description="$(var.ProductNameJP)をアンインストールする." Directory="DesktopFolder" Target="[System64Folder]msiexec.exe" Arguments="/x {$(var.GUID_Product)} /qb" />
</Component>
Shortcut エレメントは各種シートカットを定義する。
| Id | ショートカットの為のユニーク識別子 |
| Name | ショートカット名 |
| Description | 説明文 |
| WorkingDirectory | ワーキングディレクトリ |
| Icon | アイコンファイル |
| Directory | ショートカットが作成されるディレクトリ |
| Target | ターゲットファイル |
| Arguments | コマンドライン引数 |
解説:ヘルプ・ファイル
cpp-01.wxs
<!-- ヘルプ・ファイル -->
<Directory Id="ETC" Name="etc">
<Component Id="EtcFolder" Guid="$(var.GUID_EtcComponent)" Win64="yes" Feature="DefaultFeature">
<File Id="HELP.CHM" Name="help.chm" Source="$(var.SourceFolder)Release\etc\help.chm" />
</Component>
</Directory>
ディレクトリごとに Component エレメントを用意する必要がある。
| Id | コンポーネント識別子 |
| Guid | コンポーネントGUID |
| Win64 | yesは64ビット・コンポーネントであることを示す |
| Feature | このコンポーネントが属しているフィーチャーを識別する。 |
解説:Featureエレメント
cpp-01.wxs
<Feature Id="DefaultFeature" Title="Main Feature" Level="1">
<ComponentRef Id="ApplicationComponent" />
</Feature>
解説:ユーザー・インターフェース
cpp-01.wxs
<!-- ユーザー・インターフェース -->
<Property Id="WIXUI_INSTALLDIR" Value="ApplicationFolder" />
<UIRef Id="WixUI_InstallDir" />
<!-- <UIRef Id="WixUI_Mondo" /> -->
<WixVariable Id="WixUILicenseRtf" Value="$(var.SourceFolder)..\Wix\license.rtf" />
<WixVariable Id="WixUIBannerBmp" Value="$(var.SourceFolder)..\Wix\banner.bmp" />
<WixVariable Id="WixUIDialogBmp" Value="$(var.SourceFolder)..\Wix\dialog.bmp" />
<Icon Id="application.ico" SourceFile="$(var.SourceFolder)application.ico" />
</Product>
</Wix>
インストールやアンインストール時に表示するダイアログは UIRef エレメントで指定する。あらかじめ用意されているダイアログセットから WixUI_InstallDir を選択した。
ライセンスを表すファイルは "license.rtf" として用意する。
インストールやアンインストール時に表示するダイアログの背景は "dialog.bmp"(493×312ピクセル)、バナーを "banner.bmp"(493×58ピクセル)として用意する。
参考サイト
- WiX(Windows Installer XML)
(この項おわり)

そこで、カスタマイズがやりやすいフリーソフト WiX(Windows Installer XML)を利用することにした。