杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2379|回复: 0

使用NSIS制作便携软件:以PotPlayer Portable为例

[复制链接]
发表于 2017-2-23 20:30:44 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前言
我推荐大家使用P.A.L来制作便携软件,重新制作轮子是没有必要的。关于便携软件的多个难点,例如多实例、进程控制、非正常退出恢复、临时复制到本地运行、环境变量、路径替换等等,在P.A.L中都有相当成熟的解决方案,用户只用填写一个ini,而不需要考虑便携软件是怎样运行的。省时省力、稳定可靠是其优点。但是,有的时候我们不得不编写一段自定义代码 (custom code)才能实现某些要求,或者你是个代码狂人,喜欢看到自己指尖的代码编译成屏幕上运行的程序,那么就必须接触P.A.L的母体——NSIS。

Nullsoft 脚本安装系统(Nullsoft Scriptable Install System)是一个开放源代码的安装程序制作工具,(Nullsoft 也是WinAmp的制作方)。使用一种制作安装程序的语言来制作一种从不需要安装的程序——PortableApps,再适合不过了。因为从本质来讲,Portableapps的运行原理,其实就是在程序启动时进行一次“安装”,在程序结束后进行一次“卸载”(当然这个时间一般非常快)。PortableApps Launcher的主要对象无非是注册表项与文件,而处理这些,正是NSIS的长项。NSIS语言简明易懂,特别擅长处理windows系统中的进程、注册表与文件。以下以PotPlayer Portable为例,浅谈使用NSIS制作便携软件的一般流程。

要做什么?
通过虚拟机观察得知,当PotPlayerMini.exe同目录存在PotPlayerMini.ini时,PotPlayer将配置保存在此ini中,否则,则将配置保存在注册表中。

因此,我们可以有两种选择:让PotPlayer保存配置在注册表,并在结束时导出为reg文件;或者保证其运行时目录下存在PotPlayerMini.ini,在结束后将PotPlayerMini.ini移至 Data 目录(程序与配置分离原则)。后一种选择的优点是,PotPlayer Portable 可以与系统中安装的PotPlayer 或其它位置的PotPlayer Portable 同时运行,不会互相干扰。因此我选择了保存配置进 ini 的方案。

另外,我希望PotPlayer Portable首次运行时显示XMP-Gray-Tab 这个皮肤,而不是默认的棒子文皮肤。因此,需要创建一个DefaultData。

前期准备:
创建 PotPlayerPortable 文件夹,创建 App\AppInfo ,App\DefaultData , App\PotPlayer ,Sources 。

将PotPlayer 程序文件放在 App\PotPlayer 目录中。

在 App\DefaultData 中创建 PotPlayerMini.ini ,写入:
  1. [Settings]
  2. LastSkinName=[smilefly]XMP-Gray-Tab.dsf ;定义默认皮肤
复制代码


取 PotPlayer 图标,保存为:App\AppInfo\appicon.ico 。

在 Source\中创建 PotPlayerPortable.nsi ,开始敲代码吧。以下分为3段讲解这个nsi文件。

定义变量:
将固定的文件、注册表项以变量的形式在文件头部声明,不但可以少敲些文字,也有利于减少笔误。

完整脚本
游客,如果您要查看本帖隐藏内容请回复


Restore 函数:之所以不将 Restore 写入 Section ,而是写成 Function ,是为了方便“CheckGoodExit”段的调用。

完成:
就是这么简单。打开NSIS,选择 Compile NSI scripts ,把保存的nsi文件拖进去,编译成功后,在 PotPlayerPortable 根目录则会生成 PotPlayerPortable.exe。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-8 15:44 , Processed in 0.107346 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表