《NSIS插件开发标准规范》是一份详细指导开发者遵循最佳实践和编码准则来创建高质量NSIS插件的文档。它涵盖了从设计到发布的整个过程,并提供了一系列推荐的方法论、模板及示例代码,旨在促进兼容性和可维护性的同时加速开发流程。
### NSIS插件开发规范详解
#### 一、概述
NSIS (Nullsoft Scriptable Install System) 是一款开源的Windows安装程序制作工具,以其轻便高效的特点受到许多开发者的青睐。尽管NSIS提供了丰富的功能来满足大部分安装需求,但在某些情况下,用户可能会遇到一些超出内置功能限制的需求。为了解决这一问题,NSIS提供了插件开发接口,允许开发者通过编写DLL文件来扩展其功能。
#### 二、插件基础
##### 2.1 插件的调用方式
从NSIS 2.x版本开始,使用插件变得更加便捷。在NSIS脚本中可以直接使用`DLL::func`这样的格式来调用插件中的命令,其中`DLL`代表插件DLL文件名,而`func`是导出函数的名称。编译器会自动处理DLL的打包和释放过程。
- 当安装程序运行时,编译器会将所需的DLL复制到临时目录 `$PLUGINSDIR`。
- 安装程序执行完毕后,该目录中的内容会被清理。
##### 2.2 临时目录 `$PLUGINSDIR`
- **作用**:用于存放运行时所需的插件DLL文件。
- **创建**:通常由NSIS在需要调用插件命令时自动创建。
- **手动创建**:若需提前使用该目录(例如释放图片资源等),可以使用`InitPluginsDir`命令手动创建。
#### 三、插件的技术细节
##### 3.1 函数导出格式
插件中的函数必须遵循特定的导出格式:
- **导出函数必须为C风格**:这意味着即使使用非CC++语言(如Delphi或Win32ASM)编写,也需要按照C语言规则来导出。
- **调用约定为“__cdecl”**:这是为了确保堆栈清理正确完成。
示例如下:
```c
#ifdef __cplusplus
extern C
#endif
__declspec(dllexport)
void __cdecl myFunction(HWND hwndParent, int string_size, TCHAR *variables, stack_t** stacktop, extra_parameters* extra);
```
- **参数解析**:
- `HWND hwndParent`: 主窗口句柄,可通过NSIS脚本中的常量 `$HWNDPARENT` 引用。
- `int string_size`: 变量长度为1024字节(即最多包含511个中文字符)。
- `TCHAR *variables`: 指向变量数组的指针。
- `stack_t** stacktop`: 堆栈顶指针。
- `extra_parameters* extra`: 额外参数结构体指针。
##### 3.2 窗口句柄的使用
- **获取主窗口句柄**: 使用 `$HWNDPARENT`。
- **获取控件句柄**:
- 对于父窗口中的控件,可以通过 `GetDlgItem($R0, $HWNDPARENT, 控件ID)` 获取。
- 对于子窗口中的控件:
- 首先找到子窗口的句柄:使用 `FindWindowEx(hwndParent, NULL, WC_DIALOG, NULL)`
- 然后通过 `GetDlgItem($R0, 子窗口句柄, 控件ID)` 来获取具体控件。
##### 3.3 变量长度
- **固定长度**:默认变量长度为1024字节(即最多包含511个中文字符)。
- **定义方式**:在NSIS源码中通过宏 `NSIS_MAX_STRLEN` 定义,脚本中可通过 `${NSIS_MAX_STRLEN}` 引用。
#### 四、总结
NSIS插件开发为扩展其功能提供了强大的支持。遵循上述规范和技术细节可以轻松地开发出满足特定需求的插件。无论是增加新功能还是优化现有流程,插件都是NSIS生态系统中的重要组成部分。对于希望深入研究或拓展NSIS功能的开发者而言,掌握这些核心概念至关重要。