软件开发完成需要发布一个正式的版本。
Windows下主流的安装包制作软件主要有:AdvancedInstaller、SetupFactory、InnoSetup、NSIS等,基本都可以使用向导完成基础的安装包生成,但想要进行定制化或执行其他动作就需要对脚本进行深入的研究了,学习成本以及难度还是不小的。所以,构建自己专属的安装-卸载套件,基于此做快速构建,定制化是很有必要的。下面是基于QT开发的安装、卸载程序效果图。
图1安装效果图图2卸载效果图1、安装
下面介绍一下典型的软件安装过程:
1.1、文件打包
程序的发布,除了本身的可执行文件exe,还包括动态链接库,图片文件、数据库文件和配置文件等依赖项,可以按自己的相对路径添加这些文件到发布文件夹里面。以我写的一个ImageSampler程序为例,首先将所需文件整理到待发布的文件夹,如下图所示。
图3待发布文件(占用空间MB)图4zip压缩文件(占用空间57MB)图5安装文件(占用空间80MB)整个文件夹所需要占用的空间大小是MB,可以看到里面包含了uninstall.exe卸载程序(卸载程序的问题先标记一下,等介绍完安装程序再介绍)。将所有文件添加压缩为zip文件,压缩后的文件大小为57MB,压缩程度在60%左右。(最终的安装包程序还包括支持其自身独立运行的依赖,如ImageSampler安装包最终大小为80MB,综合压缩程度50%,实际压缩程度由文件类型,项目复杂度决定),并将其添加为安装程序的资源文件,这样很容易通过qrc程序内获取到资源文件。至于压缩方式,取决于安装程序选择的解压方式。我选择的Quazip,下载
以上完成,可以在软件管家等看得到相应信息,并且能够对权限等重新设置,或者直接对其卸载。
图6.软件管家管理ImageSampler自启动状图7.软件管家管理ImageSampler生命周1.5、建立开始菜单里的程序组和桌面快捷方式
建立快捷方式等代码如下:
1.6、其他动作
其他动作如立即运行等使用QProcess可轻松运行,或者其他定制化的操作等。
2、卸载
与安装相反,卸载则是想办法清空相关的文件、还原注册表信息,以及删除自己。
前面两个都比较好解决,因为uninstall.exe和主程序是独立的程序,可串行执行。后者删除自己就行不通了,因为一个运行的程序不可能自杀,就算不删除自己,删除相应父文件夹的时候也会提示当前程序占用。一个可行的办法就是将自己克隆到一个临时路径下并运行自己(克隆),再关闭自己(原体)。可以通过QDir::tempPath()获得系统临时路径,一般存放临时性文件的,可以放心地当做垃圾文件清理,不会对系统造成任何的影响。另外程序要做的关键点是,如何区分自己是发起程序(原体)还是执行程序(克隆),并要告知执行程序当前自己的路径,QProcess执行exe时可以添加当前路径。程序执行时则可以通过入口函数main(intargc,char*arcv[])形参轻松地判断。下面是进入程序的执行。
需要根据安装时注册表信息寻找到相应的安装路径:
根据key:InstallLocation获取安装路径,如果不存在则只能手动删除。
接下来则是递归删除整个安装目录下的文件及文件夹,包括卸载程序,删除完成后删除系统注册表信息,快捷方式等即可完成整个过程。注意的是,快捷方式的清除必须要在文件删除前执行,因为lnk文件是与可执行文件路径link的,如果可执行文件不存在,QFile::exist会检测不到lnk文件存在,导致删除失败。
其他
以上是安装、卸载的核心环节,还有一个关键问题需要解决,要保证安装、卸载两个程序本身的可执行文件能够正常运行,并且不依赖特有的环境。很容易想到的是静态编译的方式,但QT官方使用的是动态链接库,去编译,理清依赖关系还是很麻烦的一件事,这里介绍一个封包工具EnigmaVirtualBox,将文件添加到exe虚拟目录下即可。参考博客: