MSI没有卸载.dll文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MSI没有卸载.dll文件相关的知识,希望对你有一定的参考价值。
我有一个程序,用于正常卸载并删除卸载过程中与其关联的所有文件。我们已经修改了我们的安装/卸载过程,现在使用installshield。
使用之前的安装/卸载过程,它在我们更改它之前大约工作了两周,而且即使现在使用新的installshield安装程序,它也无法在卸载时删除.dll文件。
我认为问题不在于安装程序本身,因为我们对2种非常不同的方法存在同样的问题。
目前为了使卸载过程正常工作,我们使用控制面板将其卸载,然后手动删除剩余的.dll文件
所有具有这些组件的机器都会遇到此问题,并且所有组件都会发生这种情况。所有机器都同时出现问题。
使用我的installshield进程我有详细的日志记录输出到.txt文件,我不知道如何最好显示文件中的所有信息,而不仅仅是一个大规模的转储。
一些原因是:
- 这些组件曾经被标记为永久性的,或者是无效的guid。这些是传播到系统的设置。如果您使用这些设置进行安装,他们会坚持使用系统并在项目中关闭它们不会改变它。
- 斯坦因的回答 - 在安装时标记为共享。除非您知道非MSI安装可能会在安装后将相同的文件安装到同一位置(并设置SharedDllRefCount),否则永远不会执行此操作。
- 还有另一个共享位msidbComponentAttributesShared,它告诉Windows它在多个MSI之间共享,即使它不在某些安装中。除非你打补丁,否则很不可能。
运行类似此VBScript的内容来枚举系统中的每个组件将告诉您Windows是否认为它是由已安装的产品拥有的:
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
通常,这与持有dll的组件的标志Shared set为yes有关。这会增加SharedDLLRef
注册表中的HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionSharedDLLs
Count。结合Installshield错误,这可以使文件处于卸载状态。解决方案是将保存文件的组件设置为shared = no并删除SharedDLLs
中的条目,然后再次尝试卸载。
这个sharedDLLs ref Count是一个与非msi安装程序兼容的功能,在我看来不应该用于转到system32的文件。 MSI参考计数使用组件guids。
更新:启用SharedDllRefCount可在此处设置旧版引用计数:
- 64位:
HKLMSOFTWAREMicrosoftWindowsCurrentVersionSharedDLLs
- 32位:
HKLMSOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionSharedDLLs
清理:
- Cleaning Up Your Shared DLLs Registry References for MSIs(未经我测试)。
- And some further MSDN suggestions for stranded components。
- Comprehensive explanation of reference counting errors。
以上是关于MSI没有卸载.dll文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义操作 DLL (MSI/Wix) 中获取“INSTALLED”属性?