CodeZine(コードジン)

特集ページ一覧

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

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

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

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

目次

実装範囲の検討

 実装形式は決まりました。次は具体的にどこまで自分で実装するかとなります。まずは、シリアル入力とその検証全体の流れを見てみましょう。

  1. シリアル番号の発行形式に基づいたテンプレートを用意する(PIDTemplateへの設定)
  2. ユーザーの入力を受け取れるようにする(PIDKEYへのセット、通常はダイアログのコントロールを用意するだけ)
  3. 入力漏れ、ミスを検証する(PIDKEYとPIDTemplateの突合せ)
  4. シリアル値として正しいことを検証する(PIDKEYの内容の検証)
  5. 不正なシリアル値の場合は適切なエラーメッセージを表示して先に進ませない(ProductIDの内容を削除する)
  6. 正規のシリアル値の場合はProductIDへの反映をして、先に進めるようにする

 となります。ValidateProductIDが行なっている部分は3.以降なので、この部分が今回の実装対象と言えます。全部実装して完全に置き換えてしまうという選択肢もありますが、コラムに書いたようにカスタムアクションは実行コストが非常に高くつくため、自分で実装せずに済むのであれば、これに越したことはありません。今回の場合であれば、具体的なシリアル番号の形態と、ValidateProductIDがどこまでやってくれるかを見極めることができれば、自分で新たに実装する部分(車輪を再発明する部分)を最小限にできる可能性があります。

 検討できる材料として、まずはValidateProductIDがどのような処理を行なっているかを検証するインストーラを作成してみました。「STEdit9.msi」としてプロジェクトに含めていますので、そちらを実際に動作させてみてください。PIDTemplateは第4回と同じ、「12345<###-%%%%%%%>@@@@@」としています。入力結果のメッセージを表示するようにして先に進めないようにしていますが(CA_CheckPIDというカスタムアクション)、何度でも繰り返し参照できるようにしていますので、[Next]ボタンを何度も押してみる、未入力状態や、中途半端な入力状態を試してみるなどを行い、どのような結果が返ってくるかをよく吟味してください。なお、デバッグ版のDLLは、デバッグ用のメッセージボックスを表示するようにしていますので、動作が見えないという場合は、デバッグ版で作成し、実際にステップ実行させることをお勧めします。

カスタムアクションのデバッグ
 Debugging Custom Actionsに詳細が書かれていますが、先にも書いたように専用プロセスで動くため、デバッガからインストーラ自体のデバッグ実行を行なっても、カスタムアクションをデバッグすることはできません。開発中であれば、サンプルソースが行なっているように関数の入り口でアサーションさせることで、デバッガからアタッチすることができますが、リリース版の場合はこれが行なえません(ユーザーの環境でそのような変なメッセージが出ては困ってしまいますからね)。Windows Installerでは、これをサポートするために、環境変数のMsiBreakにカスタムアクションの名前を入れておくことで、インストーラのランタイムエンジンにアサーションを起こさせる機構が用意されています。これらをうまく使って、カスタムアクションの入り口でわざと動きを止めることで、デバッガからアタッチできるようになります。
 ただし、環境変数を使ってアサーションした場合、デバッガでアタッチしないとそのまま、例外が発行されてしまい、カスタムアクションがスキップされます。そのため、これを使う場合は必要がない場合であっても必ずデバッガでアタッチさせないといけませんので、その点だけは注意してください。

PIDTemplateの値を検討する

 ValidateProductIDの仕組みがある程度わかったでしょうか? ここから実際の設計~実装となります。まずは受け付けるシリアル番号そのものの検討です。といってもこの部分は本来なら開発者が検討するのではなく製品管理部門での作業となります。具体的にどういう値をシリアル番号として発行するのかや、ユーザーが入力する形式はどのような形式なのかなどが正しく吟味されている必要があります。とはいえ、そのようなものまで作りこむのは大変ですので、冒頭にも書いたように

  • 3桁-7桁の合計10桁の数字データで構成されている
  • 各数字は、1~3のいずれかで構成されている
  • 数字の構成内容、出現順については不問とする

 という形とします。まずはこの仕様を満たす、PIDTemplateを決めなければなりません。表現形式としては、第4回までと同様ですが、後続7桁も数値が入っていれば良いだけですので、規則性は不要です。ですので「%」記号ではなく「#」記号を使えばよいと思われます。また、「STEdit9.msi」の動作をみると実際に ProductIDにセットされている値に余計なものが含まれていることが分かります。しかも、よく見ると分かるのですが、検証するたびに最後の5桁の数字が変わっています。これらを ProductIDに含めたままでは、検証処理が煩雑になってしまいますし、今のところ必要とも思えませんので、ばっさり削ってしまってもよいでしょう。今回は、いろいろと調査したところ「<###-#######>」でいけそうですので、ひとまずこの値を使ってみることにします。

