我为一个产品构建了一个安装项目(来自Visual Studio2010的vdproj)。在我的测试机器上卸载时,它不会删除它应该删除的所有内容。具体地说,它不会删除它在安装中创建的一些注册表项。
一个类似的项目进行了清理;我比较了这两个项目,没有发现错误,所以我假设windows installer认为这样做有一个很好的理由。我需要让他忘记原因,这样我的产品才能有一个干净的测试基础,而不需要重新安装windows。
所以我尝试了手动清理:-卸载->注册表项未被删除-注册表编辑->清理手动-安装->注册表项由我的微星创建-卸载->注册表项仍未删除。
我认为在安装程序数据库中的某个地方有一个(可能已过时的)引用,它说:包含这些条目的组件仍被此功能使用,因此您不能删除它们。也许我有重复的组件键,因为我复制了一个安装项目,所以我得到了这种混淆。
我想我也许能够找到我的注册表项所属的组件和功能ID,但是我如何在安装程序数据库中修复这个问题呢?我该去哪里找呢?有什么工具可以帮到我吗?这是Windows 7旗舰版。
发布于 2014-04-07 23:56:30
混淆组件ids可能会导致这种情况,是的。您可以运行这样的vbscript来标识所有组件it及其产品所有者,使其成为vbs文件。另一个原因可能是您曾经将其标记为永久。这是对象上的系统设置,而不仅仅是构建时的项目设置,所以如果它曾经安装为permanent true,它将保持安装状态。
当这将guids、所有者和路径写入文件时,如果它是注册表路径,它将以2位数字开头以表示注册表位置。
Option Explicit
Public installer, fullmsg, comp, a, prod, fso, pname, ploc, pid, psorce
Set fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.CreateTextFile("comps.txt", True)
' Connect to Windows Installer object
Set installer = CreateObject("WindowsInstaller.Installer")
a.writeline ("MSI Components")
on error resume next
For Each comp In installer.components
a.writeline (comp & " is used by the product:")
for each prod in Installer.ComponentClients (comp)
pid = installer.componentpath (prod, comp)
pname = installer.productinfo (prod, "InstalledProductName")
a.Writeline (" " & pname & " " & prod & "and is installed at " & pid)
Next
Next发布于 2014-04-08 04:32:13
Phil已经提供了一个非常好的答案,提供了所需的调试信息。我只想补充说,我倾向于只给有问题的组件一个新的GUID,然后再试一次。
如果所讨论的设置尚未上线并且仅存在于您的测试计算机上,则应仅执行此操作。
(如果这起作用,那是因为新的GUID认为它“拥有”注册表项,并在卸载时将其删除。像这样的GUID更改会导致升级后丢失文件和设置-在这种情况下,更改GUID只是一个技巧,如果设置还没有人使用,您可以使用-否则永远不应该这样做)。
这是另一个描述组件GUID问题的答案。什么时候应该改变它们,为什么要改变,结果会是什么:Change my component GUID in wix?
https://stackoverflow.com/questions/22912822
复制相似问题