MSI没有卸载.dll文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MSI没有卸载.dll文件相关的知识,希望对你有一定的参考价值。

我有一个程序,用于正常卸载并删除卸载过程中与其关联的所有文件。我们已经修改了我们的安装/卸载过程,现在使用installshield。

使用之前的安装/卸载过程,它在我们更改它之前大约工作了两周,而且即使现在使用新的installshield安装程序,它也无法在卸载时删除.dll文件。

我认为问题不在于安装程序本身,因为我们对2种非常不同的方法存在同样的问题。

目前为了使卸载过程正常工作,我们使用控制面板将其卸载,然后手动删除剩余的.dll文件

所有具有这些组件的机器都会遇到此问题,并且所有组件都会发生这种情况。所有机器都同时出现问题。

使用我的installshield进程我有详细的日志记录输出到.txt文件,我不知道如何最好显示文件中的所有信息,而不仅仅是一个大规模的转储。

答案

一些原因是:

  1. 这些组件曾经被标记为永久性的,或者是无效的guid。这些是传播到系统的设置。如果您使用这些设置进行安装,他们会坚持使用系统并在项目中关闭它们不会改变它。
  2. 斯坦因的回答 - 在安装时标记为共享。除非您知道非MSI安装可能会在安装后将相同的文件安装到同一位置(并设置SharedDllRefCount),否则永远不会执行此操作。
  3. 还有另一个共享位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

清理:

以上是关于MSI没有卸载.dll文件的主要内容,如果未能解决你的问题,请参考以下文章

MSI无法卸载

无法卸载 system32 文件夹中的 dll

为啥 MSI 需要原始 .msi 文件才能继续卸载?

如何在自定义操作 DLL (MSI/Wix) 中获取“INSTALLED”属性?

WiX 3.8:使用相同注册表值的两个MSI。如果同时卸载两个MSI,如何删除注册表值?

MSI 安装程序选项 - 卸载应用程序 [重复]