2009-04-02 5 views
14

Я хочу утверждать, что определенное значение реестра существует после установки, поэтому я добавил следующий компонент: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.

ответ

23

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

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

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

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

+0

Спасибо, это очень полезно. Позвольте мне проверить это :-) –

+1

+1 для комментария KeyPath! –