CodeZine(コードジン)

特集ページ一覧

WiXではじめるWindows Installer作成入門 第5回

独自のシリアル番号検証ルーチンの作成

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/11/30 00:00

ダウンロード サンプルソース (115.4 KB)
ダウンロード STEdit9 (1.8 MB)
ダウンロード STEdit (1.8 MB)

目次

インストーラへの組み込み

 カスタムアクションが出来上がったら、次はインストーラへの組み込みです。こちらはいたって簡単です。これを実際に組み込んだものが「STEdit.wxs」となります。まずは、カスタムアクションそのものの組み込み部分を見てみることにしましょう。

CustomAction の組み込みと定義
<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(BinaryKeyDllEntryで判断される)をIdという名前で定義して、戻り値も確認するという指定が行なわれています(一番標準的な実装となります)。

 まずは、UIサイドの実装です。こちらは、ユーザー情報入力画面のダイアログの修正と、新たにエラー表示用のダイアログの作成の2点があります。まずは簡単な修正のほうを見てみましょう。

UserRegistrationDlgのNextボタンの実装
<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での表示も載せておきます。

STEdit8.wxs(抜粋)
<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が空ではない)という場合のときだけ呼び出すようにしています。

Publishの動作
 Publish(ControlEvent Tableに格納されます)の動作は、ちょっとだけ複雑な動きをします。一見すると順次動作しているように見えるのですが、実際の動作はバッチ処理になっており、一通りテーブルをセットアップした後、一気に実行される仕組みになっています(もちろん、その間のプロパティなどは随時反映される)。そのため、ダイアログを表示する処理を複数挟んでいる場合、それが重複して表示されてしまうという不具合が発生することがあり、処理の途中で一度ダイアログを出して、さらに続きを行なわせるということができません。通常のアプリケーションのようにボタン処理に複数のUIを伴う実装を入れることは事実上できない形となっています。どこにも記載がないため、仕組みを理解していないと、うまくいかないという状況に遭遇してしまいますので注意してください。

 続いてエラーメッセージを表示するダイアログです。WiXUIのライブラリの中には、インストーラ用メッセージボックスのテンプレートとなる、ErrorDlgというダイアログが用意されています(MsiProcessMessageの中などで利用されています)。ですがこのダイアログは専用の決まりを持っているため、決まった構造で作らなければならないという制限を持っています。今回の場合、同じようなダイアログを表示する必要はあるのですが、このダイアログは使えませんので、別途自分専用のダイアログを用意しなければ実現できません。大枠はそのままに、専用に用意したダイアログとして、FailInputErrorDlgというものを用意しました。こちらは、たいしたものではありませんので、ここにコードは載せませんが、ソースの中にありますので、参考にしてください。

インストーラのUI画面の作成
 連載では、切り張り形式で画面を作っていますが、独自に画面の用意が必要になる可能性は十分ありえます。こちらについては連載でカバーしきれない範囲になるため、あえてはずしています。
 ですが、ツール類がないわけではなく、いくつかのツールが存在しています。有名なところで、2点ほど紹介しておきますので、実開発でUIの作成を検討されている方はこれらのツール類の利用を検討いただければと思います。

 次は、実行シーケンスへの埋め込みです。Windows Installerは、UIシーケンス(ソースには表れていませんが、UIの動きを決めるテーブルデータがあります)と、実行シーケンスの2つの動作モード持っています。最終的にインストール情報として組み入れる場合は、必ず実行シーケンス上でも処理する必要がありますので、常に対でセットするものと思っていただければと思います。

InstallExecuteSequenceでの呼び出し指定
<InstallExecuteSequence>
  <Custom Action="CA_ValidPID" After="ValidateProductID"/>
</InstallExecuteSequence>

 InstallExecuteSequence要素は、InstallExecuteSequence Tableをそのまま表し、属性はありません。これは一種のグループタグになっており、この中に来る要素(70以上あります)を実際のインストール作業中に行うための制御シーケンステーブルとして用意されています。Custom要素はシーケンステーブルでカスタムアクションを呼び出すための要素となっています。Action属性で実際に呼び出すカスタムアクションのIdを指定し、AfterまたはBeforeでどのアクションの次(あるいは前)に実行するかを指定します。Sequenceを利用することで、呼び出し場所を数値指定(WiX内の独自の基準になっているため、直接数字指定することはお勧めしません)することも可能になっています。

 また、実行時に必須とされているStandard Actionsについては、WiX自身が自動的に埋め込んでくれますので、別途設定する必要がないようになっています。

