MSI没有卸载.dll文件

问题描述 投票:1回答:2

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

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

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

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

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

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

dll windows-installer installshield uninstall
2个回答
1
投票

一些原因是:

  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

1
投票

通常,这与持有dll的组件的标志Shared set为yes有关。这会增加SharedDLLRef注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs Count。结合Installshield错误,这可以使文件处于卸载状态。解决方案是将保存文件的组件设置为shared = no并删除SharedDLLs中的条目,然后再次尝试卸载。

这个sharedDLLs ref Count是一个与非msi安装程序兼容的功能,在我看来不应该用于转到system32的文件。 MSI参考计数使用组件guids。

更新:启用SharedDllRefCount可在此处设置旧版引用计数:

  • 64位:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs
  • 32位:HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\SharedDLLs

清理:

© www.soinside.com 2019 - 2024. All rights reserved.