0

我们有一个问题,即从旧版软件升级时 InstallShield .MSI 未创建注册表值。旧版软件创建了一个HKLM\\Software\Company\Appname带有几个值的键。在现代软件中,我们希望为Path同一个键添加一个新值(但保留旧值)。似乎如果密钥本身已经存在,安装程序不会努力创建新值。InstallShield 中公开的唯一选项围绕“如果密钥不存在则创建密钥”以及卸载行为的不同选项。似乎没有办法说“即使密钥已经存在也创建这个值”。

即使密钥已经存在,是否有人知道创建注册表值条目的方法?我不介意 InstallScript 解决方案,但我想卸载它以将其删除。

4

2 回答 2

0

您需要为新的注册表值创建单独的组件,然后一切都应该没问题。可能您尝试将注册表项(在 InstallShield 中)添加到当前注册表组件,但是当安装程序更新它时,会看到该组件已安装并且不对其执行任何操作。

于 2013-04-16T10:41:38.923 回答
0

经过进一步研究,一件有趣的事情实际上正在发生。从 MSI 日志中,我们确定它在安装过程中进行了WriteRegistryValues操作,然后在安装RemoveRegistryValues结束时进行了操作。事实证明,这是因为RemoveExistingProducts行动接近尾声,就在安装完成之前。相反,我将该动作移至靠近顶部、中间InstallValidateInstallInitialize动作的位置。这首先进行了旧版卸载,然后安装了正确的注册表设置。我猜是旧版卸载程序要求删除整个密钥。

对于遇到此问题的其他人,此解决方案有一些缺点。这意味着任何声明为旧产品代码的内容都将被删除,这可能会导致覆盖某些设置并重新编写文件。但是,对我们来说,这个缺点比不存在正确状态的注册表的替代方案要好。

我很抱歉在查看日志之前提出问题,但我希望其他人可以从这个解决方案中受益。

于 2013-04-16T19:51:09.743 回答