【问题标题】:Getting around the 8192 byte var limit in NSIS?绕过 NSIS 中的 8192 字节 var 限制?
【发布时间】:2020-07-17 17:20:03
【问题描述】:

我正在向正在通过 NSIS 脚本编写安装程序的用户提供 c++ .dll。使用 System.dll,用户可以这样调用我的 .dll:

System::Call 'my.dll::GetJson(v) t .r0'
DetailPrint $0

GetJson() 的返回值存储在 $0 中。这一切都正常工作,尽管 GetJson() 可能会返回一个长度大于 8192 的 json 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 编译的 .exe 在运行时崩溃。似乎 8192 可能是某种内存限制。

我有什么办法解决这个问题吗?例如,是否可以调用

System::Call 'mydll::GetJson(v) t .r0'

但是不是将返回值存储在 $0 中,而是将其拆分为块吗?也许可以先将 GetJson() 的内容写入文件,然后 NSIS 可以读取并拆分它?

感谢任何帮助。谢谢。

【问题讨论】:

  • 如果拆分字符串是可以接受的,那是否意味着您不需要在 NSIS 中解析/修改字符串?
  • @Anders Oof 好点子。用户将需要解析该 JSON,因此拆分可能对我没有帮助。

标签: c++ json dll nsis


【解决方案1】:

如果用户需要编辑一个很长的字符串,你基本上有两种选择:

使用系统插件在 nsDialogs 自定义页面上填充文本字段。您不能使用寄存器来存储字符串,您需要使用...func()p.r0 从您的插件中获取字符串的原始地址并使用 Sendmesage 填充文本字段。为了节省您需要分配内存,使用 SendMessage 获取文本并将其写入文件并最终释放内存。

另一种选择是使用您的自定义插件创建自定义页面。

【讨论】:

  • 啊,这是一个有趣的技术。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-03-16
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2012-04-16
  • 2021-03-28
  • 2017-10-23
相关资源
最近更新 更多