概要
Windows用のインストーラ作成を作成する場合はVisual Studioの拡張機能Microsoft Visual Studio Installer Projects(以降、Installer Projectsと呼ぶ)を使用することも多いでしょう。
ドキュメントが少ない、拡張性が乏しい、レガシー、バージョン管理しにくい、謎仕様が多い…など様々な問題を抱えているInstaller Projectsですが、なぜか戻ってきてしまう魅力があります。
先日インストーラを作成していて、インストールウィザード内でユーザに入力してもらった内容をレジストリに書き込むという内容を実現する必要があって、ちょっとハマったので忘れないうちにメモしておきます。
仕様
- インストーラのウィザードで以下のような合言葉の入力を要求します。
- 合言葉はレジストリに記録されます。
- バージョンアップ時や修復(すでにインストール済みのインストーラを起動して元の状態を復元するやつ)時も合言葉は初期化されないようにします。
インストーラの設定
まず、起動条件を設定します。すでにレジストリに記録されている合言葉の値を取得します。初回インストール時などレジストリに値が存在しない場合も空の値が取得されるだけなので特に問題ありません。
以下のように設定することでレジストリの値がProperty
で指定した変数(TESTVALUE
)に格納されます。[TESTVALUE]
のように使用することでインストーラ内の様々な場所から参照できます。
次にユーザーインターフェイスの設定をします。レジストリから取得した値を画面上に表示したいのでEdit1Value
に[TESTVALUE]
を指定しています。また、この画面の入力値で合言葉を上書きしたいのでEdit1Property
にTESTVALUE
を指定しています。
最後にレジストリの設定をします。合言葉の値を所定のキーに書き込むようにしています。値の名前はTestValue
にして書き込む値は合言葉([TESTVALUE]
)です。
このときCondition
にREINSTALL <> "ALL"
、Transitive
はTrue
に設定しています。修復時には(なぜか)合言葉を入力するための画面が表示されないため、このような設定しないと修復時に合言葉が初期化されてしまいます。
修復時にはREINSTALL
の値がALL
になるようです。これによってCondition
の評価値がFalse
になり、レジストリの書き換え(初期化)が行われなくなります。単純にNOT REINSTALL
などとするとバージョンアップ時も書き換えがスキップされてしまうことになり、バージョンアップするたびに合言葉を入力し直さなくてはならなくなります。また、Transitive
をTrue
にすることでインストールのたびにCondition
が再評価されるようになります。
Condition
の書き方についてはこのあたりの説明は下記の記事が詳しいです。
注意
インストール対象をすべてのユーザー
にすると上記のように設定しても修復時にレジストリが初期化されてしまいます。レジストリの書きこむ先をLocal Machine
にすればいいかというとそうではありません。どういう理屈なんでしょうね。
ソースコード