4

私は現在、ユーザー定義のレジストリ キーを大量に持つソフトウェアを保守しています。私は、最小限の保守性でこれらのレジストリ キーを保持する WIX インストーラを作成しようとしています。WIX の NeverOverwrite='yes' 機能を使用できるように、レジストリ キー内の各値を独自のコンポーネントにすることにしました。これが存在すると、マイナー アップグレード (例: REINSTALL=ALL REINSTALLMODE=vomus) で値が作成され、存在しない場合はそのままにしておくことができると想定しました。ただし、これは私の実際の例では発生していないようです (機能に条件はありません)。ドキュメントは、私が良いはずだと言っています。以下にいくつかのサンプルを示します。

<Product Id="UNIQUE_KEY" Name="Spotbox Manager" Language="1033" Version="1.0.1.0"    Manufacturer="Company"  UpgradeCode="MY_UPGRADE_KEY">
<Package  Platform="x64" Id="*" InstallerVersion="200" Compressed="yes"    InstallScope="perMachine" InstallPrivileges="elevated" />
<Upgrade Id="MY_UPGRADE_KEY">
  <UpgradeVersion OnlyDetect='yes' Property='SELFFOUND'
    Minimum='1.0.1' IncludeMinimum='yes'
    Maximum='1.0.1' IncludeMaximum='yes' />
  <UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND'
    Minimum='1.0.1' IncludeMinimum='no' />
</Upgrade>

これは、レジストリ キーの実際のフラグメントです。

<Component Id="cmp171812fcc51a4b91ad386fa8c27c9b89" Directory="TARGETDIR" Guid="COMPONENT_GUID"  Win64='yes' NeverOverwrite='yes'>
  <RegistryKey Key="SOFTWARE\Company" Root="HKLM">
    <RegistryValue Name="Value" Value="1100797834" Type="integer" KeyPath='yes'/>
  </RegistryKey>
</Component>
<Component Id="cmp211639bff9694f029028a22cb0bb9687" Directory="TARGETDIR" Guid="NEW COMPONENT GUID"  Win64='yes' NeverOverwrite='yes'>
  <RegistryKey Key="SOFTWARE\Company" Root="HKLM">
    <RegistryValue Name="Country Code" Value="1" Type="integer" KeyPath='yes' />
  </RegistryKey>
</Component> ...

注: キーは両方の値で同じです。これを変更しようとすると、ユーザーの値が吹き飛ばされるようです。

4

2 に答える 2

1

まず、同じレジストリ キーの下に複数の値があり、それらを個別のキーパスとして使用しても問題はありません。「キーパス」という用語は、レジストリの用語とは関係がなく、レジストリの場合、実際にはキーではなく値を識別する必要があります。

第二に、あなたのコメントは、マイナー アップグレード中に製品のアンインストールが行われないことに言及しています。これは製品レベルでは正しいですが、コンポーネント レベルでは正しくありません。

製品の古いバージョンと新しいバージョンの間で、問題のあるコンポーネントの GUID またはキーパスを変更していないことを確認する必要があります。変更した場合は、マイナー アップグレード (コンポーネントの削除) の規則に明らかに違反しています。ただし、GUID が安定している場合でも読み進めてください。より一般的な説明があります。

マイナーアップデートは再インストールです。私は次の順序でイベントを想像しています。

  1. (CostFinalize) Windows インストーラーは、キーパスごとに同じコンポーネントが既にインストールされていること (ユーザーによって書き換えまたは削除されていないこと) をチェックするため、インストールする必要はありません。NeverOverwrite有効になっているとおり)。
  2. (InstallExecute) Windows インストーラーは、古い MSI からコンポーネントをアンインストールします。これは、コンポーネントが新しい MSI に置き換えられるためです (マイナー アップデート ルールによって保証されています)。古いPermanentパッケージで無効になっているように。
  3. (InstallExecute) Windows インストーラーは、手順 1 のチェックを記憶しており、同じキーパスを持つ別のコンポーネントのインストールを気にしません。

少なくともこれらの修正オプションがあります。1 つ選択してください。

  • メジャー アップグレードに進みます。ほとんどの場合、これがより簡単で適切な選択です。
  • すべてのリリースで有効にできると仮定して、Permanentに加えて有効にします。NeverOverwrite基本的に、あなたはまだ決定的なものをリリースしていません。ほとんどの人はこれらの属性を同期させているので、群集に従って問題を減らしてみませんか。
  • アクションの順序を台無しにします。例:

    <RemoveExistingProducts After="InstallValidate"/>

NeverOverwriteこの最後のオプションを使用すると、アップグレードが遅くなりますが、本当にマイナー アップグレードが必要で、 を使用せずに利用する場合は、おそらくこれが必要ですPermanent

于 2013-03-23T21:50:26.417 に答える
0

レジストリに非常に多くの値があったため、コンポーネント要素 (古い構成) のない類似した別のセクションに気付かなかったユーザーエラーであるという問題が見つかりました。削除した後、すべてが期待どおりに機能しました。助けてくれてありがとう。

于 2013-03-25T17:29:00.197 に答える