【问题标题】:Stop InstallShield installation when Inno Setup is detected检测到 Inno Setup 时停止 InstallShield 安装
【发布时间】:2023-03-22 11:27:01
【问题描述】:

我正在尝试从 InstallShield 迁移到 Inno Setup。我已经完成了所有设置,但是当用户可能从 Inno Setup 降级回 InstallShield 时,我遇到了一个问题。我需要 InstallShield 使安装失败,或者至少警告用户先手动卸载 Inno Setup 版本(否则我安装了两个版本,事情就搞砸了)。

我当然不能以任何方式更改现有的 InstallShield 安装程序,因为它们已经发布。解决方案必须来自 Inno Setup。任何想法如何做到这一点?我明白这可能是不可能的。

【问题讨论】:

    标签: inno-setup installshield


    【解决方案1】:

    好的,我解决了。 (有点)

    有一个简单的技巧可以让 InstallShield 认为它已经安装,即使它没有安装。

    首先,您需要使用通常由 InstallShield 创建的 UpgradeCode 和 ProductCode 找到所有注册表条目(对于 UC 应该是 3 个条目,对于 PC 应该是 5 个条目)。另请注意,两个 GUIDS 都以相反的形式存储在注册表中(前 8 个字符是向后的!!!-其余的我不确定,但可以用谷歌搜索)。

    现在您需要让 InnoSetup 重新创建此注册表项。当 InstallShield 启动时,它会在注册表中查找现有版本,如果找到,它会尝试使用原始安装程序的副本将其卸载 - 副本的路径存储在注册表中的

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products{产品代码的反向 guid}\InstallProperties]

    "LocalPackage"="C:\Windows\Installer\[随机字符串].msi"

    如果 InstallShield 找不到此文件,它将失败。您还可以创建自己的 MSI 文件,该文件将调用 InnoSetup 中的 uninstall.exe 文件。

    【讨论】:

    • 这是一件非常糟糕的事情,会导致 Windows Installer 服务损坏。这些注册表项归安装程序所有,您不应以这种方式操作它们。
    【解决方案2】:

    我不认为这是可以做到的。 Inno Setup 不使用 Windows Installer,因此 InstallShield 甚至不会知道您的产品已经安装。并且 Inno Setup 卸载程序无法知道 InstallShield 安装程序正在启动。

    您可以做的最好的事情是让 Inno Setup 安装程序删除 InstallShield 安装并将其自身安装到另一个文件夹。因此,当您重新安装 InstallShield 安装时,它至少不会冲突/破坏 Inno Setup 安装。如果需要,用户将能够正确卸载新的 Inno Setup 安装。

    【讨论】:

    • 疯狂的想法...有一个假的 MSI,它不会出现在具有旧 InstallShield 安装程序的 UpgradeCode 的添加/删除程序中。然后让 innosetup 静默安装并静默卸载它,只是作为旧 MSI 的阻止标记。那应该行得通。也就是说,这不是我会做的事情......
    • 1) 通过“静默卸载”,您的意思是“通过 Inno Setup 卸载程序卸载”? 2) 所以假的 MSI 看起来像是旧 MSI 的新版本?
    • 是的,就是这样。对特洛伊木马 MSI 的想法有点新的转折......
    • 我升级到 InnoSetup 没有问题...我正在检查注册表中是否有某些升级代码(您也可以运行可以在注册表中找到的卸载字符串来强制卸载当前的InstallShield)问题只是降级到原来的InstallShield
    • @Safiron 你对什么反应?对我的回答或@ChristopherPainter 的评论?我看不出两者有任何关系。
    【解决方案3】:

    库存的 InstallShield 模板会自动将防止降级规则编写到 MSI 中。假设您的 InnoSetup 项目是使用与 InstallShield 项目相同的 UpgradeCode 创建的,这应该会自动运行。

    如果您为您的新 InnoSetup 项目提供了一个新的 UpgradeCode GUID,并使用升级表中的旧 GUI 创建了一个删除旧产品类型规则,那么 InstallShield 确实无法做很多事情。这就是安装人员的本性……一旦发货,它就发货了。

    【讨论】:

    • Inno Setup 不使用 Windows Installer/MSI,因此任何 GUID 在这里都无关紧要。
    • 啊那样的话一切都丢失了。
    • 是的 InnoSetup 正在创建 .exe 并且不使用升级代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2020-04-21
    • 2017-06-27
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多