NSIS插件使用及开发
NSIS 内置了很多指令,这些指令可以满足我们基本需求,但难免会遇到 NSIS 没有内置的功能,如进程操作,后台运行(即多线程),7z 压缩等等,这个时候我们就需要借助第三方插件来满足我们所需要的功能了。
获取插件
NSIS 官方收录插件的网址是:
http://nsis.sourceforge.net/Category:Plugins
我们可以在这个网站上查找和下载我们需要的插件,该网站上针对每个插件都提供了比较完善的示例。
使用插件
NSIS 插件以 dll 的形式存在,我们以KillProc插件为例(从名字上可以看出该插件提供杀进程的功能),我们下载下来的一般是压缩包,解压之后找到对应插件 dll 文件,如KillProc.dll文件。

使用步骤如下:
将 dll 文件拷贝到 NSIS 安装目录下的
Plugins\x86-ansi目录(Unicode 插件需要拷贝到Plugins\x86-unicode目录)。在官方文档上找到该插件所提供的函数,以及函数的参数传递形式、返回值形式。
NSIS 中插件函数的参数传递形式有 2 种形式:- 使用
$0 ~ $9,$R0 ~ $R9来传递。 - 使用堆栈来传递。
- 使用
在 NSIS 脚本中按照函数声明的形式来调用,需要在函数名前加上 dll 名称(不需要.dll 后缀),如
KillProc::KillProcesses。
1 | Section |
开发插件
虽然 NSIS 官方提供了很多插件,也有一些第三方的插件可以下载使用,但在实际开发中难免会遇到已有插件没有提供的功能或者插件不好用的情况,这时我们可以选择自己开发 NSIS 插件。
插件开发规范
NSIS 插件对开发语言没有限制(本文介绍基于 C++开发),只要按照 NSIS 标准所要求的生成一个 dll 文件,该 dll 文件提供纯C规范的、固定格式的导出函数即可。
总结起来,开发 NSIS 插件的步骤为:
使用 Visual Studio 新建 dll 工程(运行库选择
MT或MTD),建议使用的 MT 运行库,不需要额外携带运行时文件。定义插件功能函数,假设函数名为 add,则函数声明格式如下:
1
2
3
4
5
6extern "C" __declspec(dllexport) void __cdecl add (
HWND hwndParent,
int string_size,
char *variables,
stack_t **stacktop,
extra_parameters *extra);编译生成 dll 文件。
参数和返回值
开发 NSIS 插件的难点在于:获取调用者传入的参数,以及将执行结果返回给调用者。插件中的函数有两种传参方式:
- 一种是通过
$0~$9 $R0~$R9的形式,这种形式的参数通过char *variables参数来获取。 - 一种是通过堆栈的形式,这种形式的参数通过
stack_t **stacktop参数来获取。
PluginCommon
为了方便插件开发中获取用户传入参数、以及执行结果的返回,我对插件开发的常用操作进行了封装。
1 | // PluginCommon.h |
在开发插件中经常用到的有:
4 个堆栈操作函数:pushint,pushstring,popint,popstring。
2 个寄存器变量($R0~$R9,$0~$9)操作函数:getuservariable,setuservariable。
示例
基于上面的 PluginCommon.h,我们可以将开发插件的步骤流程大大简化。
1 |
|
Unicode 支持
大家可能注意到了上面的示例和PluginCommon.h中使用的都是char,而不是wchar_t。那如果要改成wchar_t需要哪些工作了?
- 将插件代码中的
char改成wchar_t。 - 在 nsi 脚本中加入
Unicode True。 - 需要将生成的插件 dll 放到 nsis 目录下的
Plugins\x86-unicode子目录中。