如何在NSIS 3.03 Unicode中以字节为单位计算字符串长度
在将NSIS设置从2.46 Unicode移植到3.03 Unicode时,我遇到了一个问题,即使用系统插件在NSIS中的最大字符串长度附近工作:如何在NSIS 3.03 Unicode中以字节为单位计算字符串长度,unicode,nsis,Unicode,Nsis,在将NSIS设置从2.46 Unicode移植到3.03 Unicode时,我遇到了一个问题,即使用系统插件在NSIS中的最大字符串长度附近工作: System::Alloc 8096 Exch $1 IntOp $2 $1 + 0 ${For} $iLoopIndex1 1 $stackSize ${stack::dll_read} "$stacktext" "$iLoopIndex1" $TmpVal $stackReturn StrLen $3 "$Tm
System::Alloc 8096
Exch $1
IntOp $2 $1 + 0
${For} $iLoopIndex1 1 $stackSize
${stack::dll_read} "$stacktext" "$iLoopIndex1" $TmpVal $stackReturn
StrLen $3 "$TmpVal"
System::Call "*$2(&t$3 $\"$TmpVal$\")"
IntOp $2 $2 + $3
${Next}
System::Call "user32::SetWindowText(i $CstPage.InfoExt.Text, i r1) i .s"
Pop $TmpVal
System::Free $1
该函数还使用了我们移植来支持Unicode的堆栈插件
StrLen返回字符串中的字符数,然后用于将字符串添加到缓冲区。对于Unicode构建,一个字符填充两个字节,这会破坏缓冲区中的文本
我通过将StrLen的结果加倍,解决了这个问题
现在的问题是:
NSIS Unicode安装程序与Windows一样使用UTF-16LE字符串。UTF-16LE在字符(代理项对等)方面不是固定宽度,但可以安全地将
StrLen
的返回值加倍
常见的“以字节为单位的字符串大小”习惯用法如下所示:
StrLen $1 "$2"
IntOp $1 $1 + 1 ; Add \0 terminator
!if "${NSIS_CHAR_SIZE}" > 1
IntOp $1 $1 * ${NSIS_CHAR_SIZE}
!endif
DetailPrint "$2 is $1 bytes"
是字符代码单位的大小;1个在ANSI安装程序中,2个在Unicode安装程序中