【InstallShield】 为什么卸载后有的文件没有删掉
时间:2010-11-29 来源:林骄
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
- 系统休眠文件删除后果 如何删除计算机的休眠文件 2025-04-22
- 站群服务器是什么意思 站群服务器的作用 站群服务器和普通服务器的区别 2025-04-22
- jQuery插件有何作用 jQuery插件的使用方法 2025-04-22
- jQuery插件有哪些种类 简单的jQuery插件实例 2025-04-22
-