• 【原创】InstallSheild使用问题笔记卸载程序之后重新启动,总是报错找不到文件?


    终于解决了一个困扰了1个星期的问题,由于这个问题产生的比较隐蔽且不易发现,决定把其共享出来。

    在上个项目中,制作了一个客户端程序,并且使用InstallSheild2009制作了一个安装包。测试时发现一个诡异的问题,就是当程序被卸载之后,重新启动计算机,在重启之后会弹出一个异常框,说找不到C盘一个目录中的SetUp.exe文件。具体图片这里就不贴了,下面主要说一下问题产生的原因和解决。

    问题分析

    一、刚开始,大家都以为是卸载“卸载程序”出的问题。什么意思呢,是这样的:一个应用程序分为安装程序和卸载程序2个组件(当然你要把他们2做成一个exe也是可以的),安装程序负责创建应用程序需要的环境和释放文件,也负责创建程序的“卸载组件”(卸载程序)。这通常是一个exe,在程序需要卸载时,就调用相应的卸载程序进行处理。

      当卸载程序完成对应用程序主要文件、注册表、快捷方式等地方的删除之后,有一个问题是,卸载程序自己怎么删除呢?一个应用程序在运行的时候是无法删除自己的。要解决这问题,使用了一个注册表项: "SYSTEM\\CurrentControlSet\\Control\\Session Manager"里的"PendingFileRenameOperations"注册表项,该项目里的文件,当系统重新启动的时候,操作系统会帮你删除。在制作安装包的过程中,我把卸载程序加入了这个注册表项,以便于卸载程序本身能够在下次启动时删除

      回到我们遇到的这个问题,当看到报错提示的时候,我第一反应就是:卸载程序本身不用删除,InstallSheild会自动删除它,我加上这个逻辑,多此一举,还会导致报错找不到文件。

      好吧,我去掉了这部分逻辑,再次调试一看,还是报错,只不过报错的提示换成了另外一个提示框……

      

      这下郁闷了,后来我找到了卸载程序所在的目录,运行了一下卸载程序exe,弹出了和上图一模一样的异常,我忽然发现,错误的原因是:

      “ 不是由于删除卸载文件出错,而是由开机时试图启动卸载程序.exe出错了。如果卸载程序不存在,就会报错找不到文件;若卸载程序存在,由于此时软件已经被卸载,就会报其他错误 ”

      

    二、找打了原因,就验证一下自己的猜想,我卸载了程序之后,打开360查看启动项,果然被我发现了一个可疑的启动项。

    呵呵,被我抓到了,现在就去注册表中去找,到底有没有这个开机启动项,发现如下:

      

    问题找到了,一个启动项指向了卸载程序exe,且卸载注册表的“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce”里,也就是代表只开机运行一次。

     

    下面就好办了,在InstallSheild里使用脚本在卸载完成之后,从注册表删除这一项就o了,呵呵。

     

    (本文纯属解决问题的过程记录,可能参考意义不大~)


    本博客文章若非标记转载,均为原创,转载请注明出处~


  • 相关阅读:
    expect 函数体 花括号
    bash 连接字符串
    Ubuntu下搭建Python开发环境
    expect
    >&2
    expect语法基础: while、for 循环、if 语句的用法示例
    bash exit
    python开发工具
    eclipse中安装adt出现了duplicate location错误怎样解决
    shell source
  • 原文地址:https://www.cnblogs.com/wbpmrck/p/1943184.html
Copyright © 2020-2023  润新知