MsiFormatRecordA 函数 (msiquery.h)

MsiFormatRecord 函数使用格式字符串设置记录字段数据和属性的格式。

语法

UINT MsiFormatRecordA(
  [in]      MSIHANDLE hInstall,
  [in]      MSIHANDLE hRecord,
  [out]     LPSTR     szResultBuf,
  [in, out] LPDWORD   pcchResultBuf
);

参数

[in] hInstall

安装句柄。 这可以省略,在这种情况下,仅处理记录字段参数,并且属性不可用于替换。

[in] hRecord

要设置格式的记录句柄。 模板字符串必须存储在记录字段 0 中,后跟引用的数据参数。

[out] szResultBuf

指向接收 null 终止格式字符串的缓冲区的指针。 不要尝试通过传入 szResultBuf的 null(value=0)来确定缓冲区的大小。 可以通过传入空字符串来获取缓冲区的大小(例如“)。 然后,该函数返回 ERROR_MORE_DATApcchResultBuf 包含 TCHARs 中所需的缓冲区大小,不包括终止 null 字符。 返回 ERROR_SUCCESS时,pcchResultBuf 包含写入缓冲区的 TCHAR数,不包括终止 null 字符。

[in, out] pcchResultBuf

指向变量的指针,该变量指定变量 TCHARs 所指向的缓冲区的大小,szResultBuf。 函数返回 ERROR_SUCCESS时,此变量包含复制到 szResultBuf的数据的大小,不包括终止 null 字符。 如果 szResultBuf 不够大,则该函数将返回 ERROR_MORE_DATA 并存储所需的大小(不包括终止 null 字符)pcchResultBuf指向的变量中。

返回值

MsiFormatRecord 函数返回以下值之一:

言论

MsiFormatRecord 函数使用以下格式过程。

格式化 的参数括在方括号中 。。可以迭代方括号,因为替换是从内到外解析的。

如果字符串的一部分括在大括号 { } 中,并且不包含方括号,则保留不变,包括大括号。

如果字符串的一部分括在大括号 { } 中,并且包含一个或多个属性名称,并且如果找到所有属性,则会显示文本(带有解析的替换),而不显示大括号。 如果未找到任何属性,则删除大括号和大括号本身中的所有文本。

请注意,对于延迟执行自定义操作,MsiFormatRecord 仅支持 CustomActionDataProductCode 属性。 有关详细信息,请参阅 获取延迟执行自定义操作的上下文信息

以下步骤介绍如何使用 MsiFormatRecord 函数设置字符串格式:

使用 MsiFormatRecord 函数设置字符串格式

  1. 通过将标记替换为相应的记录字段的值,并替换数字参数,其中缺少或 null 值不生成任何文本。
  2. 通过将非记录参数替换为相应的值,接下来将处理生成的字符串。
    • 如果遇到窗体“[propertyname]”的子字符串,则它将被属性的值替换。
    • 如果找到表单“[%environmentvariable]”的子字符串,则会替换环境变量的值。
    • 如果找到表单“[#filekey]”的子字符串,则会将其替换为文件的完整路径,其值 filekey 用作 文件表的键。 “[#filekey]”的值保持为空,在安装程序运行 CostInitialize 操作FileCost 操作以及 CostFinalize 操作之前,不会替换为路径。 “[#filekey]”的值取决于文件所属组件的安装状态。 如果组件正在从源运行,则该值是文件源位置的路径。 如果组件在本地运行,则该值是安装后文件的目标位置的路径。 如果该组件不存在,则路径为空。 有关检查组件的安装状态的详细信息,请参阅 检查功能、组件、文件的安装。
    • 如果找到表单“[$componentkey]”的子字符串,则会将其替换为组件的安装目录,其值 componentkey 用作 组件表中的键。 “[$componentkey]”的值保持为空,在安装程序运行 CostInitialize 操作FileCost 操作以及 CostFinalize 操作之前,不会替换为目录。 “[$componentkey]”的值取决于组件的安装状态。 如果组件正在从源运行,则该值为文件的源目录。 如果组件在本地运行,则该值是安装后的目标目录。 如果该组件不存在,该值将留空。 有关检查组件的安装状态的详细信息,请参阅 检查功能、组件、文件的安装。
    • 请注意,如果组件已安装,并且当前安装期间未重新安装、删除或移动组件,则组件的操作状态为 null,因此字符串“[$componentkey]”的计算结果为 Null。
    • 如果找到窗体“[\c]”的子字符串,则它将被字符替换,而无需进一步处理。 仅保留反斜杠后的第一个字符;删除其他所有内容。
如果返回 ERROR_MORE_DATA,则为指针的参数提供保存字符串所需的缓冲区大小。 如果返回 ERROR_SUCCESS,它将提供写入字符串缓冲区的字符数。 因此,可以通过传入指定缓冲区的参数的空字符串(例如“”)来获取缓冲区的大小。 不要尝试通过传入 Null(value=0)来确定缓冲区的大小。

注意

msiquery.h 标头将 MsiFormatRecord 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows Server 2012、Windows 8、Windows Server 2008 R2 或 Windows 7 上的 Windows Installer 5.0。 Windows Server 2008 或 Windows Vista 上的 Windows Installer 4.0 或 Windows Installer 4.5。
目标平台 窗户
标头 msiquery.h
Msi.lib
DLL Msi.dll

另请参阅

将 Null 作为 Windows Installer 函数的参数传递