2009-08-31 1 views
1

У меня есть проект установки в Visual Studio. В рамках обычной установки он создает/обновляет некоторые ключи и значения в реестре Windows. Как я могу сделать обновления обратимыми?Проект установки VS; Как восстановить значение реестра при удалении?

вы можете сказать: «они обратимы», но я так не думаю. Вот как я думаю, что это работает: попросите конструктора VS указать, какие ключи и значения реестра вы хотите. Эти ключи и значения записываются во время установки и удаляются во время удаления. Просто. Что не обратимо?

Проблема возникает при наличии существующего значения в одном из ключей, который записывается во время установки. Предположим, что он имеет значение 1. Затем с новой установкой он получает значение 100. После удаления он не имеет значения вообще - значение ушло.


Я попытался обойти это с помощью «пользовательских действий».

Во время установки, если пользователь подтверждает, msiexec записывает значения в реестр. Все, что раньше было в разделе реестра, исчезло. (Назовем это «Обновить А»)

Чтобы сохранить это значение, при установке есть настраиваемое действие, которое считывает и сохраняет параметр «раньше». Он работает до «Обновить A». Все идет нормально.

При удалении нормальный ход действий заключается в удалении обычных ключей реестра и значений, которые были добавлены во время установки. Это прекрасно работает. Назовите это «Обновить B».

Чтобы восстановить исходные значения реестра, у меня есть другое «настраиваемое действие». Это выполняется при удалении. Он успешно восстанавливает исходные значения в реестре. Реестр выглядит так же, как и до первоначальной установки. Я проверил, что это работает с использованием ProcMon (инструмент, который позволяет мне контролировать обновления реестра, между прочим). Назовите это «Обновить C».

Есть только одна проблема. При удалении обновление B происходит после Update C. Это означает, что после того, как пользовательское действие восстановит исходный параметр реестра, msi вычистит восстановленное значение, как это происходит со всеми другими обновлениями реестра.

В результате реестр имеет пустые значения вместо восстановленных.

Любая помощь? Как я могу повторно заказать обновления? Нужно ли мне Orca? Я действительно не хочу устанавливать и изучать другой инструмент, чтобы это произошло. Я также хочу, чтобы он был автоматическим. Определенно не хочу, чтобы визуально щелкнуть через редактор MSI, чтобы это произошло.


Могу ли я сделать это с событием после построения Javascript, который использует WindowsInstaller.Installer класс? Aaron Stebner published a script, который добавляет «Запуск приложения после установки?» диалог с MSI, созданный Visual Studio. Установщик Windows поддерживает возможность «запуска приложения», но он не отображается в конструкторах для VS2008/2005. Быстрый скрипт biolerplate, выполняемый как шаг после сборки в VS, добавлен в диалоговом окне «Запуск».

Возможно ли подобное с заказом пользовательских действий?

ответ

1

Некоторые ответы для меня:

  • Да, это возможно сделать это с шагом postbuild реализованного в JavaScript.
  • Да, я бы использовал класс WindowsInstaller.Installer.
  • да, косатка необходимо было понять все это

Orca ясно показывает пользовательское действие, которое предназначено для восстановления значений реестра запускается до встроенного в действии, которое удаляет значения реестра.

orca http://i31.tinypic.com/33vc02b.jpg

Так что я должен написать сценарий для изменения 1698 к 2620, и значения реестра должны получить восстановить должным образом.


Edit: не так быстро. Идея правильная, но это не так просто, как изменение порядкового номера. Проблема в том, что «сохраненное» значение реестра находится в дереве реестра, который удаляется деинсталлятором. Поэтому ни один заказ не работает. Если A является восстановлением, а B является удалением, A-B восстановит реестр только для того, чтобы восстановленное значение впоследствии было удалено. B-A сначала удалит значение, а затем A не будет иметь никакого значения для восстановления. Причина в том, что A (часть восстановления) сохраняет возвращаемое значение в дереве, которое должно быть удалено.

Таким образом, правильная операция должна быть чем-то вроде A -B-A, where A берет сохраненное значение, подлежащее восстановлению, и помещает его в место, которое не будет удалено B. Затем B удаляет ключи приложения и значения в реестре. A восстанавливает настройку, которая была отточена A`.

Чтобы сделать все это, я должен был сделать некоторую операцию в файле MSI, потому что дизайнер MSI ваниль в Visual Studio не позволяет устанавливать определенные порядковые номера. Вам нужно использовать Orca, который является графическим инструментом, или, в моем случае, я использовал COM-интерфейс для WindowsInstaller для автоматизации изменений с помощью javascript.