Как определить папку, в которой предыдущая установка WIX установила программу - PullRequest
1 голос
/ 12 сентября 2011

Существующий установщик для нашего продукта не записывает никакой информации в реестр и не записывает никаких пользовательских переменных среды.Пользователь может изменить каталог установки в пользовательском интерфейсе установщика.Когда я делаю обновление, как мне узнать, в какую папку была установлена ​​предыдущая версия?

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

Тони

Ответы [ 3 ]

3 голосов
/ 13 сентября 2011

MSI не имеет этой информации напрямую.(Пакеты MSI могут иметь несколько «корневых» каталогов, поэтому неизвестно, какой каталог может понадобиться разработчику.) Если у вас есть каталог в реестре, используйте RegistrySearch .В противном случае вы можете использовать MsiGetComponentPath в настраиваемом действии.

1 голос
/ 13 сентября 2011

Я провел некоторые исследования в этой области, и вот решение, которое я нашел:

Когда программа установки завершает установку, она создает узел в реестре по пути

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<Product ID>

для 32-битной установки в 32-битной ОС или 64-битной установки в 64-битной ОС, или

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\<Product ID>

для 32-битной установки в 64-битной ОС.

Этот узел содержит значение, называемоеInstallLocation, который дает вам путь к месту установки исполняемых файлов.

К сожалению, предыдущая версия нашего установщика не установила это свойство, поэтому я не могу его использовать.НО наш установщик создает Сервис.Я нашел путь к узлу в реестре для этой службы.Оттуда я могу извлечь значение значения ImagePath и извлечь путь из имени файла .EXE службы.

Поэтому мое решение заключается в следующем:

  1. Исправьте новый установщик так,он устанавливает значение InstallLocation.
  2. При обновлении только с предыдущей версии он извлекает узел реестра для службы и использует ключ службы ImagePath службы.
  3. При обновлении с любой более поздней версии,мы получим узел удаления и используем ключ InstallLocation.

Tony

0 голосов
/ 12 сентября 2011

msiexec хранит копию msi из последней установки, поэтому он будет обрабатывать удаление предыдущей версии, вам нужно будет просто включить раздел InstallExecuteSequence

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallValidate" />
</InstallExecuteSequence>

Это будет работать, только если вы используете тот же атрибут UpgradeCode в вашем элементе продукта.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...