handle "Другая версия этого продукта уже установлена. Установка этой версии не может быть продолжена..."
У меня есть 32-разрядная и 64-разрядная версии моего установщика, которые имеют (почти) точно такой же код и последовательность пользовательских действий (есть только незначительные различия, которые не имеют отношения к этой проблеме)
Я хочу, чтобы мой установщик обнаружил, был ли он уже установлен ранее, и в этом случае запустите мой собственный код вместо отображения ошибки установщика Windows по умолчанию:
Другая версия этого продукта уже установлена. Установка этой версии не может быть продолжена. Чтобы настроить или удалить существующую версию этого продукта, используйте "Установка и удаление программ" на панели управления.
Мой 32-разрядный установщик прекрасно работает в том смысле, что он запускает мой пользовательский код, если я запускаю установщик, когда продукт уже установлен, но тот же код и пользовательские действия в моем 64-разрядном установщике НЕ работают правильно и всегда показывают нежелательную ошибку сообщ.
CheckPreviousVersion - первая функция, вызываемая как пользовательское действие во время последовательности пользовательского интерфейса, я пробовал размещать ее в разных местах, например, после InstallValidate, но ничего не работает.
Я изучил подробный файл журнала, но не могу найти ничего, что могло бы объяснить это поведение, вот часть журнала:
=== Verbose logging started: 05/03/2013 16:27:20 Build type: SHIP UNICODE 5.00.7601.00 Calling process: C:\Windows\system32\msiexec.exe
===
MSI (c) (0C:94) [16:27:20:331]: Machine policy value 'Debug' is 0 MSI (c) (0C:94) [16:27:20:331]: ******* RunEngine:
******* Product: foo.msi
******* Action:
******* CommandLine: ********** MSI (c) (0C:94) [16:27:21:546]: Machine policy value 'DisableUserInstalls' is 0 MSI (c) (0C:94) [16:27:21:557]: SOFTWARE RESTRICTION POLICY: Verifying package --> 'C:\Builds\.msi' against software restriction policy MSI (c) (0C:94) [16:27:21:557]: Note: 1: 2262 2: DigitalSignature 3:
-2147287038 MSI (c) (0C:94) [16:27:21:557]: SOFTWARE RESTRICTION POLICY: C:\Builds\.msi is not digitally signed MSI (c) (0C:94) [16:27:21:558]: SOFTWARE RESTRICTION POLICY: C:\Builds.msi is permitted to run at the 'unrestricted' authorization level. MSI (c) (0C:94) [16:27:21:584]: Cloaking enabled. MSI (c) (0C:94) [16:27:21:584]: Attempting to enable all disabled privileges before calling Install on Server MSI (c) (0C:94) [16:27:21:586]: End dialog not enabled MSI (c) (0C:94) [16:27:21:586]: Original package ==> C:\Builds\....msi MSI (c) (0C:94) [16:27:21:586]: Package we're running from ==> C:\Builds\.....msi MSI (c) (0C:94) [16:27:21:589]: APPCOMPAT: Uninstall Flags override found. MSI (c) (0C:94) [16:27:21:589]: APPCOMPAT: Uninstall VersionNT override found. MSI (c) (0C:94) [16:27:21:589]: APPCOMPAT: Uninstall ServicePackLevel override found. MSI (c) (0C:94) [16:27:21:589]: APPCOMPAT: looking for appcompat database entry with ProductCode '{B8CBA92E-2140-48AB-B4EA-A4C3FF10295B}'. MSI (c) (0C:94) [16:27:21:589]: APPCOMPAT: no matching ProductCode found in database. MSI (c) (0C:94) [16:27:21:599]: MSCOREE not loaded loading copy from system32 MSI (c) (0C:94) [16:27:21:608]: Machine policy value 'DisablePatch' is 0 MSI (c) (0C:94) [16:27:21:608]: Machine policy value 'AllowLockdownPatch' is 0 MSI (c) (0C:94) [16:27:21:608]: Machine policy value 'DisableLUAPatching' is 0 MSI (c) (0C:94) [16:27:21:608]: Machine policy value 'DisableFlyWeightPatching' is 0 MSI (c) (0C:94) [16:27:21:609]: APPCOMPAT: looking for appcompat database entry with ProductCode '{}'. MSI (c) (0C:94) [16:27:21:609]: APPCOMPAT: no matching ProductCode found in database. MSI (c) (0C:94) [16:27:21:609]: Transforms are not secure. MSI (c) (0C:94) [16:27:21:609]: PROPERTY CHANGE: Adding MsiLogFileLocation property. Its value is 'C:\Builds\Angoss\Products\Workstation\single-exec\INSTALL64.LOG'. MSI (c) (0C:94) [16:27:21:609]: Command Line: CURRENTDIRECTORY=C:\Builds\Angoss\Products\Workstation\single-exec CLIENTUILEVEL=0 CLIENTPROCESSID=7948 MSI (c) (0C:94) [16:27:21:609]: PROPERTY CHANGE: Adding PackageCode property. Its value is '{}'. MSI (c) (0C:94) [16:27:21:609]: Product Code passed to Engine.Initialize: '' MSI (c) (0C:94) [16:27:21:609]: Product Code from property table before transforms: '{}' MSI (c) (0C:94) [16:27:21:609]: Product Code from property table after transforms: '{}' MSI (c) (0C:94) [16:27:21:609]: Product registered: entering maintenance mode MSI (c) (0C:94) [16:27:21:609]: Determined that existing product (either this product or the product being upgraded with a patch) is installed per-machine. MSI (c) (0C:94) [16:27:21:609]: PROPERTY CHANGE: Adding ProductState property. Its value is '5'. MSI (c) (0C:94) [16:27:21:609]: PROPERTY CHANGE: Adding ProductToBeRegistered property. Its value is '1'. MSI (c) (0C:94) [16:27:21:609]: Entering CMsiConfigurationManager::SetLastUsedSource. MSI (c) (0C:94) [16:27:21:609]: Specifed source is already in a list. MSI (c) (0C:94) [16:27:21:609]: User policy value 'SearchOrder' is 'nmu' MSI (c) (0C:94) [16:27:21:609]: Machine policy value 'DisableBrowse' is 0 MSI (c) (0C:94) [16:27:21:609]: Machine policy value 'AllowLockdownBrowse' is 0 MSI (c) (0C:94) [16:27:21:609]: Adding new sources is allowed. MSI (c) (0C:94) [16:27:21:609]: PROPERTY CHANGE: Adding PackagecodeChanging property. Its value is '1'. Another version of this product is already installed. Installation of this version cannot continue. To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel.
3 ответа
Это сообщение обычно появляется только на этапах разработки, а не на компьютере конечного пользователя. Это сообщение появляется потому, что вы изменяете только ресурсы из пакета и перестраиваете его, не увеличивая номер версии, поэтому установщик Windows видит, что на компьютере есть пакет с таким же кодом продукта и именем, но с другим кодом пакета.
Ваши пользователи никогда не получат это сообщение, потому что я предполагаю, что вы увеличите номер версии при выпуске пакета. Это также основано на названии вашей функции, т.е. "CheckPreviousVersion".
Если вы хотите, чтобы пользовательское сообщение отображалось, если вы нашли более старую версию на компьютере, убедитесь, что у вас сначала установлена старая версия, в настоящее время у вас установлена последняя версия, но используется другой ранее собранный пакет (т. Е. Другой код пакета).
Если вы используете установщик BasicMSI, вы можете создать системный поиск, который проверяет следующий раздел реестра:
HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ (Wow6432Node) \ Microsoft \ Windows \ CurrentVersion \ Uninstall \YOURPRODUCTCODE
Если этот ключ доступен, на компьютере устанавливается более старая версия вашей установки. Теперь создайте пользовательское действие, которое помещается перед "CheckPreviousVersion" для запуска вашего кода. Задайте условие для этого настраиваемого действия для свойства из системного поиска.
Это должно делать свое дело.
Чтобы позволить установщику MSI перезаписать предыдущую установку, вам нужно посмотреть.vdproj
файл и измените следующие два идентификатора GUID на несколько произвольных новых идентификаторов GUID:
"ProductCode" = "8:{69E7E393-81B8-4AE1-9984-8AC292C76D2C}"
"PackageCode" = "8:{2289A046-38E1-450C-8819-7D8BC08B5A21}"
Я использую сценарий powershell, чтобы сделать это автоматически в конвейере CI/CD, но это можно сделать и вручную.