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