【发布时间】:2018-04-18 11:23:50
【问题描述】:
在将我们的 NSIS 设置从 2.46 移植到 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 "$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 编码?
- 长度加倍是否安全,NSIS 是否使用固定宽度的 Unicode 编码?
【问题讨论】: