MsiGetPropertyW 函数 (msiquery.h)

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

语法

UINT MsiGetPropertyW(
  [in]      MSIHANDLE hInstall,
  [in]      LPCWSTR   szName,
  [out]     LPWSTR    szValueBuf,
  [in, out] LPDWORD   pcchValueBuf
);

参数

[in] hInstall

提供给 DLL 自定义操作或通过 MsiOpenPackage、MsiOpenPackageExMsiOpenProduct 获取的安装的句柄。

[in] szName

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

[out] szValueBuf

指向缓冲区的指针,该缓冲区接收包含 属性值的 null 终止字符串。 请勿尝试通过为 szValueBuf 传入 null (value=0) 来确定缓冲区的大小。 可以通过传入空字符串 ((例如“”) )来获取缓冲区的大小。 然后,该函数将返回 ERROR_MORE_DATA,pchValueBuf 将包含所需的缓冲区大小(不包括终止 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
目标平台 Windows
标头 msiquery.h
Library Msi.lib
DLL Msi.dll

另请参阅

安装程序状态访问函数

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