Com MSI没有';无法修复某些注册表项

Com MSI没有';无法修复某些注册表项,com,installation,registry,windows-installer,Com,Installation,Registry,Windows Installer,当我从命令行运行命令“msiexec/fm”时,我注意到某些HKLM注册表项没有被修复。当我在C++中这样做时,同样的事情发生:“MsiRealStutialPoice(产品代码,RealStutoMeDebug,RealStutoMeDeDeMeDeDATA); 情况是这样的。我有一个必须注册的COM DLL。此DLL的CLSID信息位于MSI注册表表中。在安装过程中,MSI将把信息放在注册表中。如果手动删除CLSID项并修复“msiexec/fm”,则注册表项将正确还原。同样,如果我手动更改

当我从命令行运行命令“msiexec/fm”时,我注意到某些HKLM注册表项没有被修复。当我在C++中这样做时,同样的事情发生:“MsiRealStutialPoice(产品代码,RealStutoMeDebug,RealStutoMeDeDeMeDeDATA); 情况是这样的。我有一个必须注册的COM DLL。此DLL的CLSID信息位于MSI注册表表中。在安装过程中,MSI将把信息放在注册表中。如果手动删除CLSID项并修复“msiexec/fm”,则注册表项将正确还原。同样,如果我手动更改注册表中指向DLL的路径,那么MSI会将字符串修复回其原始值

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


命令“msiexec/fdm”实际上会修复注册表项,但它也会将文件更新回原始状态。在我的例子中,我有一个新文件,因为它安装在service pack中。我希望保留新文件,只修复注册表项。

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


是的,您是对的,我可以提供/fdm之类的选项,钥匙将被恢复。我要求不要从源.msi文件重新安装任何文件。如果我给出像您建议的选项,那么文件将被覆盖,这不是我想要的。在这种情况下,机器有一个新的dll,因为dll是在Service Pack中交付的(基本上只是对原始dll的覆盖)。我希望保留新文件,但更新损坏的注册表路径。我将更新上面的问题。我可以将.msi文件中的注册表和文件分离为.msi中的不同组件吗?如果我这样做了,即使文件仍然存在,我也能期望密钥得到修复吗?是的,你可以。注册表项可以是组件中的键成员。