因为新公司需要开发pc应用的自定义安装包,开始时候计划使用nsis开发,论坛上面有很多不错的例子,而且完成度很强,
随便拿来修改使用,但是后续的开发过程中遇到的问题就逐个出现。
首先说一下nsis的优点:
1.脚本开发,编译打包开发速度比纯c++快。
2.中文文档翻译清晰,新手可以直接上手调用api完成。
3.官网各种插件种类繁多,可以按照项目需要下载所需dll。
优点很多,这里写不下。
然后吐槽一下缺点以及遇到的坑。
1.解压安装文件过程中,论坛上的很多例子都是把启动文件一个个File到安装目录,这个对于开发者来说,很不友好,每次打包加一个文件需要改动nsi脚本。网上很多其他方法的例子,例如使用BgWorker + Nsis7z 两个插件,BgWorker开辟一个后台线程,Nsis7z负责在线程中解压7z压缩包,这个方法的设计思想十分合理,不使用安装Section,使用解压压缩包 的进度取代。
在测试几次的过程中,我发现nsis7z插件偶尔会解压失败,直接跳过解压,让我很不解为什么有bug的插件还会放到官网提供下载。后面我改用unzip.cpp去解压zip,再也没有出现解压失败,注意的是,打包dll一定要添加mfc静态库,不然会调用失败。
这里提供源码项目下载:https://pan.baidu.com/s/1y1AMGEeplJg-nmPCTLZDkg
2.nsDialog是官网附带的插件,封装了很多控件类型,例如图片,文本,按钮,超链接,单选框等等。但是注意的是,这些控件使用的资源只支持bmp位图,因为他只调用loadbitmap的api设置控件的背景。对于带有透明度的异形窗口却无能为力。我曾经在官网上下载了有关使用png图片的插件,都只能是调用BitBlt拷贝图片颜色数据,图片透明区域使用黑色填充。开始时打算使用Gdi+画png图片到nsDialog的bitmap控件中,然后设置窗口风格为WS_EX_LAYERED,再使用UpdateLayeredWindow画png到窗口,我在win10测试完全没有问题,但放到win7中,就画不出来了,度娘之后,才知道win7系统以下(包括win7)WS_EX_LAYERED风格只能用在没有WS_CHILD风格的窗口中,也就是说子窗口不能设置WS_EX_LAYERED风格,而且
UpdateLayeredWindow函数会让子控件都透明。后来请教了贾可大神,他的方案有两个,一个是使用DirectUI绘制,一个是使用叠层窗口,考虑到使用DirectUI需要重新开发ui,时间紧凑,抛弃了这个方案,最后使用叠层窗口。还好有nsWindows插件,可以直接在脚本创建顶层窗口,在顶层窗口中创建其他控件。
这里提供源码项目下载:https://pan.baidu.com/s/14MKLMAQrBc525V9ptvf58w
3.制作html安装协议,安装协议一般是用文本显示,我看了其他热门的pc应用,他们都使用打开一个h5页面显示协议,这里推荐一个制作h5页面的网站,直接将work文档上传,就可以生成h5页面。http://www.docpe.com/word/word-to-html.aspx
4.关于优化安装包启动速度,我的意见是,当自定义页面有很多File出来的文件,可以在每个页面开始前再File出当前页面所需资源,减少启动时间。