我正在使用64位版本的NSIS,除了DumpLog函数之外,所有内容都可以将安装日志写入文件。
(NSIS 64在这里:https://bitbucket.org/dgolub/nsis64)
DumpLog使用Windows消息来获取文本值,而且调用似乎只有32位。
以下是该功能的一个示例:
https://svn.xiph.org/trunk/oggdsf/build/NSIS/Release/extra/DumpLog.nsh
它定义了64位不正确的内容:
!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x1073
我找到了64位版本的LVM_GETITEMCOUNT,它是0x00001004。
有没有人用64位这个功能?
答案 0 :(得分:2)
bitbucket端口不支持使用System :: Call调用任意函数,并且DumpLog函数也不兼容64位,因为它在需要i
时使用p
类型并且还有一些额外的填充问题。
这是64位兼容版本:
!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x1073
Function DumpLog
Exch $5
Push $0
Push $1
Push $2
Push $3
Push $4
Push $6
Push $7
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1016
StrCmp $0 0 error
FileOpen $5 $5 "w"
FileWriteWord $5 0xfeff ; Write the BOM
StrCmp $5 0 error
SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6
System::Call "*(&t${NSIS_MAX_STRLEN})p.r3"
System::Call "*(i0,i0,i0,i0,&i${NSIS_PTR_SIZE} 0,p$3,i${NSIS_MAX_STRLEN},i0,p0)p.r1" ; NSIS_PTR_SIZE is used to align the pszText member on x64
StrCpy $2 0
loop: StrCmp $2 $6 done
System::Call "User32::SendMessage(p$0,i${LVM_GETITEMTEXT},p$2,pr1)p"
System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)"
FileWriteUTF16LE $5 "$4$\r$\n"
IntOp $2 $2 + 1
Goto loop
done:
FileClose $5
System::Free $1
System::Free $3
Goto exit
error:
MessageBox MB_OK|MB_ICONSTOP "Error at DumpLog"
exit:
Pop $7
Pop $6
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
Exch $5
FunctionEnd
你需要一个能够调用任意函数的System.dll版本,我担心唯一的办法是将官方SVN中继编译为64位。
(由于StackOverflow不支持文件上传,您可以将此图像重命名为.zip并在7Zip中将其打开)