我为产品构建了一个安装项目(来自Visual Studio 2010的vdproj)。在我的测试机器上卸载时,它不会删除它应该删除的所有内容。具体来说,它不会删除它在安装中创建的某些注册表项。
一个类似的项目是清理;我对项目进行了比较,发现没有错误,所以我认为Windows安装程序认为有充分的理由。我需要让他忘记原因,以便在不重新安装Windows的情况下为我的产品提供干净的测试基础。
所以我尝试了手动清理: - uninstall - >注册表项不会被删除 - regedit - >手动清理 - 安装 - >注册表项由我的MSI创建 - uninstall - >注册表项仍未删除。
我认为安装程序数据库中某处(可能是过时的)引用说:此功能仍然使用包含这些条目的组件,因此您无法删除它们。也许我有重复的组件键,因为我复制了一个安装项目,所以我得到了这个混乱。
我想我可以找到我的注册表项所属的组件和功能ID,但是如何在安装程序数据库中修复此问题?我在哪里看?有什么工具可以帮助我吗?它是Windows 7 Ultimate。
答案 0 :(得分:2)
混合组件ID可能会导致这种情况,是的。您可以运行这样的vbscript来识别所有组件ID及其产品所有者,使其成为vbs文件。另一个原因可能是您曾将其标记为永久性。这是对象的系统设置,而不仅仅是构建时的项目设置,所以如果它曾经永久安装,它将保持安装状态。
当它将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
答案 1 :(得分:0)
Phil已经为所需的调试信息提供了一个非常好的答案。只是想补充一点,我倾向于只为有问题的组件提供新GUID ,然后再尝试一下。
如果相关设置尚未生效且仅存在于您的测试计算机上,则仅才能执行此操作。
(如果这样做是因为新GUID认为它"拥有"注册表项,并在卸载时将其删除。诸如这些GUID更改导致升级后丢失文件和设置 - 并更改GUID在这种情况下只是一个黑客你可以使用如果没有人使用设置 - 否则它永远不会被使用。
这是另一个描述组件GUID问题的答案。当他们应该被改变时,为什么以及结果会是什么:Change my component GUID in wix?