我正在尝试从InstallShield迁移到Inno Setup。我有所有设置,但当用户可能从Inno Setup降级回InstallShield时,我遇到了一个案例。我需要InstallShield才能使安装失败,或者至少警告用户先手动卸载Inno安装版本(否则我会安装两个版本,事情会搞砸)。
我当然不能以任何方式更改现有的InstallShield安装程序,因为它们已经发布。解决方案必须来自Inno Setup。有什么想法可以做到这一点?我明白这可能是不可能的。
答案 0 :(得分:0)
库存InstallShield模板会自动将防止降级规则编写到MSI中。假设您的InnoSetup项目是使用与InstallShield项目相同的UpgradeCode创建的,这应该会自动生效。
如果您为新的InnoSetup项目提供了一个新的UpgradeCode GUID,并使用升级表中的旧GUI创建了删除旧产品类型规则,那么InstallShield可能做的事情确实不多。安装人员的性质......一旦发货,就会发货。
答案 1 :(得分:0)
我不认为这可以做到。 Inno Setup不使用Windows Installer,因此InstallShield甚至不知道您的产品已经安装。并且Inno Setup卸载程序无法知道InstallShield安装程序正在启动。
您可以做的最好的事情是让Inno Setup安装程序删除InstallShield安装并将其自身安装到另一个文件夹。因此,当您重新安装InstallShield安装时,它至少不会冲突/破坏Inno安装程序。如果需要,用户将能够正确卸载新的Inno安装程序。
答案 2 :(得分:0)
好的,我解决了。 (种)
有一个简单的技巧可以阻止InstallShield认为它已经安装,即使它不是。
首先,您需要使用您的UpgradeCode和ProductCode(它应该是UC的3个条目和PC的5个条目)找到所有注册表项,这些条目通常由InstallShield创建。另请注意,两个GUID都以反向形式存储在注册表中(前8个字符向后!!! - 休息我不确定,但可以用Google搜索)。
现在您需要让InnoSetup重新创建此注册表项。当InstallShield启动时,它会在注册表中查找现有版本,如果找到它,则会尝试使用原始安装程序的副本将其卸载 - 该副本的路径存储在注册表中
[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData \ S-1-5-18 \ Products {reverse guid of product code} \ InstallProperties]
" LocalPackage" =" C:\ Windows \ Installer \ [random string] .msi"
如果InstallShield找不到此文件,则会失败。您还可以创建自己的MSI文件,该文件将从InnoSetup调用uninstall.exe文件。