绕过 NSIS 中 8192 字节的 var 限制?
Getting around the 8192 byte var limit in NSIS?
我正在向通过 NSIS 脚本编写安装程序的用户提供 c++ .dll。使用 System.dll,用户可以这样调用我的 .dll:
System::Call 'my.dll::GetJson(v) t .r0'
DetailPrint [=10=]
GetJson() 的 return 值存储在 $0 中。这一切都正常工作,尽管 GetJson() 可能 return 一个 json 长度大于 8192 的 blob,在这种情况下,存储在 $0 中的值会被截断。
我试图通过使用 scons 自己构建 NSIS 来增加 NSIS_MAX_STRLEN,如此处所述:https://nsis.sourceforge.io/Special_Builds
scons NSIS_MAX_STRLEN=16384 PREFIX=C:\somewhere install-compiler install-stubs
然而,在这样做之后,NSIS 编译的 .exes 在 运行 上崩溃了。似乎 8192 可能是某种内存限制。
我有什么办法解决这个问题吗?例如,是否可以调用
System::Call 'mydll::GetJson(v) t .r0'
但不是将 return 值存储在 $0 中,而是将其拆分为多个块?也许可以先将 GetJson() 的内容写入文件,然后 NSIS 可以读取并拆分它?
感谢任何帮助。谢谢。
如果用户需要编辑很长的字符串,您基本上有两个选择:
使用系统插件填充nsDialogs自定义页面的文本域。您不能使用寄存器来存储字符串,您需要使用 ...func()p.r0
从您的插件中获取字符串的原始地址并使用 Sendmesage 来填充文本字段。为了节省您需要分配内存,使用 SendMessage 获取文本并将其写入文件,最后释放内存。
另一种选择是使用自定义插件创建自定义页面。
我正在向通过 NSIS 脚本编写安装程序的用户提供 c++ .dll。使用 System.dll,用户可以这样调用我的 .dll:
System::Call 'my.dll::GetJson(v) t .r0'
DetailPrint [=10=]
GetJson() 的 return 值存储在 $0 中。这一切都正常工作,尽管 GetJson() 可能 return 一个 json 长度大于 8192 的 blob,在这种情况下,存储在 $0 中的值会被截断。
我试图通过使用 scons 自己构建 NSIS 来增加 NSIS_MAX_STRLEN,如此处所述:https://nsis.sourceforge.io/Special_Builds
scons NSIS_MAX_STRLEN=16384 PREFIX=C:\somewhere install-compiler install-stubs
然而,在这样做之后,NSIS 编译的 .exes 在 运行 上崩溃了。似乎 8192 可能是某种内存限制。
我有什么办法解决这个问题吗?例如,是否可以调用
System::Call 'mydll::GetJson(v) t .r0'
但不是将 return 值存储在 $0 中,而是将其拆分为多个块?也许可以先将 GetJson() 的内容写入文件,然后 NSIS 可以读取并拆分它?
感谢任何帮助。谢谢。
如果用户需要编辑很长的字符串,您基本上有两个选择:
使用系统插件填充nsDialogs自定义页面的文本域。您不能使用寄存器来存储字符串,您需要使用 ...func()p.r0
从您的插件中获取字符串的原始地址并使用 Sendmesage 来填充文本字段。为了节省您需要分配内存,使用 SendMessage 获取文本并将其写入文件,最后释放内存。
另一种选择是使用自定义插件创建自定义页面。