winsoft666 / blog-comment

jiangxueqiao.com博客评论
MIT License
0 stars 0 forks source link

post/1273492093 #8

Open beaudar-bot opened 1 month ago

beaudar-bot commented 1 month ago

NSIS教程(8)-插件开发 - 独钓寒江雪

虽然 NSIS 官方提供了很多插件,也有一些第三方的插件可以下载使用,但在实际开发中难免会遇到已有插件没有提供的功能或者插件不好用的情况,这时我们可以选择自己开发 NSIS 插件。

https://jiangxueqiao.com/post/1273492093.html

ss1969 commented 1 month ago

老板你好,用你的PluginCommon写的插件,有一个问题,就是似乎全局变量不能用,要怎么处理?比如下面这样,我set后再read,永远都是-1


int s_int = -1;

extern "C" __declspec(dllexport) void __cdecl
Set(HWND hwndParent, int string_size, wchar_t* variables, stack_t** stacktop, extra_parameters* extra)
{
    NSMETHOD_INIT(hwndParent);
    {
        s_int = popint();
    }
}

extern "C" __declspec(dllexport) void __cdecl
Read(HWND hwndParent, int string_size, wchar_t* variables, stack_t** stacktop, extra_parameters* extra)
{
    NSMETHOD_INIT(hwndParent);
    {
        pushint(s_int);
    }
}
winsoft666 commented 1 month ago

可能是NSIS在调用完插件的Set函数后就将插件卸载了,后面再调用Read时又是重新加载的。 可以使用 SetPluginUnload 设置不自动卸载插件。

https://jiangxueqiao.com/post/1923360270.html#SetPluginUnload

ss1969 commented 1 month ago

确实是卸载的原因。但是这个情况比较神奇。 我的插件里面有多个函数,我的理解是,只要第一次调用这个插件内的方法,这个插件就一直不会卸载。实际上不是。

    nsMisc::LogInit "${LOG_FILE}"
    nsMisc::LogInfo "${LOG_FILE}" "Installer Started V${PRODUCT_VERSION}"
    nsMisc::Set /NOUNLOAD 8
    nsMisc::Read
    Pop $0
    MessageBox MB_OK $0
    nsMisc::LogInit /NOUNLOAD "${LOG_FILE}"
    nsMisc::LogInfo "${LOG_FILE}" "Installer Started V${PRODUCT_VERSION}"
    nsMisc::Set 8
    nsMisc::Read
    Pop $0
    MessageBox MB_OK $0

然后,这样确实可以。

SetPluginUnload                     alwaysoff

而且我看 https://nsis-dev.github.io/NSIS-Forums/html/t-345527.html 提到/NOUNLOAD 早已废弃,不过我没看懂怎么用新的方法。

其次,请问为什么temp目录(也就是所谓的plugindir) 里面的东西删除是自己操作还是nsis自动的?