打破8192字节限制的更简单方法
优质
小牛编辑
133浏览
2023-12-01
一个更简单的方法,无需插件。生成安装文件更加的小。
引用 Setup.nsi 的内容:
/*----------------------------------------------/ / 关于 NSIS 自定义控件写入超过 8192 字节的插件。/ / 理论上如果控件能够容纳,多大的文本都能放入 / /----------------------------------------------*/ !include "MUI.nsh" !include "LogicLib.nsh" Name "test" OutFile "Setup.exe" SetCompressor lzma ; 设置 lzma 压缩方式 Var hwnd ; 自定义页面的窗口句柄 Page custom PageInitFunc "" # 自定义页面 !insertmacro MUI_PAGE_INSTFILES # 安装过程页面 !insertmacro MUI_LANGUAGE "SimpChinese" # 设置安装界面语言 ReserveFile "io.ini" # 预先打包文件,方便安装加速释放 ReserveFile "license.txt" # 预先打包文件,方便安装加速释放 Function .onInit InitPluginsDir File "/oname=$PLUGINSDIR\io.ini" "io.ini" ; 释放 io.ini 文件 File "/oname=$PLUGINSDIR\license.txt" "license.txt" ; 释放 license.txt 文件,该文件是一个超过 30 KB 的文本文件 FunctionEnd Function PageInitFunc InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\io.ini" Pop $hwnd ; 获取自定义页面的窗口句柄 GetDlgItem $1 $hwnd 1200 ; 控件句柄获取公式 (1200 + field 1 - 1) Push "$PLUGINSDIR\license.txt" # 在堆栈中压入 大文本文件 Push $1 # 在堆栈中压入 控件句柄 Call ShowText # 调用过程,在控件中加入大文本 InstallOptions::show ; 显示自定义页面 Pop $0 FunctionEnd Function ShowText # 如果你对程序设计不熟悉,那么你可以不用理解这个过程,把它复制到你的脚本中就可以了。 Exch $R0 ;控件句柄 Exch Exch $R1 ;文件 Push $R2 Push $R3 Push $R4 Push $R5 ClearErrors FileOpen $R2 $R1 r ;$R2 = 文件句柄 ${Unless} ${Errors} ;确保打开文件没有发生错误 System::Call /NOUNLOAD "Kernel32::GetFileSize(i, i) i (R2, 0) .R3" ;$R3 = 文件大小 IntOp $R3 $R3 + 1 System::Alloc /NOUNLOAD $R3 ;分配内存 Pop $R4 ;内存地址 ${If} $R4 U> 0 ;确保分配了内存 System::Call /NOUNLOAD "*(i 0) i .R5" System::Call /NOUNLOAD `Kernel32::ReadFile(i, i, i, i, i) i (R2, R4R4, R3, R5R5, 0)` System::Call /NOUNLOAD "*$R5(i .R1)" ${If} $R1 > 0 System::Call /NOUNLOAD "User32::SendMessage(i, i, i, i) i (R0, ${WM_SETTEXT}, 0, R4)" ${EndIf} System::Free /NOUNLOAD $R5 System::Free $R4 ;释放内存 ${EndIf} FileClose $R2 ${EndUnless} Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Pop $R0 FunctionEnd Section "sec a" SEC1 SectionEnd
引用 io.ini 的内容:
[Settings] NumFields=1 [Field 1] Type=Text Flags=MULTILINE|VSCROLL State=Text Left=2 Right=299 Top=3 Bottom=137