Windows 安装程序 - 句柄"Another version of this product is already installed. Installation of this version



我有32位和64位版本的安装程序,它们(几乎)具有完全相同的代码&自定义操作顺序(只有与此问题无关的微小差异)

我想让我的安装程序检测它是否已经安装,在这种情况下运行我自己的代码,而不是显示默认的Windows安装程序错误:

已安装此产品的另一个版本。安装此版本无法继续。配置或删除现有的使用"控制面板"上的"添加/删除程序"。

我的32位安装程序工作得非常好,因为如果我在产品已经安装时运行安装程序,它会运行我的自定义代码,但相同的代码&我的64位安装程序中的自定义操作不能正常工作,并且总是显示不想要的错误消息。

CheckPreviousVersion是在UI序列中作为自定义动作调用的第一个函数,我试过把它放在不同的地方,比如在InstallValidate之后,但没有任何作用。

我已经检查了详细的日志文件,但我找不到任何可能解释这种行为的东西,这里是日志的一部分:

=== Verbose logging started: 05/03/2013  16:27:20  Build type: SHIP UNICODE 5.00.7601.00  Calling process: C:Windowssystem32msiexec.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:BuildsAngossProductsWorkstationsingle-execINSTALL64.LOG'. MSI (c) (0C:94) [16:27:21:609]: Command Line: CURRENTDIRECTORY=C:BuildsAngossProductsWorkstationsingle-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.

此消息通常只出现在开发阶段,而不是在最终用户机器上。出现此消息是因为您只修改了包中的资源并重新构建它,而不增加版本号,因此Windows安装程序看到机器上有一个具有相同产品代码和名称的包,但具有不同的包代码。

您的用户将永远不会得到此消息,因为我假设您将在发布包时增加版本号。这也是基于您的函数的名称,即。"CheckPreviousVersion"。

如果您希望在机器上发现旧版本时显示自定义消息,请确保您首先安装了旧版本,您当前安装的是最新版本,但使用的是另一个先前构建的包(即不同的包代码)

如果您使用的是BasicMSI安装程序,您可以创建一个系统搜索,检查以下注册表项:

HKEY_LOCAL_MACHINE 微软软件 (Wow6432Node) 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管道中自动执行此操作,但也可以手动完成。

相关内容

最新更新