【发布时间】:2020-05-30 17:40:39
【问题描述】:
在基本 MSI 项目中使用 InstallShield 2013。我们有一些古老的 Microsoft COM DLL,它们在我们的 MSI 中包含的合并模块中提供。我们现在需要在次要升级补丁 (MSP) 中使用较新的 DLL 更新其中的一些 DLL。我们没有来自 Microsoft 的新合并模块,所以我试图弄清楚如何在我们的应用程序中安装这些新的 DLL。
我添加了 2 个新组件,每个文件一个,并构建了新的 MSP。这些文件已正确安装,尽管我确实必须在自定义操作中手动注册它们,否则补丁将是可卸载的(b/c 我更改了 Class 表)。这一切都很好 - 到目前为止。但是,当我删除补丁时,这两个新文件被删除了!! 这就是问题。我会同意他们被放回以前的版本 - 但不是。他们直接被删除了。我将文件标记为 永久 - 同样的问题。我取消了这两个新文件的 GUID - 同样的问题。因为它们是 MS 文件,所以我可以将它们留在新版本中。我怀疑它没有保留这些,因为我只是在补丁中将其标记为永久,而不是在原始 MSI 中。对吧?
Here's some MSI log info during the installation of the MSP:
MSI (s) (FC:C4) [16:53:38:949]: File = comctl32.ocx: Final State = Install
MSI (s) (FC:C4) [16:53:38:949]: File = osl.dll1.BD822168_4484_412B_AA08_455F82BE5E0F: Final State = Install
MSI (s) (FC:C4) [16:53:48:371]: SELMGR: Component 'comctl32.ocx' is a new component added to feature 'WDCoreComp'
MSI (s) (FC:C4) [16:53:49:371]: Component: comctl32.ocx; Installed: Absent; Request: Local; Action: Local; Client State: Unknown
MSI (s) (FC:C4) [16:53:53:199]: Baseline: Existing comctl32.ocx version 6.0.81.5 does not match any baseline. Will not be cached.
Here's MSI log info from the uninstall of this MSP:
MSI (s) (FC:B8) [16:57:33:236]: File = comctl32.ocx: Final State = Remove
MSI (s) (FC:B8) [16:57:33:236]: File = osl.dll1.BD822168_4484_412B_AA08_455F82BE5E0F: Final State = Overwrite
MSI (s) (FC:B8) [16:58:01:939]: Executing op: FileRemove(,FileName=C:\Windows\SysWOW64\comctl32.ocx,,ComponentId={100B5DC4-FD2D-4311-9ADE-2B65B814F446})
我在其中包含了 osl.dll,以指示我们的一个 DLL 的正常修补例程,它用旧版本覆盖它,但它正在删除 comctl32.ocx。
其他选项似乎非常不可取:
- 使用 Orca 将新的 bin 破解到旧的合并模块中并重建安装程序。希望 该补丁会识别出它们是新的并正确安装它们
- 在自定义操作中手动执行此操作:在安装过程中保存这些文件的副本,然后安装新文件。在卸载期间,从我们保存的副本中恢复旧版本
- 将文件安装在临时文件夹中,将它们复制到官方 MS 位置,然后在那里注册。卸载只会将它们从临时文件夹中删除,而不是从官方 MS 位置中删除
数字 3 听起来最不令人反感,但在自定义操作中手动执行所有这些操作仍然是一种糟糕的形式。
【问题讨论】:
标签: com installation installshield patch merge-module