アップグレードインストーラ作成記(5)

今回はややこしい話になりそうだ。うまくいかないのに、詳しく書くのも何だかむなしいが、知り得たことはとりあえずまとめておこう。

調べてみたところ、以下の作業が必要なようだ。

  1. Upgradeテーブルを新規に作成。
  2. PropertyテーブルのSecurePropertiesプロパティを追加。
  3. InstallExecuteSequenceテーブルに旧バージョン検出のアクションを挿入。
1.Upgradeテーブルを新規に作成

Upgradeテーブルを作成する。Tablesペインで右クリックし、[Add Tables…]を選択すれば、Upgradeテーブルを追加できる。ポップアップするウィンドウで、Upgradeにチェックして閉じれば追加される。追加できないテーブルは表示されない。Upgradeテーブルには、検出した同一更新用コードを持ったアプリケーションのバージョンに対し、どのような動作をするかということを登録する。

  • UpgradeCode…更新用コード。ここを合わせる。
  • VersionMin…最低バージョン。
  • VersionMax…最大バージョン。
  • Language…言語。
  • Attributes…属性。
  • Remove…削除の可否。
  • ActionProperty…セットすべきプロパティ。

UpgradeCode, VersionMin, VersionMax, Language, Attributesには検出した旧バージョンを絞り込むための情報を与える。指定された更新用コード、バージョン範囲、言語、属性を持った旧バージョンを検出したら、Removeで削除の可否を指定し、ActionPropertyに設定すべきプロパティを指定する。たとえば、以下のような感じだ。

  • UpgradeCode…{B461859A-C3F8-47FB-8A46-FF48A767A1B4}
  • VersionMin…1.0.0.0
  • VersionMax…1.0.0.0
  • Language…指定せず
  • Attributes…769
  • Remove…指定せず
  • ActionProperty…OLDAPPFOUND

バージョンは、単一のバージョンを指定することになる。言語は特定せず、属性でバージョンの範囲についての細かな指定を行っている。重要なのはActionPropertyだが、指定バージョンを検出したらOLDAPPFOUNDプロパティをセットするように指示している。

orca004 クリックすると拡大します。

2. PropertyテーブルのSecurePropertiesプロパティを作成

次に、PropertyテーブルのSecurePropertiesプロパティを追加し、上のActionPropertyで指定したOLDAPPFOUNDを設定する。追加の方法は、ALLUSERSプロパティを追加したときと同じだ。

orca005 クリックすると拡大します。

3. InstallExecuteSequenceテーブルに旧バージョン検出のアクションを挿入

さらに、InstallExecuteSequenceテーブルにFindRelatedProductsを挿入する。ActionにFindRelatedProducts、Conditionは空、Sequenceには200を指定する。Sequenceの若い順にActionが実行されるので、番号を変えるにしても前後関係を把握して行うこと。

orca006 クリックすると拡大します。

ここまで書いてなんなのだが、実はこのステップより前に進むことができないのである。FindRelatedProductsが実行されて旧バージョンが検出されれば、OLDAPPFOUNDが1にセットされるはずだ。だが、この様子がないのである。これを確認するために、CustomActionテーブルにメッセージ表示用のアクションを登録する。Actionは名前なので、たとえばShowOldVersionとしておく。Typeには19,Sourceは空、Targetに「Find Old Version.」とでも登録しておく。さらに、InstallExecuteSequenceテーブルにActionをShowOldVersion、ConditionにOLDAPPFOUND、Sequenceに201として登録する。もしFindRelatedProductsによって旧バージョンが検出できてOLDAPPFOUNDがセットされれば、ShowOldVersionが実行されてFind Old Versionと表示されるはずだ。だが、ダメなのである。

検出できなければ、旧バージョンからのアップグレードでなく、新規のインストールと見なされて二重インストールになってしまう。コントロールパネルから[プログラムの追加と削除]を実行すれば、新旧双方見えてしまう。これでは、まずいのである。

この間一週間。

とにかく、旧バージョンの検出に全力を尽くした。この間行ったことと言えば、同じくWindows Installerで提供されているフリーアプリケーションの検証、そして市販のツールを使って作ったインストーラの検証である。フリーソフトウェアのものは、何で作ったのかにもよらず、Orcaでカスタマイズしてやれば、旧バージョンを検出しているのがよくわかる。上記のように、旧バージョン検出時にメッセージを表示するように改造しても、うまく動く。しかし、データベースの構成に大きな違いがあるようには見えないのである。市販のものは、体験版を入手して行った。同様の機能を持ったアップグレードインストーラを作成したら、何の苦もなくアップグレードできる…。

それ以前に、インストーラファイル作成後に、これだけの手間をかけなければならないとしたら、すごく手間だ。何しろ、インストーラファイルを作り直すたびにこのような手間を…。最終的に行えばいいかも知れないが、いずれにしろ手間だ。

そこで、日和ったようだが市販のインストーラ作成ツールを試してみることにした。これについては後日。

コメント