2015-12-02 118 views
1

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

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

我不认为这个问题与安装程序本身有关,因为我们对于两种非常不同的方法有同样的问题。

目前使我们使用的控制面板卸载过程的工作卸载然后剩下的.dll文件手动

发生此问题上删除对所有这些组件的机器,它是与所有的组件发生。 所有机器都有问题,同时启动。

与我的installshield进程我有详细的日志输出到一个.txt文件,我不知道如何才能最好显示文件中的所有信息,没有它只是一个巨大的转储。

回答

1

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

This sharedDLLs ref Count是一个兼容性功能使用非MSI安装程序,不应该在我的意见中使用到system32的文件。 MSI Reference Counts使用Component guid。

+0

你能澄清的错误你'是指?我知道的所有情况都涉及不正确地创作组件,通常会违反组件规则,可能会因在测试版本之间运行小更新或轻微升级而加剧。 –

0

一些原因是:

  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