【InstallShield】 为什么卸载后有的文件没有删掉
2011-02-21 15:29
375 查看
如果一个文件在卸载应用程序后没有删除,那么有可能是因为包含这个文件的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
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
相关文章推荐
- 为什么vue-cli创建的build文件下没有dev-server.js文件
- 七牛上传同名文件为什么没有报错解答
- CHM文件为什么打开什么都没有?
- 多文件同时读写为什么没有单文件读写快?
- Unix/Linux下删除Oracle控制文件Controlfile为什么实例Instance没有立即奔溃?
- Eclipse中为什么创建DynamicWebProject后没有默认的web.xml文件?
- 如果更新包更新包现场,class文件更新过去,没有改变,及时删掉,照样能进那个模块的问题。
- 终于知道为什么我的mysql总是卸载的不干净以及老是找不到my.ini文件
- InstallShield 2015 Premier的Basic MSI Project如何在卸载时删除残留的文件
- Unix/Linux下删除Oracle控制文件Controlfile为什么实例Instance没有立即奔溃?
- 为什么在R文件中,图片的资源Id没有显示
- 为什么没有产生core 文件
- 你的PagedLOD 为什么没有卸载?
- 为什么maven没有.m2文件
- 为什么xcode6没有自动创建pch文件呢?
- InstallShield在卸载的时候将安装时生成的安装文件及dll也删除
- 【浅析】把实现放在头文件中的函数模板,为什么没有发生重定义错误
- 为什么Ubuntu 下的svn 没有上传.so 的库文件?
- 关于 Eclipse 创建 Dynamic Web Project (动态的 WEB 项目) 为什么会出现没有web.xml配置文件的问题
- 为什么文件系统没有标签分类方式?