PIDTemplateのテクニック
 PIDTemplateは<>で囲まれた内側と外側で異なる意味を持っています。外側に来るものは、ValidateProductIDを通じてProductIDにセットした場合だけ反映されるため、PIDKEY側には何の影響も与えません。また、内側にくる文字も特別な記号を除き、ほかはリテラル文字列としてそのまま格納されるようになっています。これらをうまく使えば、先頭に固定値(しかも見せないor見せつつ)を持つシリアルの入力なども可能となります。いろいろな組み合わせを実験して、自身のプロジェクトにうまくあてはめられるように研究してみてください。

実装範囲の絞込み

 実際にユーザーが入力する部分までは今までどおりのままで何の問題もありませんし、入力させる形式も決まりました。残るは入力結果が正しいもの(シリアル番号として認めうるもの)であることの検証です。ValidateProductIDや、MaskedEditには数字の入力可能範囲を限定するというものがありませんので、これを何らかの形で別途確認する仕組みが必要ということになります。とはいえ、入力ミスや入力しなかった場合、途中だった場合などいろいろなエラーまで全部チェックするというのはなんだかもったいない気がしますし、せっかく実行コストの低い標準実装がいろいろと面倒を見てくれるのですから、これを利用しないという手はありません。また、先にも書いたようにカスタムアクションは実行コストが非常に高いため、可能であれば、それを回避したいということもあります。ここでもう一度STEdit9を思い出してください。このインストーラは入力確認のためだけに用意したものですが、動かしてみて分かるように、ValidateProductIDの結果を受けてそれを表示するという形になっています(できれば、カスタムアクションをステップ実行して具体的な動きを把握してもらいたいと思います)。STEdit9では単に表示としていますが、これをProductIDの中身の確認にすれば、どうやら、正しそうな入力結果の場合だけ動作させるということができそうです。結果オーライの部分はあるものの、軽量にまとめることができそうですので、これを積極的に活用してみたいと思います。

カスタムアクションの呼び出し条件

 実装範囲も決まりました。では実際にどのようなことを行なえばいいのでしょうか? ValidateProductIDが成功したかどうかの判断は、ProductIDに値があるかどうかで判断できます。このProductIDがあるという条件をカスタムアクションの呼び出し条件に指定しておけば、本当に必要なときだけカスタムアクションを実行することができます。これを踏まえて実際に実装したいと思います。

カスタムアクションの実装

 いよいよ実装です。プロジェクトの作成手順やソースの説明は、C++言語の知識があれば特に難しいところはないと思いますし、紙面の都合もありますのでカットしました。VC2005に特有の注意点だけはコラムにまとめたので、そちらを参照ください。

 また、コラム中の画面にも出ていますが、「msi.lib」というWindows Installerの APIをリンクするライブラリの指定もプロジェクトのプロパティで行っています。これはVS2005でも必須ですので、忘れずに設定するようにしてください。

VC2005でのDLL作成時の注意点
 VC2005に最初から用意されている機能は、.NET Frameworkアプリケーションの作成と、Win32コンソールアプリケーションの作成だけになっています。そのため、GUIアプリや、DLLの作成に必要なものが何にも用意されていません。ヘッダーやライブラリについては、SDKを導入することで用意できますが、VC2005が機能拡張されるわけではないので、リソースの編集など、通常コンソールを作成する際にはあまり必要とはならない部分がすべてカットされてしまっています。
 DLLを作成する場合も同様で、VS2005なら新規追加でdefファイルも簡単に追加できるのですが、VC2005ではこの部分の機能が全部はずされてしまっています。そのため、テキストファイルを作成し、その拡張子を.defとして保存した後、下図のように自分で指定する必要があります。これを怠るとエクスポート関数が用意されなくなってしまうので注意してください。
プロパティ画面
プロパティ画面

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

バックナンバー

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

著者プロフィール

あなたにオススメ

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