3

ユーザー構成がレジストリに保存されている古いアプリケーションを維持しています。アンインストール時に残ります。現在、WiX でインストーラーを書き直しています。

レジストリに何もない場合、インストーラはデフォルト値をレジストリに追加する必要があります。それ以外の場合は、既存の値をそのままにしておく必要があります。

WiXでこれを行う方法を考えていました。そして、私が思いついた解決策はやや面倒です:

 <Property Id="MY_PROPERTY">
      <RegistrySearch Root="HKLM" Key="SOFTWARE\MyProduct" Name="MyProperty" Type="raw" />
  </Property>

  <CustomAction Id="ca.SetDefaultValue" Property="MY_PROPERTY" Value="DefaultValue" />

  <InstallExecuteSequence>
      <Custom After="RegistrySearch" Action="ca.SetDefaultValue">Not MY_PROPERTY</Custom>
  </InstallExecuteSequence>

  <Component Id="c.Registry">
      <RegistryValue Root="HKLM" Key="SOFTWARE\MyProduct" Name="MyProperty" Type="string" Value="[MY_PROPERTY]" />
  </Component>

そのため、レジストリ検索を実行して古い値を見つけてください。設定されていない場合は、スケジュールされたカスタム アクションを使用してデフォルト値に設定します。次に、「いつものように」値を作成します。

これを行うためのよりスムーズな方法を考えられる人はいますか?

Installed以前の、現在アンインストールされているバージョンによって取り残された値がそこにある可能性があるため、便利な変数を使用できないことに注意してください。

4

2 に答える 2

8

Wix Remember Property パターンから始めますが、さらに一歩進んでください。実行後AppSearchREMEMBERMEプロパティが値を取得するか取得しない場合は、SetPropertyカスタム アクションを使用して既定値を割り当てますREMEMBERME=""

私はそれをさらに一歩進めます。私は「プロパティの優先順位」と呼ぶ概念を持っています。基本的に、プロパティがその値を取得する方法の優先順位のリストです。

最高から最低へ:

  1. UI 中に入力されたプロパティ
  2. コマンド ラインで渡されるパブリック プロパティ
  3. 中に見つかったプロパティAppSearch
  4. Property表に定義されているデフォルト値

つまり、コマンド ラインでプロパティを渡さない初回のサイレント インストールでは、プロパティ テーブルのデフォルト値を使用する必要があります。

コマンド ラインでプロパティが渡されない 2 回目のサイレント インストールでは、記憶された値がデフォルト値よりも優先されます。(違う場合)

1 回目または 2 回目のサイレント インストール中に、コマンド ラインで渡されたプロパティはオーバーライド値と見なされ、デフォルト値と記憶された値の両方よりも優先されます。

インタラクティブなインストール中に上記のルールが適用され、UI にその値が表示されます。ユーザーが値を変更すると、これが最終的な値になります。

これを行うためのさまざまなカスタム アクションを実装する方法については、あなたに任せます。一般に、temp prop と real prop、および一連の Set Property CA と、適切な実行スケジューリングと、実行したいことを実行するための条件が含まれます。

于 2012-07-08T16:53:50.077 に答える
1

keypath=yesコンポーネントのレジストリ値を明示的に設定していません。ただし、その場合、wix はキーパスとして使用できる最初の子アイテムを選択します。wix コンポーネント要素のドキュメントから:

KeyPath がコンポーネントまたは子のレジストリ値またはファイルに対して「yes」に設定されていない場合、WiX はコンポーネントの下の子要素を順番に調べ、そのうちの 1 つをキー パスとして自動的に選択しようとします。

したがって、レジストリ値は、それをインストールするコンポーネントのキーパスです。これは、レジストリ値が既に存在する場合、コンポーネントがインストールされないことを意味します。私が知る限り、それはあなたが望む動作です。

于 2012-07-08T21:59:04.860 に答える