WiX: Как предотвратить удаление реестра при удалении?

Я хочу утверждать, что после установки существует определенное значение реестра, поэтому я добавил следующий компонент:

<Component Id="RegistryEntryContextMenuOdt" Guid="4BA5BA24-4F65-4BDF-99EB-CB4B947F31A9" DiskId="1" KeyPath="yes">
    <RegistryKey Id="RegKeyOdt" Root="HKCR" Action="create" Key=".odt">
      <RegistryValue Type="string" Value="openDocument.WriterDocument.1" />
    </RegistryKey>
</Component>

Ключ/значение уже может быть установлено перед установкой. Тем не менее, я хочу, чтобы значение было установлено на мое конкретное значение, то есть оно будет перезаписано моим значением.

Моя проблема в том, что это значение всегда удаляется, когда мой продукт удаляется. Однако я хочу, чтобы значение было удалено, если оно было добавлено моим установщиком. Если мой установщик только что изменил значение, предыдущее значение должно быть восстановлено (или, если это невозможно, мое значение должно оставаться нетронутым).

Обратите внимание: сам ключ не удаляется при удалении. Кажется, это работает правильно, потому что я указал Action="create" на элемент RegistryKey.

Возможно, существует аналогичная настройка для RegistryValue, которая создаст значение, но не удалит его при установке?

UPDATE: оба ключа реестра под HKCR являются параметрами машинного интерфейса, т.е. они происходят из ветки реестра HKLM\SOFTWARE\Classes.

Ответы

Ответ 1

Вы можете убедиться, что ваш компонент установлен только в том случае, если запись реестра не существует, используя атрибут NeverOverwrite элемента Component. Из документации wix для NeverOverwrite:

Если для этого атрибута установлено значение "да", установщик не устанавливает или переустановите компонент, если ключевой путь файла или записи реестра ключевого пути для компонент уже существует.

Вам также может потребоваться установить атрибут KeyPath в Registry в yes, чтобы сделать его однозначным, чтобы реестр entry - путь к компоненту.

Если вы хотите установить значение реестра, даже если оно уже существует, но вы не хотите удалять его при удалении, вы можете вместо этого использовать атрибут Permanent компонента Component.