给定 MSI 产品代码,我想从已安装的产品中获取升级代码(以及其他属性)。我通过调用 MsiOpenProduct 方法,然后调用 MsiGetProductProperty() 来尝试此操作。一个(缩写)示例如下所示:
MSIHANDLE handle = NULL;
MsiOpenProduct(strProductCode,&handle);
CString strUpgradeCode;
MsiGetProductProperty(handle,_T("UpgradeCode"), strUpgradeCode.GetBuffer(GUID_LENGTH), &dwSize);
strUpgradeCode.ReleaseBuffer();
MsiCloseHandle(handle);
这得到了我想要的值,从 MSDN 文档来看,这似乎是执行此操作的有效方法:
MsiOpenProduct 函数打开一个
与功能一起使用的产品
访问产品数据库。这
必须调用 MsiCloseHandle 函数
有手柄时 无手柄时
更需要。
但是,调用 MsiOpenProduct() 会弹出“Windows 安装程序正在准备安装...”对话框。调用 MsiCloseHandle() 使其再次消失。
这让我想知道:
- 对 MsiOpenProduct() 的调用在幕后做了什么?我不想触发任何操作,我只想读取属性。
- 我不介意弹出对话框,因为这仅适用于单元测试代码,只要它没有副作用。由于有许多单元测试可以执行此操作,因此在快速连续打开和关闭句柄时它必须仍然有效。
- 虽然我偶然发现了MsiGetProductInfo方法,但似乎没有办法获取升级代码。我对吗?
- MsiOpenProduct 是读取升级代码等属性的正确方法吗?
MsiOpenProduct 应该没问题只要您不运行任何序列或操作,它就不会执行任何操作。如果要使对话框静音,可以小心使用 MsiSetInternalUI() 或 MsiSetExternalUI()。
您可以采取另一种方法,只要ProductCode
and UpgradeCode
安全地静态(即,只要它们不被转换更改),就是使用 MsiGetProductInfo() 定位数据库并调用 MsiOpenDatabase() 。区别在于 MsiOpenProduct()(或类似的 MsiOpenPackage)应用安装时使用的转换并准备会话,而 MsiOpenDatabase() 两者都不做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)