获取延迟执行自定义操作的上下文信息

由于安装脚本可能会在写入安装脚本的安装会话之外执行,因此在安装脚本执行期间,该会话可能已不存在。 在这种情况下,在安装序列期间设置的原始会话句柄和属性不适用于延迟执行的自定义操作。 任何需要会话句柄的函数都被限制为少数几个可以检索上下文信息的方法,否则必须将脚本执行期间所需的属性写入安装脚本。 例如,调用动态链接库 (DLL) 的延迟自定义操作传递一个句柄,该句柄只能用于获取非常有限的信息量。 对于不需要会话句柄的函数,则可以通过延迟自定义操作访问。

延迟执行自定义操作限制为仅调用以下需要句柄的函数。

函数 说明
MsiGetProperty 延迟执行自定义操作一起使用时,支持有限的一组属性:CustomActionData 属性、ProductCode 属性和 UserSID 属性。提交自定义操作无法使用 MsiGetProperty 函数来获取 ProductCode 属性。 “提交自定义操作”可以使用 CustomActionData 属性来获取产品代码。
MsiFormatRecord 延迟执行自定义操作一起使用时,支持一组有限的属性:CustomActionData 和 ProductCode 属性。
MsiGetMode 延迟执行自定义操作提交自定义操作回滚自定义操作调用时,如果请求检查模式参数 MSIRUNMODE_SCHEDULED、MSIRUNMODE_COMMIT 或 MSIRUNMODE_ROLLBACK,则 MsiGetMode 将返回 True 或 False。 对于从延迟、提交或回滚自定义操作检查任何其他运行模式参数的请求,都将返回 False。
MsiGetLanguage 当前产品的数字语言 ID。提交自定义操作无法使用 MsiGetLanguage 函数。 “提交自定义操作”可以使用 CustomActionData 属性获取数字语言 ID。
MsiProcessMessage 处理来自自定义操作的错误或进度消息。

 

采用 JScript 或 VBScript 编写的自定义操作需要安装 Session 对象。 这属于“会话对象”类型,安装程序将其附加到名为“Session”的脚本。 由于 Session 对象在安装回滚期间可能不存在,因此在脚本中编写的延迟自定义操作必须使用 Session 对象的以下方法或属性之一来检索其上下文。

名称 说明
Mode 属性 仅对 MSIRUNMODE_SCHEDULED 返回 True。
Property 属性(Session 对象) 返回 CustomActionData 属性、ProductCode 属性或 UserSID 属性。
Language 属性(Session 对象) 返回安装会话的语言 ID(数字)。
Message 方法 调用此方法可处理错误和进度。
Installer 属性 返回父对象,该对象用于非会话功能,例如注册表访问和安装程序配置管理。

 

执行脚本时,在将安装序列处理为脚本时设置的属性值可能不可用。 脚本执行期间,自定义操作始终只能访问以下有限的属性集。

属性名称 说明
CustomActionData 在序列表中处理自定义操作时的值。 CustomActionData 属性仅适用于延迟执行自定义操作。 即时自定义操作无权访问此属性。
ProductCode 产品的唯一代码,GUID 字符串。
UserSID 由安装程序设置为用户的安全标识符 (SID)。

 

如果延迟执行自定义操作需要其他属性数据,则属性值必须存储在安装脚本中。 可以使用第二个自定义操作来实现。

将属性的值写入安装脚本,以便在延迟执行自定义操作期间使用

  1. 在安装序列中插入一个小型自定义操作,该操作将相关的属性设置为与延迟执行自定义操作同名的属性。 例如,如果延迟执行自定义操作的主键为“MyAction”,请将名为“MyAction”的属性设置为需要检索的属性 X。 在安装序列中,必须在“MyAction”自定义操作的前面设置“MyAction”属性。 尽管任何类型的自定义操作都可以设置上下文数据,但最简单的方法是使用属性分配自定义操作(例如自定义操作类型 51)。
  2. 处理安装序列时,安装程序会将属性 X 的值作为属性 CustomActionData 的值写入执行脚本中。

关于属性

使用属性

属性参考