12.03.2013

_IsMaintenance = "Reinstall"

前回の、「常にオーバーライドする」をチェックだけでは再インストールの時にやっぱりうまくいかないことが分かった。

今担当しているインストーラは再インストールの際に「修復」や「削除」などを選ばせない、シンプルな作りのものだ。
一般的なインストーラの再インストールではメンテナンスモード選択ダイアログに進むが、それを単純にスキップしている。
ただしそれだと再インストールしているように見えて実は何もしていないということが起こるのだ(ファイルが壊れていても直してくれないので困ってしまう)。
メンテナンスモード選択のダイアログを処理することで再インストールするモードに設定されるのだが、ダイアログと一緒にそれもスキップされている。

再インストールでメンテナンスモード選択のダイアログが不要な場合、「再インストールするモードに設定」という処理を他のダイアログに追加すると良い。
今回は最初の「ようこそ」の次、必ず通るダイアログに設定した。
そのダイアログの「Next」ボタンのイベントに「Reinstall」を追加、引数は「ALL」、条件は「Installed」とした。「製品が既にインストールされている場合、Reinstall(ALL)とする」というくらいの意味だろう。また、イベント「ReinstallMode」も同様に条件「Installed」で追加すると良いだろう。「ReinstallMode」の引数についてはMSDNが本家だ。デフォルトは「omus」で変更のあったファイルだけ更新、他には「vamus」とか「amus」を指定するのが一般的のようだ。まぁオプションをよく読んで必要な指定をすること、今回はデフォルト「omus」でいいや。

ちなみにこれも正解にたどり着くのに随分時間がかかった。いくつかのサイトにはプロパティ「_IsMaintenance」に「Reinstall」を設定せよ、とあるがこれは単にメンテナンスモード選択ダイアログのデフォルトが修復(Reinstall)になるだけだ。メンテナンスモード選択ダイアログをスキップする場合、そのダイアログの「Next」ボタンのイベントを他のダイアログでやらねばならん。こういうシンプルなインストーラは少数派なんだろうか。
InstallScript実行中にメッセージダイアログを表示させるサンプルコードを載せておく。
MessageBox ("Some message.", INFORMATION);
2つ目の引数はデバッグならINFORMATIONが良いと思うが別にWARNINGでもSEVEREでも良い。文字列しかダメだと思うので数値は文字列に変換して表示させる(NumToStr (dst_str, number)で)。

MSIRESTARTMANAGERCONTROLというプロパティについて。
再インストール時にそのアプリが起動したままだとFileInUseダイアログが出て「起動中の物を閉じてください」とメッセージが出る。これはデフォルトの動作であまりカスタマイズが効かない。まぁ便利だな、くらいに思ってたのだが、当環境で「tomcat」(全然関係無いのに)だの「エクスプローラー」だのを閉じなさいと言われてしまった。中には「Windows® インストーラー」もあった。それはお前だろうと。
何かインストール対象としてチェックするファイルが間違っているような気がしてならないが、どこを見れば良いのかさっぱりだ。探すと「エクスプローラー」を閉じろと言われて困っている人は他にもいたようで、「MSIRESTARTMANAGERCONTROL」というプロパティに「Disable」を設定すれば良いらしい。ちょっと英語力の関係で意味が分かっていないが時間が無いので今回は問題が無ければこれで押し通す。

0 件のコメント:

コメントを投稿