WiX には、よくある課題の達成について、私たちインストーラ開発者を支援してくれる追加のライブラリがいくつか付属しています。詳しく見ていきますが、まずは簡単なサンプルから始めましょう。
10.1 カスタム・アクションとユーザー・インタフェイス
SampleListbox は、どのようにすれば、ユーザー・インタフェイスに表示されるデータをカスタム・アクションで収集することが出来るかを示しています。これを実現するために、WiX に付属している WcaUtil カスタム・アクション・ライブラリを使います。このライブラリは、C++ でカスタム・アクションを書くことを容易にしてくれる多くのユーティリティ関数を持っています。その中には、プロパティを生の形式および整形された形式で取得および設定する関数や、インストーラ・データベースを修正する関数や、Windows Installer のログ・ファイルにログを吐く関数なども含まれています。
† 訳註:SampleListbox の日本語版は Sample-10-1-Listbox.zip です。
組み込みの UI をわずかに修正して、新しいダイアログ、InstallDlg を作成します。どうやってこれを実現するかは、これまでのレッスンで既に見ています。つまり、ここには、まだ知らないものは何もありません。カスタム・アクションを定義してスケジュールします。リストボックスをパブリックなプロパティにリンクされるように定義します。
<CustomAction Id="FillingListbox" BinaryKey="FillListbox" DllEntry="FillListbox" />
<UI>
<Dialog Id="InstallDlg" Width="370" Height="270"
Title="[ProductName] [Setup]" NoMinimize="yes">
...
<Control Id="FilledListbox" Type="ListBox" Sorted="yes" Indirect="no"
Property="LISTBOXVALUES" X="10" Y="50" Width="200" Height="130" />
</Dialog>
<InstallUISequence>
<Custom Action="FillingListbox" After="CostFinalize" />
<Show Dialog="InstallDlg" After="FillingListbox" />
</InstallUISequence>
</UI>
<Binary Id="FillListbox" SourceFile="FillListbox.dll" />
† 訳註:リストボックスで選択された項目を調べて使用する方法については、日本語のサンプルを参照して下さい。
カスタム・アクションは、Wca 関数を使って、インストーラとの接続を初期化したりクローズしたり、パブリックなプロパティに現れる値を挿入したりします。そして、このプロパティに接続されているリストボックスにその値が反映されます。
#include <windows.h>
#include <msi.h>
#include <msiquery.h>
#include "wcautil.h"
#pragma comment(linker, "/EXPORT:FillListbox=_FillListbox@4")
extern "C" UINT __stdcall FillListbox(MSIHANDLE hInstall) {
HRESULT hResult = WcaInitialize(hInstall, "FillListbox");
if (FAILED(hResult)) return ERROR_INSTALL_FAILURE;
MSIHANDLE hTable = NULL;
MSIHANDLE hColumns = NULL;
hResult = WcaAddTempRecord(&hTable, &hColumns, L"ListBox", NULL, 0, 3,
L"LISTBOXVALUES", 1, L"いも", L"Item 1");
hResult = WcaAddTempRecord(&hTable, &hColumns, L"ListBox", NULL, 0, 3,
L"LISTBOXVALUES", 2, L"たこ", L"Item 2");
hResult = WcaAddTempRecord(&hTable, &hColumns, L"ListBox", NULL, 0, 3,
L"LISTBOXVALUES", 3, L"なんきん", L"Item 3");
if (hTable)
MsiCloseHandle(hTable);
if (hColumns)
MsiCloseHandle(hColumns);
return WcaFinalize(hResult);
}
この DLL をビルドするときには、msi.lib の他に、dutil.lib と wcautil.lib もリンクしなければなりません。これらのファイルは WiX ツールセットとともにインストールされています。
10.2 お静かに願います!
実行ファイルを開始するためには標準のカスタム・アクションが使えますが、起動されるプログラムが普通のグラフィカルなユーザー・インタフェイスを持っていないコンソール・アプリケーションである場合には、それが最善の方法ではないかも知れません。この場合、コマンド・ライン・コンソールが一瞬だけ開くのを避けたいのではないでしょうか。
標準の WixUtil ライブラリに、そういう場合にちょうど良い CAQuietExec という特殊なカスタム・アクションがあります。このカスタム・アクションを使うためには、QtExecCmdLine という定義済みのプロパティに実行すべきコマンド・ラインを入れなければなりません。コマンドの実行は、即時でも遅延でも構いません。
<Property Id="QtExecCmdLine" Value="something.exe"/>
<CustomAction Id="SilentLaunch" BinaryKey="WixCA" DllEntry="CAQuietExec"
Execute="immediate" Return="check" />
<InstallExecuteSequence>
<Custom Action="SilentLaunch" After="..." />
</InstallExecuteSequence>
64-bit の実行ファイルを実行するためには、CAQuietExec64 および QtExec64CmdLine を代りに使って下さい。
ビルドするためには、この標準ライブラリをリンクしなければなりません。
candle.exe Sample.wxs light.exe -ext WixUtilExtension Sample.wixobj