2015-09-04 99 views
0

我试图使用InstallShield对我们的产品进行主要升级。只要用户没有选择将其安装到自定义位置,它就可以正常工作。如果他们这样做了,我可以找到我创建的用于备份和恢复用户设置(.Net配置文件条目)的代码,因为自定义操作正在查找默认位置。它不知道原始安装的位置。卸载程序能够从该安装中发现INSTALLDIR并将其卸载。 FindRelatedProducts显示:查找以前安装的版本的INSTALLDIR

FindRelatedProducts: Found application: {E881D894-B624-4B8B-8A02-36E2425E3928} 

但是,我找不到任何地方的关键比专有的注册表位置下的其他,那里是没有什么用处:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\InstallShield Uninstall Information\{E881D894-B624-4B8B-8A02-36E2425E3928} 

E881D...是安装我的产品代码正在升级。我无法在任何地方找到升级代码,按照该顺序或使用MS编码/打包格式。

在我看来,似乎能够找到您正在升级的软件包的安装位置应该是一个非常基本的功能,因为人们会期望在升级应用程序时用户可能希望将它放回到同一个地方。显然,这些信息在某处可用,因为ARP和升级安装程序能够成功删除该应用程序。

此外,是否有任何方法来在主要升级期间从原始安装访问SecureCustomProperties的值?我很确定我知道答案...

回答

0

您可以使用组件搜索。找到安装在该INSTALLDIR位置(主应用程序文件夹,我假设)中的文件的组件guid并使用它。在InstallShield中,我认为这是一个系统搜索。它将返回该组件安装位置的路径,并且它要求文件成为该组件的关键路径。

为了将来的参考,您至少可以通过两种方式为此做好准备。

  1. 如果INSTALLDIR是位置,只在你选择的位置的注册表项(使用标准IDE),并给它的价值[INSTALLDIR],这将解决实际位置,当产品写入注册表。

  2. 另一个有用的提示是将类型51的自定义操作设置为ARPINSTALLLOCATION,并将值设置为[INSTALLDIR],并且我不确定那个InstallShield接口,但它不需要代码。这导致安装位置在卸载注册表项中,但基本上是一个实现细节。给定ProductCode和INSTALLPROPERTY_INSTALLLOCATION的API MsiGetProductInfo(及其等价物)将返回该主应用程序文件夹位置。

+0

谢谢。我喜欢ARP解决方案,即使它是,恕我直言,过分令人费解。对于安装者而言,我从来没有想到,这种基本的功能不会由MSI自动完成。我不期望它在IS中是我20多年来使用的最大的POS软件。这就是使用Lotus Notes的原因。)我很遗憾没有从一开始就学习WiX的“热门”。我现在当然不得不采取组件搜索的方法,但我会为将来修复这个安装程序。 –

+0

所以我需要部分收回我以前的评论。看起来InstallShield _does_实际上具有设置ARPINSTALLLOCATION的自定义动作类型51。我通过尝试添加自己的名为SetARPINSTALLLOCATION的工具发现了这一事实,恰巧它恰好与我们选择的名称相同。因为它不像他们记录它或任何东西(继续搜索“InstallShield APRINSTALLLOCATION”)。或者提供了一个使用它的方法。典型的半分析IS实现。 –

相关问题