もし、すでに製品がインストールされている環境で、 REINSTALLプロパティを指定せずに実行すると、「別のバージョンの製品がすでにインストールされています」と表示され、インストールを続行できません。
逆に、製品がインストールされていない状態で、 REINSTALLプロパティを指定して実行すると、一見、インストール作業は正常に完了したように見えますが、実は何もインストールされていません。
つまり、 REINSTALLプロパティは、既存ユーザーの場合は指定しなければならず、新規ユーザーの場合には指定してはいけないのです。
1つの配布パッケージで、既存ユーザーと新規ユーザーの両方に対応するためには、コマンドラインから指定された REINSTALLプロパティを、新規ユーザーの場合に無効化するようにします。
( REINSTALLプロパティが無効化されれば、 REINSTALLMODEプロパティは無視されます。)
これを実現するには、Orca を使って、下記のように行います。
1. |
テーブル「 CustomAction」を開き、コマンド「ADD ROW」で、下記のレコードを追加します。
Action | Type | Source | Target |
CA_UNREINSTALL | 51 | REINSTALL | (空白) |
ここでは、 REINSTALLプロパティにNULL値をセットする「動作」を追加します。
"Action=CA_UNREINSTALL"は重複しない適当な名前で、"TYPE=51"は"Source"で指定されるプロパティに、"Target"で指定される値をセットすることを表す 定数です。
|
|
2. |
処理フローを追加
テーブル「 InstallUISequence」およびテーブル「 InstallExecuteSequence」をそれぞれを開き、コマンド「ADD ROW」で、下記のレコードを追加します。
Action | Condition | Sequence |
CA_UNREINSTALL | NOT Installed | 999 |
InstallUISequence は、インストール作業を行うための準備の流れを設定するテーブルです。
InstallExecuteSequence は、インストール作業の流れを設定するテーブルです。
ここでは、上記1で作成したカスタムアクション処理を追加します。
"Action=CA_UNREINSTALL"は、カスタム条件"NOT Installed"が真の時、つまり、すでに製品がインストールされていない場合に、前述1で指定したカスタムアクションCA_UNREINSTALLを実行することを意味します。
"Sequence"の数字は、実行される順番を表します。同テーブル内にある"Action= CostFinalize(通常1000)"より前になるようにします。
|
|
ここまで読んだあなたは、 REINSTALLMODEプロパティも動的に変更すれば、コマンドライン引数として指定する必要はないのではないかと考えるかもしれません。
しかし、この方法は使えません。
このプロパティは、コマンドラインからの指定以外受け付けません。
なぜなら、指定値として、"v"が含まれているかどうかにより、"システムにキャッシュされているMSIファイルを使うか"(Windowsインストーラでは、インストールされたアプリケーションの修復セットアップに対応するため、MSIファイルのコピーをシステム領域にキャッシュしています)、それとも、"指定したMSIファイルを使うか"を判断しているからです。
つまり、指定値に"v"が含まれているかどうかは、MSIファイルを読み込む前に判定しなければ意味がないのです。
よって、このプロパティをコマンドラインからしか指定できないことは、至極当然と言えるでしょう。
なお、引数を指定してMSIファイルを実行する方法として、別ページ IExpressを使った配布ファイルの作成手順 にて一例を説明していますので、そちらも参考にして下さい。
|