在带有 MSI 的 Windows 7 中安装程序时(所有 Windows 版本都很棒......但现在 Windows 7 就足够了)......
-安装时注册表中所做的更改是什么和在哪里以及如何做所有这些变化都相互关联吗?
-如果我需要它,我如何找到与给定安装相关的所有数据,我是否必须通过注册表来获取这些数据,或者是否有另一种更有效或更合适的方式来访问数据?
3 回答
使用 MSI API,例如MsiGetProductInfoEx 函数。正如 Hans 所提到的,注册表数据大多没有记录,因为它是一个实现细节。
我一直在玩注册表和安装,看看我能想出什么。如果有人可以进一步详细说明我的答案或进行任何更正,将不胜感激,因为此答案仅来自观察,而不来自任何官方来源。我制作了一些表格来描述我发现的内容,如下图所示。此外,为了访问所需的信息(IE、MSI 的 ProductName 或 ProductCode 属性),我遇到了 WIX(http://wixtoolset.org/)并且正在使用 Micrsoft.Deployment.Installer.dll 以及其他库包含在 WIX 中,因为它们非常甜。
我不知道我在这里引用的所有密钥和代码的官方术语......所以如果我因为它们似乎指定的东西而编造它们,请不要感到惊讶,因为我做到了。
更新:我刚刚在 MSI 文档中找到了一些更有用的信息,可能会在这里受到赞赏:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa372105 (v=vs.85).aspx
使用 MsiGetProductInfoEx(可能还有 MsiEnumProductsEx)是获得有关已安装产品信息的推荐编程方法。使用这种方法,您可以比较对 ProductCode、ProductVersion 和包代码(即修订号摘要属性)值的更改。然而,对应用程序的小幅更新可能会使 ProductCode 和 ProductVersion 保持不变。一个典型的小更新只更改一两个文件或一个注册表项,在这种情况下,包代码也应该更改。但是,带有语言转换的产品可能与没有转换的产品具有相同的包代码。
如果您正在开发自己的 Windows Installer 程序包,需要确定用户是否已经安装了应用程序的某个版本,您可以使用 Windows Installer 服务在应用程序安装期间搜索特定文件或目录。这种方法需要在 Windows 安装程序数据库中填充适当的表,并且 msi 应该运行 AppSearch 操作。此方法在此处发布的 Microsoft 的 Windows Installer 文档中进行了描述: