4.11 插件 DLL
NSIS 脚本语言允许你通过一个 DLL 文件的函数扩展它的能力。可能最好的例子就是在每个 NSIS 发布的版本里附带的 InstallOptions.dll。
当 NSIS 编译器开始时它会扫描插件目录的 DLL 并且列出找到的插件和输出的函数。在编译时如果遇到有序的冒号如 fred::flintstone 编译器将会作为关键字在该列表中查找。如果列表项列入了 fred.dll 并输出 flintstone 则 NSIS 将会把 fred.dll 文件打包到安装程序里。
当插件命令执行时 NSIS 将会解压所需的插件 DLL 文件到一个临时目录 ($PLUGINSDIR),把指定的参数全部压入 (从右到左次序),然后执行 DLL 函数。如果指定了 /NOUNLOAD 选项则插件将不会卸载直到安装程序退出或下一次你使用该插件并不带 /NOUNLOAD 参数。需要注意的是最后一次调用该插件的时候必须不能有 /NOUNLOAD 否则插件将不能从 $PLUGINSDIR 里删除,而导致垃圾文件留在用户的机器里。
4.11.1 使用插件命令
一般插件的调用像下面这样:
InstallOptions::dialog "INI文件.ini"
所有的参数都压入堆栈 (在这个例子,该插件函数仅需要一个参数)。还有一些插件不需要在堆栈里有任何参数,而其他的有可能需要几个或更多。要使用插件命令你首先需要阅读插件附带的文档以了解该插件函数需要什么样的参数。
4.11.2 禁止插件卸载
如果你不希望在调用函数后就卸载该 DLL,你可以使用 /NOUNLOAD 作为第一个参数。例如:
dll::function /NOUNLOAD "参数"
你也可以使用 SetPluginUnload alwaysoff 来避免每次使用相同插件都要写 /NOUNLOAD。
4.11.3 手动调用插件
如果你想调用一个用户硬盘或其他地方里的插件,你可以使用 CallInstDLL。几乎所有插件都提供了安装程序的泛函数,所以使用插件命令是一个简易的方法。使用 CallInstDLL 对于你创建了插件并包含在你的应用程序里并被复制到安装目录里的情况来说非常有用。