使用 MsiProcessMessage 向 Windows Installer 发送消息

使用 MsiProcessMessage 发送的消息与调用 MsiSetExternalUIINSTALLUI_HANDLER 回调函数接收的消息相同。 否则,Windows Installer 会处理消息。 有关详细信息,请参阅分析 Windows Installer 消息

例如,若要发送包含 MB_ICONWARNING 图标和 MB_ABORTRETRYCANCEL 按钮的 INSTALLMESSAGE_ERROR 消息:

PMSIHANDLE hInstall;
PMSIHANDLE hRec;
MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR|MB_ABORTRETRYIGNORE|MB_ICONWARNING), hRec);

其中,hInstall 是安装的句柄,提供给自定义操作或来自 MsiOpenProductMsiOpenPackage 的 hProduct 句柄,hRec 是包含要设置格式的错误信息的记录。 有关如何执行格式设置的信息,请参阅 MsiFormatRecord

默认情况下,如果发送未指定按钮类型或图标类型的 INSTALLMESSAGE_ERROR 或 INSTALLMESSAGE_FATALEXIT 消息,则使用 MB_OK、无图标和 MB_DEFBUTTON1。

Windows Installer 在显示包含 MB_ABORTRETRYIGNORE 按钮规范的 MessageBox 时,不会使用“中止”字符串标记“中止”按钮,而是使用“取消”字符串进行标记。 所有错误消息都会避免使用“中止”一词,而改用“取消”。

MsiProcessMessage 函数的 hRecord 参数取决于发送给 MsiProcessMessage 的消息类型。 下表详细列出了与消息类型相关的记录要求:

INSTALLMESSAGE_FATALEXIT

 

INSTALLMESSAGE_INFO

 

INSTALLMESSAGE_OUTOFDISKSPACE

字段 说明
0 用于设置结果字符串格式的模板。 有关详细信息,请参阅 MsiFormatRecord。 引用的记录字段使用 [1] 表示字段 1,使用 [2] 表示字段 2,以此类推。
1 到 n 所有后续字段都与字段 0 中的模板引用的字段直接相关。

 

如果字段 0 为 Null,则 UI 处理程序接收的字符串的格式为:1: [字段 1 的数据] 2: [字段 2 的数据],换句话说,对于记录的每个字段,其字符串包含字段编号,后跟存储在字段中的数据。

MsiEnableLog、“/l”命令行选项日志记录策略指定“I”或 INSTALLLOGMODE_INFO 时,系统将记录来自 MsiProcessMessage 的信息消息。

INSTALLMESSAGE_ERROR

 

INSTALLMESSAGE_WARNING

 

INSTALLMESSAGE_USER

使用 Error 表中的消息。

字段 说明
0 必须为 Null。
1 Error 表中的消息编号。
2 到 n 与 Error 表中的指定消息相关。

 

例如,

字段 类型 数据
0 string Null
1 int 1304
2 string Myfile.txt

 

从 UI 处理程序接收的结果消息为:

错误 1304。 写入 Myfile.txt 文件时出错。 请验证是否有权访问该目录。

如果字段 0 不为 Null,则系统会覆盖错误表中的消息, 改由字段 0 的模板来确定消息格式。

消息中还可以指定按钮,包括默认按钮,以及与上述消息一起使用的图标。 INSTALLUI_HANDLER 中列出了按钮和图标类型。

INSTALLMESSAGE_COMMONDATA

发送此消息可启用或禁用进度对话框中的“取消”按钮。

字段 说明
0 未使用。
1 2 代表“取消”按钮。
2 值为 1 表示“取消”按钮应可见。 值为 0 表示“取消”按钮应不可见。

 

例如,若要禁用或隐藏“取消”按钮,记录将如下所示。

字段 类型 数据
0 string Null
1 int 2
2 int 0

 

INSTALLMESSAGE_ACTIONSTART

 

INSTALLMESSAGE_ACTIONDATA

INSTALLMESSAGE_ACTIONSTART 记录可确定 ActionData 记录的格式。

字段 说明
0 Null
1 操作名称, 此字段中的名称必须为非 Null。
2 操作说明。
3 操作模板, 用于根据此模板设置消息格式的 ActionData。

 

请勿在操作模板消息中引用字段 0。

INSTALLMESSAGE_ACTIONDATA 记录的格式如下所示。

字段 说明
0 Null
1 到 n 依赖于 ActionText 表中指定的相应 INSTALLMESSAGE_ACTIONSTART 消息或模板的字段 3。

 

例如 INSTALLMESSAGE_ACTIONSTART 记录。

字段 类型 数据
0 string Null
1 字符串 MyAction
2 string 这是对“MyAction”的说明
3 string MyAction 模板:字段 1 数据为 [1]。 字段 2 数据为 [2]。

 

INSTALLMESSAGE_ACTIONSTART 的模板(字段 3)引用字段 1 和 2,INSTALLMESSAGE_ACTIONDATA 记录应具有 2 个包含保证数据的字段。 这些字段可以是字符串类型,也可以是整数类型。

INSTALLMESSAGE_ACTIONDATA 记录。

字段 类型 数据
0 string Null
1 int 2
2 string MyAction 的 ActionData

 

INSTALLMESSAGE_FILESINUSE

FILESINUSE 是长度可变的记录。

字段 说明
0 此字段可以为 Null。 对于使用基本 UI 的安装,此字段可以指定显示在 FilesInUse 对话框ListBox 控件中的静态文本。 对于使用完整 UI 的安装,此字段不起作用,因为文本在创作自定义 FilesInUse 对话框时指定。
1 正在使用的文件的名称。
2 此字段标识正在使用的文件所在的进程。Windows Installer 版本 4.0:进程的进程 ID (PID) 或进程的窗口标题。
Windows Installer 3.1 及更低版本:此字段必须是进程的进程 ID (PID)。

 

例如,为发送 FilesInUse 消息以显示两个正在使用的文件 red.exe 和 blue.exe,记录包含四个字段和 0 字段。 记录的格式如下表所示。 此示例需要使用 Windows Installer 4.0 版本。

Windows Installer 3.1 及更低版本:下例中的字段 2 和 4 必须包含正在使用的 red.exe 和 blue.exe 所在的进程的 PID。

字段 说明
0 Null
1 Red.exe
2 Red 窗口标题
3 Blue.exe
4 Blue 窗口标题

 

注意

在 Windows Installer 4.0 版本上,如果从服务传递的 PID 没有窗口标题(例如系统托盘应用程序),则不会显示该文件,且详细日志会包含以下消息。

 

File In Use: -<FileName>- Window could not be found. Process ID: <PID>
No window with title could be found for FilesInUse

INSTALLMESSAGE_RESOLVESOURCE

INSTALLMESSAGE_RESOLVESOURCE 记录包含七个字段。 为使 INSTALLMESSAGE_RESOLVESOURCE 正常工作,外部 UI 处理程序可能不会处理 INSTALLMESSAGE_RESOLVESOURCE 消息。 Windows Installer 必须处理 INSTALLMESSAGE_RESOLVESOURCE 消息。 也就是说,外部 UI 处理程序筛选 INSTALLMESSAGE_RESOLVESOURCE 消息时会返回 0,以指示“未执行任何操作”。 最佳做法是避免发送 RESOLVESOURCE 消息。

字段 说明
0 Null
1 null
2 包名称。
3 产品代码。
4 相对路径(如果已知)可以为 Null。
5 0
6 是否验证包代码。 值为“1”表示应验证包代码。 值为“0”表示不应验证包代码。
7 媒体表中的必需磁盘。 值为“0”表示任何磁盘均可。