InstallShield InstallScript项目类型

时间:2018-04-23 23:42:43

标签: windows-installer installshield installscript major-upgrade

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

不幸的是,主要升级仅适用于以下项目类型: - 基本MSI - InstallScript MSI - MSI数据库 - 转换

它不适用于' InstallScript'项目类型。我们如何才能在“安装脚本”中实现重大升级所提供的功能。项目类型。 我们希望在继续当前安装之前基本上自动卸载现有版本。

我尝试使用UninstallApplication InstallScript函数以及从InstallScript代码调用msiexec以手动卸载,然后继续安装,但这两种方法提供了两个对话框。一个用于确认删除产品,另一个用于删除,只需单击“完成”按钮退出卸载。

我们想要主要升级提供什么,而不是弹出对话框。

我们无法使用' InstallScript MSI'项目类型,因为我们遇到了这个项目类型的一些问题。

此外,我们不希望转换现有的' InstallSript MSI'项目到'基本MSI'因为我们想要重复使用我们拥有的安装脚本并转换为“安装脚本”。项目类型将允许我们这样做。

感谢您回答Stein。

对于Basic MSI,我在下面看到了InstallShield的文档。它似乎是一个缺点,不能使用一些全局变量来保存信息。目前我们拥有的“InstallScript MSI'项目,我们有安装脚本,使用全局变量维护信息。例如,我们可以查找和存储某些内容,并根据对话框中的动态更改复选框等。 我们还查找并存储稍后在不同阶段执行installscript函数时使用的信息。但似乎与基本MSI'调用InstallScript函数的每个自定义Action都是独立的,因为它发现和设置的内容不能被另一个自定义Action调用到另一个InstallScript函数。有什么想法吗?

基本MSI:

不再在各个InstallScript自定义操作调用之间维护全局变量和指针。另外,每个InstallScript

自定义操作初始化并使用自己的SUPPORTDIR。因此,您无法使用文件

在各个呼叫之间共享信息

在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自定义操作在其他用户的上下文中运行,因此将文件存储在临时目录中并在以后检索它可能不会

在某些情况下工作。

2 个答案:

答案 0 :(得分:0)

随着我对您的情景的更多了解,我会跟进并发展这个答案。这将非常笼统:

可靠无声运行 :可靠的静音运行可能是MSI最强大的优势。这可能是旧的基于脚本的技术的最重要改进。

响应文件 :自从我查看Installscript设置(非MSI)以来已经很久了,但基本上他们需要silent response files({{3在无声模式下正常运行(本质上是用户选择在每个设置对话框中的记录列表),并且它们并不总是可靠的(假设机器上的特殊条件触发了未记录在原始对话框中的对话框)在您录制响应文件时运行)。您应该为安装程序的安装和卸载记录静默响应文件(它们会有所不同 - 有些人尝试使用安装响应文件进行卸载 - 这不起作用)。

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

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

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

setup.rul文件中有注释说明了整个过程。只需创建一个空白的基本MSI项目,然后插入一个新的Setup.rul文件进行研究。

答案 1 :(得分:0)

Stein,您似乎在说主要升级是针对MSI的,因此预计“InstallScript”项目将无法使用。

在这种情况下,我可以询问是否有其他可以在'InstallScript'项目类型中使用的东西,这将允许我们实现主要升级提供的,即在继续安装当前版本之前自动卸载现有版本版本?