今天发现安装包Client装c盘能正常删除,但是放d盘不能删除dll文件。

1.d盘安装程序包

2.检查脚本文件,卸载时通过messagebox打印INSTALLDIR和TARGERDIR,发现均指向c盘默认路径,意思所有脚本失效....

3.检查服务端dll,均能正常删除,修改Client文件夹名后也能正常删除,???

4.https://www.cnblogs.com/larson/p/4255237.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点了。解决的方法就是给文件夹授权。

遗留问题:卸载时INSTALLDIR路径变为默认值,找不到某些bat脚本文件,不能正常删除服务....

解决方法:在InstallShild中添加删除服务的方法,缺点是需要一个个去判断服务是否安装、是否运行...

InstallShield卸载不彻底,残留大量dll文件的更多相关文章

  1. 手动卸载CAD 删除残留文件 清理遗留的文件

    手动卸载基于 AutoCAD 产品的文件,从而删除所有残留文件. 清理安装失败所遗留的文件. 一.解决方案: 通过"控制面板"卸载该程序. 删除以下位置残留的 AutoCAD 文件 ...

  2. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

  3. C语言dll文件的说明以及生成、使用方法

    最近在搞一些小项目,由于要涉及到跟其它语言进行交互,动态链接库变成了不二的选择.为此也查阅了很多资料,将动态链接库的相关知识在此做一个整理. 一.动态链接库概述 动态链接库(Dynamic Link ...

  4. vs2010下C++调用lib或dll文件

    注: DLL:表示链接库,包含dll,lib文件: dll: 表示my.dll文件 lib: 表示my.lib文件 C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法 1  设置工程的 ...

  5. Delphi 使用之dll文件生成与调用

    DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...

  6. 详细介绍dll文件是什么

     DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件一般被存放在C:WindowsSystem目录下.DLL是一个包含可由多个程序同时使用的代码和数据的库. 在Wind ...

  7. lib和dll文件的区别和联系

    什么是lib文件,lib和dll的关系如何 (2008-04-18 19:44:37)    (1)lib是编译时需要的,dll是运行时需要的. 如果要完成源代码的编译,有lib就够了. 如果也使动态 ...

  8. .OCX、.dll文件注册命令Regsvr32的使用

    1.打开文件,打开需要注册的OCX文件或dll文件,2.然后根据需要进行OCX文件或DLL文件的注册和反注册 DLL.OCX注册方法--文件Regsvr32用法及情况介绍 使用过activex的人都知 ...

  9. PE头的应用---插入代码到EXE或DLL文件中

    三.代码实现(DELPHI版本),采用第三种方式实现代码插入. 1. 定义两个类,一个用来实现在内存中建立输入表:一个用来实现对PE头的代码插入. DelphiCode: const MAX_SECT ...

随机推荐

  1. Docker 的技术组件

    Docker可以运行于任何安装了现代Linux内核的x64主机上.推荐的内核版本是3.8或者更高.Docker的开销比较低,可用于服务器.台式机或者笔记本.它包括以下几个部分. 一个原生的Linux容 ...

  2. “C++的数组不支持多态”?

    先是在微博上看到了个微博和云风的评论,然后我回了“楼主对C的内存管理不了解”. 后来引发了很多人的讨论,大量的人又借机来黑C++,比如: //@Baidu-ThursdayWang:这不就c++弱爆了 ...

  3. 【LeetCode-面试算法经典-Java实现】【059-Spiral Matrix II(螺旋矩阵II)】

    [059-Spiral Matrix II(螺旋矩阵II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an integer n, generate a ...

  4. webdriver实用指南python版本(1)-安装开发环境

    webdriver实用指南是本人编写的系列丛书,包括ruby版.python版和java版.在线版是免费的,之前是放在我的github上,但是很多同学总不记得地址,现在转到我的博客上,方便大家阅读. ...

  5. Unix网络编程 之 基本套接字调用(一)

    Unix/Linux支持伯克利风格的套接字编程,它同一时候支持面向连接和面向无连接类型的套接字. 套接字最经常使用的一些系统调用: socket() bind() connect() listen() ...

  6. IntelliJ IDEA设置代码括号对齐方式

    IntelliJ IDEA设置代码括号对齐方式 IntelliJ IDEA默认的对齐方式如下:括号跟函数名在一行 想改为括号独自占一行,如下: 配置方式如下:File->Setting-> ...

  7. django session入门详解

    概括性的讲: 1.django默认是打开对session的支持的 2.默认情况下session相关的数据会保存在数据库中.浏览器端只保存了session id session 的科普: 1.动态网站中 ...

  8. django -- while time zone support is active

    一.先看报错: django 在处理datetime类型的的报错/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site ...

  9. 支付接口中常用的加密解密以及验签rsa,md5,sha

    一.常用加密类型分类 1.对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密.此类型称之为对称加密.特点速度快,常用于对大量数据信息或文件加密时使用.常用例子:D ...

  10. git 修改历史提交信息

    当你不小心,写错了提交的注视/信息,该如何处理呢.理论上,SCM是不应该修改历史的信息的,提交的注释也是.   不过在git中,其commit提供了一个--amend参数,可以修改最后一次提交的信息. ...