首页 文章

InstallShield InstallScript项目类型中不提供主要升级选项

提问于
浏览
0

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

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

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

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

我们想要主要升级提供的内容,而不是突然出现的对话框 .

我们无法使用“InstallScript MSI”项目类型,因为我们遇到了此项目类型的一些问题 .

此外,我们不希望将现有的“InstallSript MSI”项目转换为“基本MSI”,因为我们希望重用我们的安装脚本并转换为“InstallScript”项目类型将允许我们这样做 .


谢谢你的回应斯坦 .

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

    随着我对您的场景的更多了解,我会跟进并发展这个答案 . 这将是非常一般的:

    Reliable Silent Running :可靠的沉默跑步可能是MSI最强的优势 . 这可能是旧的基于脚本的技术的最重要的改进 .

    Response Files :自从我查看Installscript设置(非MSI)以来已经很久了,但基本上他们需要silent response filesIS help)才能在静默模式下正常运行(本质上是每个设置对话框中用户选择的记录列表),并且它们并不总是可靠的(例如,当您记录响应文件时,机器上的特殊条件会触发未在原始运行中记录的对话框) . 您应该为安装's installation and its uninstallation (they will be different - some people try to use the install response file for the uninstall - that doesn' t work记录静默响应文件 .

    Advice :我对你的整体情况感到困惑 . 你似乎根本没有使用MSI,但想要主要的升级功能? Basic MSI projects can contain any number of Installscript custom actions - without problems . 你失去的是我的头脑中的许多事件,这些事件可以在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 文件来研究它 .

  • 0

    Stein,似乎你说主要升级是MSI特定的,因此预计'InstallScript'项目将不具备可用性 .

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

相关问题