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