【InstallShield】 为什么卸载后有的文件没有删掉

如果一个文件在卸载应用程序后没有删除,那么有可能是因为包含这个文件的Component因为下列原因而没有删除。
1.Component的属性Permanent设置为Yes。
2.Component的ID为空。
3.Component被其他应用程序或者Feature使用。
4.设置了一个Condition,在安装时启用某个Feature,卸载时禁用该Feature。意思就是卸载的时候不卸载某个Feature,所有它对应的文件也会保留。
5.Component的关键文件在这个键值下有先前的引用

HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/SharedDLLs.
6.Component安装在系统文件夹下面,它的某个文件在这个键值下有先前的引用
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/SharedDLLs.
7.该文件受Windows Resource Protection (WRP)或Windows File Protection (WFP)保护。

我解释一下5和6点,因为我遇到的问题就是因为这个原因。

我在工程里开启了“Only for me”和"For All Users"的功能。当用户选择Only for me,第一次安装可以正常卸载,但是第二次安装在同一路径的话,卸载后文件都保留了下来。

原因是在InstallShield里新建一个组件的时候,Shared属性默认为YES。这就意味着这个组件成为了一个SharedDLL。安装的时候,InstallShield会在注册表的HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/SharedDLLs 这个键值下为每一个SharedDLL写一条信息。如果在卸载的时候该用户并没有删除这个键值的权限,结果这些键值都保留了下来。第一次卸载是没有问题的,文件被删除了。但是当用户第二次安装在同一个目录的时候,就会出现5和6的情况,每一个Component都有一个先前的引用,这个时候卸载的话,文件都会保留下来。

解决的方法就是把Component的Shared属性设置为NO。如果你的Component很多的话就不要去Componenent界面改了,打开Direct Editor界面,找到Component表,可以发现这个表里面并没有Shared列。其实只要把Attributes(i2)列的值改成0就可以了。如果你有其他的设置的话可能你要实验一下你的Attributes(i2)列该取什么值。在Component界面改一下,然后后头看表里面就知道了。

这样设置之后安装在非系统目录是没有问题的,但是如果安装在“C:/Program Files”这样的系统目录还是可能出现无法删除文件的问题。很显然,这是因为第7点了。解决的方法就是给文件夹授权。SetObjectPermissions这个函数很好用,可以用来解决各种疑难杂症。

  SetObjectPermissions(INSTALLDIR,
      IS_PERMISSIONS_TYPE_FOLDER, "", "Everyone", DELETE|GENERIC_ALL
      , IS_PERMISSIONS_OPTION_ALLOW_ACCESS); 

 

本地帮助文档路径:mk:@MSITStore:D:/Program%20Files/InstallShield/2011/Program/0409/msi.chm::/setup/windows_resource_protection_on_windows_vista.htm

http://www.cnblogs.com/linjiao0125/archive/2010/11/29/1891349.html

你可能感兴趣的:(windows,delete,文档,Access,permissions,attributes)