代码之家  ›  专栏  ›  技术社区  ›  Christian Hayter

升级时出现错误1706的InstallScript项目

  •  1
  • Christian Hayter  · 技术社区  · 14 年前

    我在InstallShield 2010中有一个从头开始编写的InstallScript项目。它包含三个本机InstallShield对象和四个包含MSM文件的InstallShield合并模块持有者对象。

    当我最初测试这个项目时,它在一个干净的环境中安装得很好,但是当我尝试升级到一个新版本时,四个合并模块持有者对象中的每一个都产生了一个“错误1706”。找不到产品XXXX“消息的有效源。

    我在网上做了一些挖掘,发现这是一个Windows安装程序错误,它发生的原因是即使在原始安装媒体消失后,计算机上也必须存在msi文件。建议的方法是在合并模块持有者对象属性对话框中勾选“本地缓存MSI包”复选框。

    我勾选了所有四个合并模块的复选框并重新测试,但这并没有解决问题。然后我查看了这些合并模块实际上放在硬盘上的位置。属性对话框说 <DISK1TARGET> ,其解析为 C:\Program Files\InstallShield Installation Information\ {产品GUID} 在运行时。看着测试机,似乎所有四个合并模块都在同一个位置写入,从而覆盖了彼此的msi文件。

    为了解决这个问题,我编辑了每个合并模块,将其自身缓存到一个唯一的路径, <DISK1TARGET>\ {No.} . 我再次编译和测试,我可以看到每个合并模块现在确实将自己保存到一个唯一的子文件夹中。但是,所有四条错误1706消息都是 仍然 升级时出现。

    有人有什么想法吗?我确信我遗漏了一些明显的东西,但它似乎没有被记录在案。-)

    更新:

    根据InstallShield论坛上的许多帖子,似乎InstallShield每次构建InstallScript项目时都会为每个嵌入的MSI生成一个全新的产品GUID。在更新过程中,InstallShield引擎会用新版本覆盖目标计算机上缓存的每个msi文件,但在执行这些文件时,Windows Installer会说:“嘿,这是一个新产品,旧产品的msi在哪里,以便我可以卸载它?”因此出现了错误。

    是否可以告诉InstallShield不要为每个构建中的每个嵌入的MSI重新生成产品GUID?当然,这种行为会嘲弄将合并模块嵌入InstallScript项目的整个想法吗?:

    1 回复  |  直到 14 年前
        1
  •  0
  •   Christian Hayter    14 年前

    我的工作是:

    1. 获取与我们已经拥有的MSM相对应的独立MSI设置。幸运的是,这对所有人都是可能的。
    2. 将MSI作为可安装组件包括在InstallScript项目中,安装到目标上合适的临时位置。
    3. 在相关 <feature>_Installed 事件,退出到 msiexec.exe 并使用 /i /qb 开关。
    4. 在相关 <feature>_UnInstalling 事件,退出到 文件名 并使用 /x 开关。

    这感觉有点“错误”,但效果很好,所以我很乐意就此放弃,除非有人有更好的想法。

    推荐文章