当我从命令行运行命令“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”实际上会修复注册表项,但它也会将文件更新回原始文件。就我而言,我有一个新文件,因为它安装在服务包中。我希望保留新文件,并且只修复注册表项。