1

当我从命令行运行命令“msiexec /fm”时,我注意到某些 HKLM 注册表项没有被修复。当我在 C++ 中执行以下操作时也会发生同样的事情:“MsiReinstallProduct(ProductCode, REINSTALLMODE_REPAIR | REINSTALLMODE_MACHINEDATA);”

情况是这样的。我有一个必须注册的 COM DLL。此 DLL 的 CLSID 信息位于 MSI 注册表中。在安装过程中,MSI 会将信息放入注册表中。如果我手动删除 CLSID 键并进行修复“msiexec /fm”,则注册表键会正确恢复。同样,如果我手动更改注册表中指向 DLL 的路径,则 MSI 会将字符串修复为其原始值。

有一个工作流程不会修复密钥。如果我在机器上放置一个新版本的 DLL 来替换安装时附带的那个,那么 MSI 将不再修复 CLSID 密钥。就好像 MSI 决定不应修复此密钥,因为 DLL 不相同。即使 DLL 已更改,我也需要一种强制 MSI 修复来修复注册表项的方法。

命令“msiexec /fdm”实际上会修复注册表项,但它也会将文件更新回原始文件。就我而言,我有一个新文件,因为它安装在服务包中。我希望保留新文件,并且只修复注册表项。

4

1 回答 1

2

我的猜测是 DLL 文件是保存注册表项的组件中的关键成员。默认情况下,除非缺少关键成员,否则不会重新安装组件。您应该指定更多标志以确保触发组件重新安装。例如 /fpem

http://technet.microsoft.com/en-us/library/cc759262(v=ws.10).aspx#BKMK_Repair

于 2013-01-10T07:21:42.027 回答