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风格的
https://yunpan.cn/cxKKICPSgzbxk (提取码:d975)