MsiGetPropertyA 函数 (msiquery.h)

MsiGetProperty 函数获取安装程序属性的值。

语法

UINT MsiGetPropertyA(
  [in]      MSIHANDLE hInstall,
  [in]      LPCSTR    szName,
  [out]     LPSTR     szValueBuf,
  [in, out] LPDWORD   pcchValueBuf
);

参数

[in] hInstall

对提供给 DLL 自定义操作的安装句柄,或通过 MsiOpenPackageMsiOpenPackageExMsiOpenProduct获取的安装句柄。

[in] szName

一个以 null 结尾的字符串,指定属性的名称。

[out] szValueBuf

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

[in, out] pcchValueBuf

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

返回值

此函数返回 UINT。

言论

如果未定义由 MsiGetProperty 函数检索的属性的值,则它等效于 0 长度的值。 这不是错误。

如果返回ERROR_MORE_DATA,则为指针的参数提供保存字符串所需的缓冲区大小。 如果返回ERROR_SUCCESS,则它提供写入字符串缓冲区的字符数。 因此,可以通过传入指定缓冲区的参数的空字符串(例如“”)来获取缓冲区的大小。 不要尝试通过传入 Null(value=0)来确定缓冲区的大小。

以下示例演示 DLL 自定义操作如何通过动态确定值缓冲区的大小来访问属性的值。

UINT __stdcall MyCustomAction(MSIHANDLE hInstall)
{
    TCHAR* szValueBuf = NULL;
    DWORD cchValueBuf = 0;
    UINT uiStat =  MsiGetProperty(hInstall, TEXT("MyProperty"), TEXT(""), &cchValueBuf);
    //cchValueBuf now contains the size of the property's string, without null termination
    if (ERROR_MORE_DATA == uiStat)
    {
        ++cchValueBuf; // add 1 for null termination
        szValueBuf = new TCHAR[cchValueBuf];
        if (szValueBuf)
        {
            uiStat = MsiGetProperty(hInstall, TEXT("MyProperty"), szValueBuf, &cchValueBuf);
        }
    }
    if (ERROR_SUCCESS != uiStat)
    {
        if (szValueBuf != NULL) 
           delete[] szValueBuf;
        return ERROR_INSTALL_FAILURE;
    }

    // custom action uses MyProperty
    // ...

    delete[] szValueBuf;

    return ERROR_SUCCESS;
}

注意

msiquery.h 标头将 MsiGetProperty 定义为一个别名,该别名根据 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。 Windows Server 2003 或 Windows XP 上的 Windows Installer
目标平台 窗户
标头 msiquery.h
Msi.lib
DLL Msi.dll

另请参阅

安装程序状态访问函数

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