インストーラへの組み込み
カスタムアクションが出来上がったら、次はインストーラへの組み込みです。こちらはいたって簡単です。これを実際に組み込んだものが「STEdit.wxs」となります。まずは、カスタムアクションそのものの組み込み部分を見てみることにしましょう。
<Binary Id="CA_ValidPID.dll" SourceFile="CA_ValidPID\Release\CA_ValidPID.dll"/> <CustomAction Id="CA_ValidPID" BinaryKey="CA_ValidPID.dll" DllEntry="CA_ValidPID" Return="check"/>
これだけです。Binary要素で実際のDLLの組み込みを行います。このBinary要素は他にも画面表示で利用するビットマップやアイコンなどが含まれています(こちらは、WiXUIのライブラリ内のソースにあります)。次の行がCustomActionの定義となります。今回は、バイナリとして埋め込まれているDLL(BinaryKeyとDllEntryで判断される)をIdという名前で定義して、戻り値も確認するという指定が行なわれています(一番標準的な実装となります)。
まずは、UIサイドの実装です。こちらは、ユーザー情報入力画面のダイアログの修正と、新たにエラー表示用のダイアログの作成の2点があります。まずは簡単な修正のほうを見てみましょう。
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="$(loc.WixUINext)"> <Publish Event="ValidateProductID" Value="{}">1</Publish> <Publish Property="ErrorMsg" Value="{}">ProductID</Publish> <Publish Event="DoAction" Value="CA_ValidPID"> ProductID</Publish> <Publish Event="SpawnDialog" Value="FailInputErrorDlg"> ErrorMsg</Publish> <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg"> ProductID AND CostingComplete = 1</Publish> <Publish Event="NewDialog" Value="[UserRegistrationDlg_Next]"> ProductID</Publish> </Control>
比較のためSTEdit8での表示も載せておきます。
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="$(loc.WixUINext)"> <Publish Event="ValidateProductID" Value="0"> UseCustomValidate = 0</Publish> <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg"> CostingComplete = 1</Publish> <Publish Event="NewDialog" Value="[UserRegistrationDlg_Next]"> ProductID</Publish> </Control>
STEdit8では、検証を行なわせないというオプションが用意されていたので上記のようになっていますが、色々とチェックした際にDarkが誤ってデータを出力していたことが分かり、そのあたりも一緒に修正しています(前回は、この設定ミスに気づいていませんでした。動作に支障がないとはいえ、不要な設定ですので修正してあります)。
追加部分は、字下げした3行だけです。ダイアログからカスタムアクションを呼ぶ場合は、DoActionという実行コマンドを使います。Valueに呼び出すカスタムアクションを指定することで実行できるようになります。また、ValidateProductIDがある程度の作業をやってくれますので、どうやら正しそうだ(ProductIDが空ではない)という場合のときだけ呼び出すようにしています。
続いてエラーメッセージを表示するダイアログです。WiXUIのライブラリの中には、インストーラ用メッセージボックスのテンプレートとなる、ErrorDlgというダイアログが用意されています(MsiProcessMessageの中などで利用されています)。ですがこのダイアログは専用の決まりを持っているため、決まった構造で作らなければならないという制限を持っています。今回の場合、同じようなダイアログを表示する必要はあるのですが、このダイアログは使えませんので、別途自分専用のダイアログを用意しなければ実現できません。大枠はそのままに、専用に用意したダイアログとして、FailInputErrorDlgというものを用意しました。こちらは、たいしたものではありませんので、ここにコードは載せませんが、ソースの中にありますので、参考にしてください。
ですが、ツール類がないわけではなく、いくつかのツールが存在しています。有名なところで、2点ほど紹介しておきますので、実開発でUIの作成を検討されている方はこれらのツール類の利用を検討いただければと思います。
次は、実行シーケンスへの埋め込みです。Windows Installerは、UIシーケンス(ソースには表れていませんが、UIの動きを決めるテーブルデータがあります)と、実行シーケンスの2つの動作モード持っています。最終的にインストール情報として組み入れる場合は、必ず実行シーケンス上でも処理する必要がありますので、常に対でセットするものと思っていただければと思います。
<InstallExecuteSequence> <Custom Action="CA_ValidPID" After="ValidateProductID"/> </InstallExecuteSequence>
InstallExecuteSequence要素は、InstallExecuteSequence Tableをそのまま表し、属性はありません。これは一種のグループタグになっており、この中に来る要素(70以上あります)を実際のインストール作業中に行うための制御シーケンステーブルとして用意されています。Custom要素はシーケンステーブルでカスタムアクションを呼び出すための要素となっています。Action属性で実際に呼び出すカスタムアクションのIdを指定し、AfterまたはBeforeでどのアクションの次(あるいは前)に実行するかを指定します。Sequenceを利用することで、呼び出し場所を数値指定(WiX内の独自の基準になっているため、直接数字指定することはお勧めしません)することも可能になっています。
また、実行時に必須とされているStandard Actionsについては、WiX自身が自動的に埋め込んでくれますので、別途設定する必要がないようになっています。
動作確認
毎度のことになりますが、最後は一連の動作確認です。今回は、通常のUIありのインストールシーケンスだけではなく、サイレントインストールについても必ず動作確認をするようにしてください。こちらは、先にも書いたようにValidateProductIDの動作が変わるということもありますが、その挙動が、サイレントインストールの場合とそうではない場合とで、異なる部分があるという点もあります。特にシリアルの検証は、製品にとってある種の生命線でもあります。特定のインストール条件が成立したら動作してしまうなどということがあると大変なことになってしまいますので、注意しましょう。また、アンインストールするときだけNGなどということがないように、実行可能なすべての条件でテストすることをお勧めします。
WiXの要素について
それでは最後に、今回新たに出てきたWiXのデータについて説明します。以下はXML要素の簡単な説明なので、詳細はWiXのサイトの解説(英語)を参照してください。
Binary要素
| 属性名 | 説明 | 必須 |
Id | バイナリデータの識別子。最大55文字まで指定できるが、18文字以下を推奨。 | ○ |
SourceFile | バイナリデータのパス。 | - |
- 参照URL:「Binary Element」
CustomAction要素(埋め込みDLLの場合に必要なもののみ抜粋)
| 属性名 | 説明 | 必須 |
Id | CustomActionの識別子。 | - |
BinaryKey | 参照先バイナリのId。 | - |
DllEntry | DLL形式の場合のエントリー名(エクスポート関数名)。 | - |
Return | 戻り値の確認方法と実行形式。多くの場合はcheck(戻り値を確認する)かignore(戻り値を無視する)になる。戻り値無視の場合、エラーコードを返しても成功と同じ扱いとなる。 | - |
- 参照URL:「CustomAction Element」
Custom要素
| 属性名 | 説明 | 必須 |
Action | CustomActionの識別子。 | ○ |
Before | 指定アクションの直前にこのカスタムアクションを配置。After とは排他となる。 | - |
After | 指定アクションの直後にこのカスタムアクションを配置。Before とは排他となる。 | - |
- 参照URL:「Custom Element」
InstallExecuteSequence要素
子要素が多数あるので、実際の動作の参考にしてください。
- 参照URL:「InstallExecuteSequence Element」
Windows Installer API
サンプルソースで実際に利用している各種APIについては、Windows Installer SDKのリファレンスを参照してください。
Platform SDK(Windows SDK)と一緒にインストールされているローカルなライブラリを参照しても良いですし、MSDNライブラリも現在は無償公開(CD版のみ)されていますので、そちらを参照してもよいと思います。MSDNライブラリについては下記のページよりダウンロードできます。
終わりに
今回でインストールまでの組み込み予定は一通り終了となります。次回はバージョンアップへの対応を組み入れたいと思います。今の時代、初回リリース以後バージョンアップがないのは、コンシューマゲーム機といえどありえないと言えるほど頻繁にバージョンアップが繰り返されています。その内容もいわゆるバグフィックスだけではなく、大小さまざまな機能アップなど、単に更新といってもさまざまな状況があります。Windows Installerではこれにどのような形式で対応しているのか、またWiXを使ってどのようにデータを準備していくのかなどを検討してみたいと思います。また、事前に考慮しておくべき項目にどのようなものがあるのかも併せて検討します。
