从自定义操作内部访问当前安装程序会话

调用动态链接库脚本的非延迟自定义操作可以访问正在运行的安装,以查询或修改当前安装会话的属性。 每个进程只能存在一个 Session 对象,并且自定义操作脚本不得尝试创建另一个会话。

自定义操作只能在数据库中添加、修改或删除临时行、列或表。 自定义操作无法修改数据库中的永久性数据,例如,作为存储在磁盘上的数据库的一部分的数据。

动态链接库

若要访问正在运行的安装,将向调用动态链接库 (DLL) 的自定义操作传递当前会话的类型 MSIHANDLE 的句柄作为在 CustomAction 表的 Target 列中命名的 DLL 入口点的唯一参数。 由于安装程序提供了此句柄,因此自定义操作不应将其关闭,例如,为了从安装程序接收句柄 hInstall,自定义操作函数的声明如下。

UINT __stdcall CustomAction(MSIHANDLE hInstall)

若要对当前数据库进行只读访问,请通过调用 MsiGetActiveDatabase 获取数据库句柄。 有关详细信息,请参阅获取数据库句柄

脚本

采用 VBScript 或 JScript 编写的自定义操作可以使用 Session 对象访问当前安装会话。 安装程序创建一个名为“Session”的 Session 对象,该对象引用当前安装。 若要对当前数据库进行只读访问,请使用 Session 对象的 Database 属性。

由于脚本是从 Session 对象的上下文运行的,因此并不总是需要完全限定属性和方法。 在以下示例中,在使用 VBScript 时,Me 引用可以替换 Session 对象,例如,以下三行是等效的。

Session.SetInstallLevel 1
Me.SetInstallLevel 1
SetInstallLevel 1

可执行文件

无法从调用使用命令行启动的可执行文件的自定义操作(例如自定义操作类型 2自定义操作类型 18)访问当前安装程序会话。

延迟执行自定义操作

无法从延迟执行自定义操作访问当前安装程序会话或所有属性数据。 有关详细信息,请参阅获取延迟执行自定义操作的上下文信息

从自定义操作内部访问数据库或会话