打破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