【问题标题】:MSI Get Installed Property Value C++MSI Get Installed 属性值 C++
【发布时间】:2013-10-23 14:46:11
【问题描述】:


我的 MSI 设置中有 MYPATH 属性,并且我正在将一些组件安装到此路径。现在我想获取我的组件安装的路径。我正在使用以下代码:

INSTALLUILEVEL pervousUILevel = MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
MSIHANDLE handle = NULL;
MsiOpenProduct(productCode,&handle);
wchar_t myPath[2048];
DWORD dwBuffer = 2048;
MsiGetProductProperty(handle, L"MYPATH", myPath, &dwBuffer); 
MsiCloseHandle(handle);
MsiSetInternalUI(pervousUILevel, NULL);

但我仍然得到默认值“C:\MyDefaultPath”而不是“C:\我在安装期间指定的路径”。我究竟做错了什么?
谢谢

编辑:
我发现代码:

wchar_t myPath[4096];
DWORD isBuffer = 4096;
MsiGetComponentPath(productCode, L"{component-guid}", myPath, &isBuffer);

也返回默认路径。

【问题讨论】:

    标签: windows-installer


    【解决方案1】:

    这是因为您直接从 MSI 包中读取值。您需要在安装过程中获取属性值,使用MsiGetProperty API methodm with a custom action. 链接的示例是用于执行串行验证的自定义操作,您感兴趣的只是您定义自定义操作的方式以及如何获取值,其余代码你不需要

    【讨论】:

    • 博格丹您好,感谢您的回复!安装过程完成后,即在独立的 c++ 控制台应用程序中,有什么方法可以获取此属性值?另一个让我感到困惑的想法是,当我为安装到 INSTALLDIR 的组件获取 MsiGetComponentPath 时,该函数会为我提供为安装选择的 INSTALLDIR。
    • MsiGetProperty 仅在安装期间有效。要在安装完成后获取值,您需要先保存它,通常在注册表中,然后从那里读取。这就是为什么确实 MsiGetComponentPath 似乎是您所需要的。您可以在成本计算操作(CostInitialize - > CostFinalize)完成后设置 MYPATH 的值,但我不能肯定地说,因为我没有使用那么多 MsiGetComponentPath,我主要编写要在安装期间执行的自定义操作过程。
    • 我在执行 MSI 时直接发送了 MYPATH。感谢您澄清这是不好的方法,我将从注册表或一些配置文件中读取属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多