InstallScript项目在升级时给出错误1706
我有一个在InstallShield 2010中从头开始编写的InstallScript项目。它包含三个本机InstallShield对象和四个包装MSM文件的InstallShield合并模块持有者对象。InstallScript项目在升级时给出错误1706
当我最初测试该项目时,它在干净的环境下安装得很好,但是当我尝试升级到较新的版本时,四个合并模块持有者对象中的每一个产生了“错误1706”。产品XXXX“消息。
我在网上做了一些挖掘,发现这是一个Windows安装程序错误,并且它发生的原因是MSI文件必须存在于计算机上,即使原始安装介质消失后也是如此。推荐的方法是勾选“合并模块持有者对象”属性对话框中的“在本地缓存msi包”复选框。
我勾选了所有四个合并模块的框并重新测试,但没有解决问题。然后我查看了这些合并模块实际上放在硬盘上的位置。属性对话框<DISK1TARGET>
,在运行时解析为C:\Program Files\InstallShield Installation Information\
{产品GUID}。看着测试机器,好像所有四个合并模块都写入了相同的地方,从而覆盖了彼此的MSI文件。
为了解决这个问题,我编辑了每个合并模块以将自己缓存到唯一路径,<DISK1TARGET>\
{Name}。我再次编译和测试,我可以看到每个合并模块现在确实将自己保存到唯一的子文件夹中。但是,所有四个错误1706消息是仍然我升级时出现。
有没有人有任何想法?我确信我错过了一些明显的东西,但它似乎没有被记录在任何地方。 :-)
UPDATE:
根据地段上的InstallShield论坛的帖子,看来的InstallShield生成每次构建的InstallScript项目时,每个嵌入MSI一个全新的产品GUID。在更新过程中,InstallShield引擎会用新版本覆盖缓存在目标机器上的每个MSI文件,但是当执行它们时,Windows Installer会说:“嘿,这是一款新产品,旧产品的MSI在哪里,以便我可以卸载它吗?“,因此错误。
是否可以告诉InstallShield不要为每个构建中的每个嵌入式MSI重新生成产品GUID?当然,这种行为会对嵌入合并模块到InstallScript项目的整个想法产生嘲弄吗? :-(
我用得到这个工作:
- 获得对应的MSM,我们已经有幸运的,这是有可能为所有这些独立MSI设置
- 包括MSI的作为安装组件。在安装InstallScript项目,安装到目标的适当临时位置。
- 在相关
<feature>_Installed
事件,掏出来msiexec.exe
和运行与/i
和/qb
开关MSI文件。 - 在相关的
<feature>_UnInstalling
事件中,输出到msiexec.exe
并使用/x
开关运行MSI文件。
这感觉有点“错误”,但它工作得很好,所以我很乐意把它留在那里,除非任何人有任何更好的想法。