理解你的问题并不容易。如果您希望能够构建一个检测必要的INSTALLPROPERTY_INSTALLEDPRODUCTNAMEs 的设置,您必须至少有一台安装了所有先决条件的机器 - 不是吗?
要获取所有已安装 ProductCodes 的列表,您可以使用 MsiEnumProducts() 或 MsiEnumProductsEx()。
您刚刚给出了一些正确的 API 函数。“准确找到所需产品/升级代码的问题在哪里?您期望的产品不在列表中,或者您没有尝试生成已安装程序的列表?MsiGetProductInfo() 的一个返回属性将为您提供 INSTALLPROPERTY_INSTALLEDPRODUCTNAME 信息例如,这对你来说还不够吗?
而不是自己编程:有一个工具 msiinv.exe 可用于获取此类已安装程序及其代码的列表,例如从这里:
https ://skydrive.live.com/?cid=27e6a35d1a492af7&id=27E6A35D1A492AF7%21910&authkey= !ANs8Pr0aVhaT_qQ
使用示例:c:\msiinv\msiinv.exe -p > c:\msiinv\msiinv_output.txt 在此处关注 Aaron Stebners 博客了解更多信息(例如,当下载链接已过期时):http:
//blogs.msdn.com /b/astebner/archive/2005/07/01/434814.aspx
你也可以用一些脚本来做到这一点。
首先,使用 ProductCodes 来识别外来包不是一个好主意,因为对该包的简单更新会更改该代码。UpgradeCode 更好,但是..
但是如果你想识别更大的产品,比如 Office 或 SQL Server,它可以是一个 PITA 来真正识别所有正确的包,而不是可选的包,来处理特定语言的包,处理 32 位或 64 位包。即使您是专家,我也不建议在复杂情况下依赖 MSI 代码。很容易失败。尝试在 HKLM\Software\Microsoft 下找到一个注册表项,该注册表项在版本之间是持久的,甚至更好地告诉版本,例如 HKLM\Software\Microsoft\Microsoft SQL Server 下的一个键用于搜索此产品,类似于 Office 等。
随便问一下,有没有剩下的。