【问题标题】:How to read product code from an msi package?如何从 msi 包中读取产品代码?
【发布时间】:2020-07-10 22:41:42
【问题描述】:

我想在安装之前从 msi 文件中获取产品代码。如果我的计算机上已经安装了其他版本的产品,我需要它来删除它。我的意思是我想防止出现错误 1638(“该产品的另一个版本已经存在......”)并在我的代码中手动删除它。我正在使用 C++。 因此,我想从即将安装的 msi 文件中获取产品代码,并使用此产品代码删除产品的现有版本并安装新版本。但是当我试图打开一个 msi 文件来获取它的句柄时使用

MsiOpenPackage(msiPackagePath, &d_handle);

我收到错误 1638。因此我无法打开 msi 文件,也无法从中获取产品代码。我的问题:是否可以从不使用MsiOpenPackage 打开的 msi 文件中获取产品代码?提前谢谢!

【问题讨论】:

  • 重大升级一般通过升级代码实现。它应该在两个 MSI 版本之间匹配。您编写了 Upgrade table 并详细说明了您希望升级如何工作,然后通过内置 MSI 机制卸载以前的版本。 Find product codeFind upgrade codeDebugging failed major upgrades.
  • 我有用于访问 MSI 的代码示例,但现在没有时间找到它。你真的需要吗?你为什么要通过C++?您是从应用程序调用安装吗?

标签: c++ winapi windows-installer


【解决方案1】:

我的同事刚刚解决了一个问题。我们使用了一个函数MsiOpenPackageEx 并传递了一个标志MSIOPENPACKAGEFLAGS_IGNOREMACHINESTATE 来忽略计算机状态并返回一个句柄。

【讨论】:

  • 当您可以使用主要升级并编写升级表以卸载以前的版本时,为什么需要检索此信息?您使用什么工具制作 MSI?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
相关资源
最近更新 更多