文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>【InstallShield】 为什么卸载后有的文件没有删掉

【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

相关阅读 更多 +
排行榜 更多 +
夕鸟

夕鸟

生活实用 下载
partyplay

partyplay

聊天通讯 下载
婚礼纪

婚礼纪

生活实用 下载