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
暂无评论内容