因为新公司需要开发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出当前页面所需资源,减少启动时间。

使用nsis开发自定义安装包使用心得,以及遇到坑的更多相关文章

  1. VM安装之分区、自定义安装包

    一.分区 1.一般分为3个区:/root .swap./ 1)./root:引导分区.存放引导文件和Linux内核等. 启动文件:用于判断你需要启动哪个操作系统或者哪个内核: 内核:程序与硬件之间的桥 ...

  2. NSIS使用教程(安装包制作安装文件教程,如何封装打包文件) 中文版

    nsis中文版(Nullsoft Scriptable Install System)是一个专业的开源的可以用来封闭Windows程序的实用工具,是一个开源的 Windows 系统下安装程序制作程序. ...

  3. python自定义安装包

    python的第三方模块越来越丰富,涉及的领域也非常广,如科学计算.图片处理.web应用.GUI开发等.当然也可以将自己写的模块进行打包或发布.一简单的方法是将你的类包直接copy到python的li ...

  4. NSIS 制作简单安装包

    ;replace NSIS/Contrib/zip2exe/Modern.nsh;NSI format: Asni;http://nsis.sourceforge.net/ ;UAC级别Request ...

  5. 转---B/S结构JavaEE WebApp的全自动安装包制作心得

    JavaEE的Web应用程序如今已大行其道,但其安装.配置.部署却一直繁琐无比,客观上阻碍了Web应用程序更大规模的推广和应用.因此,开发方制作一个集JDK.Web中间件.开源数据库的全自动安装程序很 ...

  6. iOS企业开发plist安装包实现

    第一步: 在使用MACBOOK导出ipa的时候,我们得到ipa的同时,还得到一份plist文件 看到我们导出的plist,需要注意的地方有两个已经用中文标注. 一个是URL,一个是bundle-ide ...

  7. java开发相关工具安装包分享

    链接:https://pan.baidu.com/s/19rSlXhrZ9AtNdai64tErGQ 提取码:04up

  8. Electron实战:创建ELectron开发的window应用安装包

    前言:研究electron自动更新的时候,在electron的官方文档auto-updater 中,提到了在几个平台mac,Linux,windows下electron 的自动更新方法,其中winds ...

  9. NSIS打包(二)第一个安装包

    基本介绍完之后,我们大概了解了NSIS中有哪些组件,现在我们通过一个简单的demo来学习如何使用这些组件. 1.环境配置 NSIS的环境非常简单,只有一个安装包,安装后即可使用. 官网:http:// ...

随机推荐

  1. 我想和你们说说java和C++___C加加

    头痛头痛之一: java里面,本质上来说,一个类是一个程序员定义的类型,类是一种引用类型(reference type),这意味着该类类型的变量都可以引用该类的一个实例.从表面上,对象引用变量中似乎存 ...

  2. 解决 eclipse cdt 运行时控制台乱码解决

    1 点击黑色 倒三角 按钮 选择 run configurations 2 2.1 点击new 添加 LANG = en_US 2.2 选择 replace native environment wi ...

  3. Json的访问

    JSON:JavaScript 对象表示法(JavaScript Object Notation) 写法:名称/值对 访问方法:可以通过 data.名称 访问,也可以通过 data['名称'] 访问 ...

  4. Makefile2

    规范 target可以是Object file, 可执行文件或者标签(标签一般没有依赖) 越靠近最终结果的target卸载越前面 定义target前, 定义CC, SRC, CFLAGS, OBJS, ...

  5. kindeditor编辑区空格被隐藏,导致所见所得不一致的解决办法

    1.修改kindereditor-all.js中的 var re = /(\s*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[ ...

  6. js对象动态赋值

    <view class="movies-template"> <template is="movieListTemplate" data=&q ...

  7. php数组转json对象并保留数字索引

    本文要解决的问题是php不带索引的数组转换为json对象(而非默认的json数组) php中数组转json使用的方法是系统自带的:json_encode php中数组转json的规则是:当没有指定索引 ...

  8. ASP.NET 4.5 尚未在 Web 服务器上注册。您需要手动将 Web 服务器配置为使用 ASP.NET 4.5,这样您的网站才能正确运行。

    系统换成Windows10安装VS2012打开项目总提示:vs2012 aps.NET 4.5尚未在web服务器上注册,您需要手动将Web服务器配置为使用ASP.Net 4.5,这样您的网站才可能正确 ...

  9. nopCommerce 4.10 发布了

    我们的开发工作主要集中在将nopCommerce转移到.NET Core 2.1,性能和架构改进,进一步增强和修复错误. NopChommerce 中文社区:http://www.nopcn.com ...

  10. elasticsearch排序-----5

    我们之前查询出的结果都会有一个_score分值表示列出结果与搜索结果的相关性,该值越高排序位置越靠前,es具体是如何计算该值的,我们认真来看看. 1.根据字段值排序 比如我们要查询/index5下su ...