今回はややこしい話になりそうだ。うまくいかないのに、詳しく書くのも何だかむなしいが、知り得たことはとりあえずまとめておこう。
調べてみたところ、以下の作業が必要なようだ。
- Upgradeテーブルを新規に作成。
- PropertyテーブルのSecurePropertiesプロパティを追加。
- 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プロパティをセットするように指示している。
2. PropertyテーブルのSecurePropertiesプロパティを作成
次に、PropertyテーブルのSecurePropertiesプロパティを追加し、上のActionPropertyで指定したOLDAPPFOUNDを設定する。追加の方法は、ALLUSERSプロパティを追加したときと同じだ。
3. InstallExecuteSequenceテーブルに旧バージョン検出のアクションを挿入
さらに、InstallExecuteSequenceテーブルにFindRelatedProductsを挿入する。ActionにFindRelatedProducts、Conditionは空、Sequenceには200を指定する。Sequenceの若い順にActionが実行されるので、番号を変えるにしても前後関係を把握して行うこと。
ここまで書いてなんなのだが、実はこのステップより前に進むことができないのである。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でカスタマイズしてやれば、旧バージョンを検出しているのがよくわかる。上記のように、旧バージョン検出時にメッセージを表示するように改造しても、うまく動く。しかし、データベースの構成に大きな違いがあるようには見えないのである。市販のものは、体験版を入手して行った。同様の機能を持ったアップグレードインストーラを作成したら、何の苦もなくアップグレードできる…。
それ以前に、インストーラファイル作成後に、これだけの手間をかけなければならないとしたら、すごく手間だ。何しろ、インストーラファイルを作り直すたびにこのような手間を…。最終的に行えばいいかも知れないが、いずれにしろ手間だ。
そこで、日和ったようだが市販のインストーラ作成ツールを試してみることにした。これについては後日。