1
0

インストーラでレジストリに動的な値を書き込む方法

Last updated at Posted at 2023-11-14

概要

Windows用のインストーラ作成を作成する場合はVisual Studioの拡張機能Microsoft Visual Studio Installer Projects(以降、Installer Projectsと呼ぶ)を使用することも多いでしょう。
ドキュメントが少ない、拡張性が乏しい、レガシー、バージョン管理しにくい、謎仕様が多い…など様々な問題を抱えているInstaller Projectsですが、なぜか戻ってきてしまう魅力があります。

先日インストーラを作成していて、インストールウィザード内でユーザに入力してもらった内容をレジストリに書き込むという内容を実現する必要があって、ちょっとハマったので忘れないうちにメモしておきます。

仕様

  • インストーラのウィザードで以下のような合言葉の入力を要求します。
    image.png
  • 合言葉はレジストリに記録されます。
    image.png
  • バージョンアップ時や修復(すでにインストール済みのインストーラを起動して元の状態を復元するやつ)時も合言葉は初期化されないようにします。

インストーラの設定

まず、起動条件を設定します。すでにレジストリに記録されている合言葉の値を取得します。初回インストール時などレジストリに値が存在しない場合も空の値が取得されるだけなので特に問題ありません。
以下のように設定することでレジストリの値がPropertyで指定した変数(TESTVALUE)に格納されます。[TESTVALUE]のように使用することでインストーラ内の様々な場所から参照できます。

image.png

次にユーザーインターフェイスの設定をします。レジストリから取得した値を画面上に表示したいのでEdit1Value[TESTVALUE]を指定しています。また、この画面の入力値で合言葉を上書きしたいのでEdit1PropertyTESTVALUEを指定しています。

image.png

最後にレジストリの設定をします。合言葉の値を所定のキーに書き込むようにしています。値の名前はTestValueにして書き込む値は合言葉([TESTVALUE])です。
このときConditionREINSTALL <> "ALL"TransitiveTrueに設定しています。修復時には(なぜか)合言葉を入力するための画面が表示されないため、このような設定しないと修復時に合言葉が初期化されてしまいます。

image.png

修復時にはREINSTALLの値がALLになるようです。これによってConditionの評価値がFalseになり、レジストリの書き換え(初期化)が行われなくなります。単純にNOT REINSTALLなどとするとバージョンアップ時も書き換えがスキップされてしまうことになり、バージョンアップするたびに合言葉を入力し直さなくてはならなくなります。また、TransitiveTrueにすることでインストールのたびにConditionが再評価されるようになります。

Conditionの書き方についてはこのあたりの説明は下記の記事が詳しいです。

注意

インストール対象をすべてのユーザーにすると上記のように設定しても修復時にレジストリが初期化されてしまいます。レジストリの書きこむ先をLocal Machineにすればいいかというとそうではありません。どういう理屈なんでしょうね。

ソースコード

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0