【发布时间】:2018-04-23 23:42:43
【问题描述】:
重大升级会自动卸载现有版本并安装当前版本。
很遗憾,主要升级仅适用于以下项目类型: - 基本微星 - 安装脚本 MSI - 微星数据库 - 变换
它不适用于“InstallScript”项目类型。我们如何才能实现主要升级在“InstallScript”项目类型中提供的功能。 我们希望在继续当前安装之前自动卸载现有版本。
我尝试使用 UninstallApplication InstallScript 函数以及从 InstallScript 代码调用 msiexec 以在继续安装之前手动卸载,但这两种方法会显示两个对话框。一个是确认删除产品,另一个是在完成删除后单击“完成”按钮退出卸载。
我们想要主要升级提供的不弹出对话框的功能。
我们无法使用“InstallScript MSI”项目类型,因为我们遇到了这种项目类型的一些问题。
此外,我们不希望将现有的“InstallSript MSI”项目转换为“Basic MSI”,因为我们希望重用我们拥有的安装脚本,而转换为“InstallScript”项目类型将允许我们这样做。
感谢斯坦因的回复。
对于基本 MSI,我在 InstallShield 中看到了以下文档。不能使用一些全局变量来保存信息似乎是一个缺点。目前我们有“InstallScript MSI”项目,我们有安装脚本,它使用全局变量维护信息。例如,我们可能会查找和存储某些内容,并基于该动态更改对话框中的复选框等。 我们还会查找并存储稍后在 installscript 函数在不同阶段执行时使用的信息。但似乎在“基本 MSI”中,每个调用 InstallScript 函数的自定义操作都是独立的,因为它发现和设置的内容不能被另一个自定义操作调用另一个 InstallScript 函数使用。有什么想法吗?
基本 MSI:
在各个 InstallScript 自定义操作调用之间不再维护全局变量和指针。另外,每个InstallScript
自定义操作初始化并使用其自己的单独 SUPPORTDIR。因此,您不能使用文件在各个呼叫之间共享信息
在支持目录中。有关详细信息,请参阅全局变量、全局指针和 SUPPORTDIR。
全局变量、全局指针和 SUPPORTDIR
对于 InstallShield 12 及更高版本,当基本 MSI 安装执行 InstallScript 自定义操作时,会加载已编译的 InstallScript
在调用动作之前,在动作完成后卸载。因此,每个 InstallScript 自定义操作都以自己的方式执行
具有完整 InstallScript 引擎加载和卸载的会话。此行为与 InstallShield 11.5 及更早版本不同:
编译的 InstallScript 在 InstallScript 使用的第一个 InstallScript 自定义操作执行之前加载一次,并且它
在完成所有 InstallScript 自定义操作后在安装结束时卸载。
这种行为变化的一个主要含义是全局变量和指针不再在个体之间维护
InstallScript 自定义操作调用:
• 如果您需要跨多个自定义操作调用存储一个值,则必须使用一些外部机制,例如注册表、Windows
安装程序属性,或用于存储调用之间信息的外部数据文件。如果您选择在
中使用 Windows Installer 属性延迟、提交或回滚 InstallScript 自定义操作,请参阅 Windows Installer 属性和延迟、提交和
中的指南回滚 InstallScript 自定义操作。 • 如果您需要在自定义操作调用中使用 COM 对象或其他一些全局对象,则必须为每个对象初始化对象
单独的自定义操作调用,以使对象有效。 此更改的另一个含义是每个自定义操作都会初始化并使用自己的单独 SUPPORTDIR。因此,你不能分享
使用 SUPPORTDIR 中的文件跨单个调用的信息,因为每个自定义操作调用都将具有自己唯一的 SUPPORTDIR。你
可以使用 FOLDER_TEMP 或其他文件位置共享信息。
请注意,FOLDER_TEMP 可能不是所有 InstallScript 自定义操作的相同路径。如果您有一些 InstallScript 自定义操作
在系统上下文中运行和一些不在系统上下文中运行,如果包在提升状态下运行,它们将具有不同的临时路径。
InstallScript 自定义操作在不同用户的上下文中运行,因此将文件存储在临时目录中并稍后检索它可能不会
在某些情况下工作。
【问题讨论】:
标签: windows-installer installshield installscript major-upgrade