MSI没有卸载.dll文件

时间:2015-12-02 19:43:51

标签: dll windows-installer installshield uninstall

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

使用之前的安装/卸载过程,它可以正常工作,直到我们更改它之前大约2周,而且即使现在使用新的installshield安装程序,它仍然无法在卸载时删除.dll文件。

我认为问题出在安装人员身上,因为我们对2种截然不同的方法存在同样的问题。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

清理:

答案 1 :(得分:1)

部分原因是:

  1. 这些组件曾经被标记为永久性的,或者被指定为无效的guid。这些是传播到系统的设置。如果您使用这些设置进行安装,他们会坚持使用系统并在项目中关闭它们不会改变它。

  2. Stein的答案 - 在安装时标记为共享。除非您知道非MSI安装可能会在安装后将相同的文件安装到同一位置(并设置SharedDllRefCount),否则永远不会执行此操作。

  3. 还有另一个共享位msidbComponentAttributesShared,它告诉Windows它在多个MSI之间共享,即使它不在某些安装中。除非你打补丁,否则很不可能。

  4. 运行类似此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