代码改变世界

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

2011-01-24 15:13  刺客之家  阅读(803)  评论(3编辑  收藏  举报

终于解决了一个困扰了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了,呵呵。

 

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

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