NSIS插件教程(附插件API)

NSIS插件是一个DLL,导出的函数都有相同的参数,它的形式如下:

void __declspec(dllexport) [函数名](HWND hWndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)

也就是说要增加一个导出函数,只是[函数名]那里不同,这个名称你自己定的
一般来说,调用第一个DLL中的函数时,这个函数需要初始化NSIS的堆栈信息和注册插件回调函数
其中前者的目的是得到NSIS中传过来的参数,参数是通过堆栈来获取的,因此要初始化堆栈信息
有一个用来初始化的宏:

NSIS_PLUGIN_INIT();

还有就是注册插件回调了,如果没有注册,貌似会出错,这个注册的目的是为了让NSIS知道怎么卸载这个插件
卸载时产生2个消息,注册是这样:

extra->RegisterPluginCallback(g_hInstance, PluginCallback);

插件回调函数是这样的:

UINT_PTR PluginCallback(NSPIM msg)
{
 // 利用插件回调来释放资源!
 if (msg == NSPIM_GUIUNLOAD) 
 {
 // 有需要就用
 }
 else if (msg == NSPIM_UNLOAD)
 {
 // 
 }

 
 return 0;
}

插件函数举个例子:

void __declspec(dllexport) test(HWND hWndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
{
 HWND hWnd = hWndParent;
 int n;
 char str[MAX_PATH];

 NSIS_PLUGIN_INIT();
 // g_hInstance是一个全局变量,一般在DllMain中由hModule得到
 extra->RegisterPluginCallback(g_hInstance, PluginCallback);

 n = popint();
 popstringn(str,1024);

 // 使用pop出来的参数做你想做的事
 // ...
}

NSIS中调用就是(假如dll名称是plugin):
plugin::test 参数1 参数2 参数3 参数4 “有空格的 参数” 1 -1 0.0

参数其实全部都是字符串,所以,这里的参数多少你自己定,主要是在插件函数中popstringn、popint等函数的调用
你自己pop出来了

这里的参数给了这么多,但是test函数中只pop了2次,因此只有前面2个参数被用到

===============================================================================
注意:如果是使用C++,那么还需要一个模块定义文件,这样就能保证导出的函数是C风格的

THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容