我有一个从Scratch 2010中从头开始写的InstallScript项目。它包含包含三个本机安装对象和四个包装MSM文件的本机安装对象和四个安装置换对象。

当我最初测试该项目时,它在干净的环境上安装了正常,但是当我尝试升级到较新的版本时,四个合并模块持有人对象中的每一个都产生了“错误1706.没有找到有效的源XXXX”消息。 。

我在网上进行了一些挖掘,发现这是一个Windows安装程序错误,并且它发生了,因为即使在原始安装媒体消失后,MSI文件也必须在计算机上存在。推荐的方法是确保在“合并模块持有人对象属性对话框”中的“缓存MSI局部缓存本地缓存”复选框。

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

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

有人有任何想法吗?我敢肯定,我缺少一些明显的东西,但似乎在任何地方都没有记录下来。 :-)

更新:

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

是否可以告诉InstallShield不要在每个构建中重新生成每个嵌入式MSI的产品GUID?当然,这种行为会嘲笑整个想法,将合并模块嵌入到安装订阅项目中吗? :-(

有帮助吗?

解决方案

我通过:

  1. 获得与我们已经拥有的MSM相对应的独立MSI设置。幸运的是,所有人都有可能。
  2. 将MSI作为安装订阅项目中的可安装组件,安装到目标上合适的临时位置。
  3. 在相关 <feature>_Installed 事件,外壳去 msiexec.exe 并运行MSI文件 /i/qb 开关。
  4. 在相关 <feature>_UnInstalling 事件,外壳去 msiexec.exe 并运行MSI文件 /x 转变。

这感觉有点“错误”,但是效果很好,所以除非有人有更好的想法,否则我很乐意将其保留。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top