ValidateProductIDの動作について
 ValidateProductIDには、2つの実装があります。一つは、StandardActionsとしての実装で、こちらは、シーケンス内から呼び出された場合の動作となります。もう一つがControlEvent(Publishでの呼び出し)としての実装で、こちらはダイアログの中でだけ有効なものとなります。いずれの場合も基本的な動作としては、PIDTemplateを基に、PIDKEYの検証を行い、値として問題がなければ、ProductIDに反映するという仕組みなのですが、その実行条件に違いがあります。シーケンスとして実行した場合、ProductIDに既に値がある場合は、その内容にかかわりなく、検証済みと判断し、動作しません。それに対し、ダイアログから呼び出した場合は、ProductIDの内容にかかわりなく、まだ未検証という扱いになります。これは、ダイアログを行きつ戻りつした場合でも毎回チェックする必要があるためのものなのですが、そのため、この動作の仕組みを把握していないと、意図した検証がなされずにスルーしてしまうということがあります。

動作確認

 毎度のことになりますが、最後は一連の動作確認です。今回は、通常のUIありのインストールシーケンスだけではなく、サイレントインストールについても必ず動作確認をするようにしてください。こちらは、先にも書いたようにValidateProductIDの動作が変わるということもありますが、その挙動が、サイレントインストールの場合とそうではない場合とで、異なる部分があるという点もあります。特にシリアルの検証は、製品にとってある種の生命線でもあります。特定のインストール条件が成立したら動作してしまうなどということがあると大変なことになってしまいますので、注意しましょう。また、アンインストールするときだけNGなどということがないように、実行可能なすべての条件でテストすることをお勧めします。

WiXの要素について

 それでは最後に、今回新たに出てきたWiXのデータについて説明します。以下はXML要素の簡単な説明なので、詳細はWiXのサイトの解説(英語)を参照してください。

Binary要素

Binary要素の属性
属性名説明必須
Idバイナリデータの識別子。最大55文字まで指定できるが、18文字以下を推奨。
SourceFileバイナリデータのパス。-

CustomAction要素(埋め込みDLLの場合に必要なもののみ抜粋)

CustomAction要素の属性
属性名説明必須
IdCustomActionの識別子。-
BinaryKey参照先バイナリのId。-
DllEntryDLL形式の場合のエントリー名(エクスポート関数名)。-
Return戻り値の確認方法と実行形式。多くの場合はcheck(戻り値を確認する)かignore(戻り値を無視する)になる。戻り値無視の場合、エラーコードを返しても成功と同じ扱いとなる。-

Custom要素

Custom要素の属性
属性名説明必須
ActionCustomActionの識別子。
Before指定アクションの直前にこのカスタムアクションを配置。After とは排他となる。-
After指定アクションの直後にこのカスタムアクションを配置。Before とは排他となる。-

InstallExecuteSequence要素

 子要素が多数あるので、実際の動作の参考にしてください。

Windows Installer API

 サンプルソースで実際に利用している各種APIについては、Windows Installer SDKのリファレンスを参照してください。

 Platform SDK(Windows SDK)と一緒にインストールされているローカルなライブラリを参照しても良いですし、MSDNライブラリも現在は無償公開(CD版のみ)されていますので、そちらを参照してもよいと思います。MSDNライブラリについては下記のページよりダウンロードできます。

終わりに

 今回でインストールまでの組み込み予定は一通り終了となります。次回はバージョンアップへの対応を組み入れたいと思います。今の時代、初回リリース以後バージョンアップがないのは、コンシューマゲーム機といえどありえないと言えるほど頻繁にバージョンアップが繰り返されています。その内容もいわゆるバグフィックスだけではなく、大小さまざまな機能アップなど、単に更新といってもさまざまな状況があります。Windows Installerではこれにどのような形式で対応しているのか、またWiXを使ってどのようにデータを準備していくのかなどを検討してみたいと思います。また、事前に考慮しておくべき項目にどのようなものがあるのかも併せて検討します。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:WiXではじめるWindows Installer作成入門

著者プロフィール

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5