0

重大升级会自动卸载现有版本并安装当前版本。

不幸的是,主要升级仅适用于以下项目类型: - 基本 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 自定义操作在不同用户的上下文中运行,因此将文件存储在临时目录中并稍后检索它可能不会

在某些场景下工作。


4

1 回答 1

0

随着我对您的情况的了解更多,我将跟进并改进此答案。这将是非常普遍的:

可靠的静音运行:可靠的静音运行可能是 MSI 的最大优势。这可能是较旧的基于脚本的技术最显着的改进。

响应文件:自从我查看 Installscript 设置(非 MSI)以来已经有很长时间了,但基本上它们需要静默响应文件 IS 帮助)才能在静默模式下正常运行(基本上是每个用户选择的记录列表setup 对话框),并且它们并不总是可靠的(例如,机器上的特殊情况会触发一个对话框,当您记录响应文件时,该对话框未记录在原始运行中)。您应该为安装程序的安装和卸载记录一个静默响应文件(它们会有所不同 - 有些人尝试使用安装响应文件进行卸载 - 这是行不通的)。

建议:我对你的整体情况感到困惑。您似乎根本没有使用 MSI,但想要主要的升级功能?基本的 MSI 项目可以包含任意数量的 Installscript 自定义操作 - 没有问题。你失去的,在我的脑海中,是 Installscript MSI(和较旧的 Installscript 项目)和 Installscript 设置中的 Win32 对话框中可用的许多事件。基本 MSI 是一种更好的项目类型,因为它是标准 MSI,并且比 Installscript MSI 的错误少得多。

通过插入引用导出的 Installscript 函数的自定义操作,可以从基本 MSI 脚本调用 Installscript。只需将新的 setup.rul 文件添加到您的安装项目,然后从自定义操作中导出您要调用的函数:

export prototype MyFunction(HWND);<= 现在可以从自定义操作中调用此函数。

setup.rul文件中有解释整个过程的注释。只需创建一个空白的 Basic MSI 项目,然后插入一个新Setup.rul文件来研究它。

于 2018-04-24T01:28:43.080 回答