VS Setup Project; Как восстановить значение реестра при удалении? - PullRequest
1 голос
/ 31 августа 2009

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

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

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


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

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

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

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

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

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

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

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


Могу ли я сделать это с событием пост-сборки Javascript, которое использует класс WindowsInstaller.Installer ? Аарон Стебнер опубликовал скрипт , который добавляет «Запускать приложение после установки?» диалог с MSI, созданным Visual Studio. Установщик Windows поддерживает функцию «запуска приложения», но она не предоставляется разработчикам для VS2008 / 2005. Скрипт быстрой биопластины, запускаемый как шаг после сборки в VS, добавлен в диалог Launch.

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

1 Ответ

1 голос
/ 31 августа 2009

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

  • Да, это можно сделать с помощью шага пост-сборки, реализованного в Javascript.
  • да, я бы использовал класс WindowsInstaller.Installer.
  • Да, Орка был необходим, чтобы все это выяснить

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

orca

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


Редактировать : не так быстро. Идея верна, но это не так просто, как изменить порядковый номер. Проблема в том, что «сохраненное» значение реестра находится в дереве реестра, которое удаляется программой удаления. Поэтому ни один заказ не работает. Если 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.

...