NSIS转储日志能否与64位版本一起使用?
我正在使用NSIS的64位构建,除了DumpLog函数之外,其他所有功能都可以将安装日志写入文件 (NSIS 64在这里:) DumpLog使用Windows消息来获取文本值,看起来调用仅为32位 下面是该函数的一个示例: 它定义了不适用于64位的:NSIS转储日志能否与64位版本一起使用?,nsis,Nsis,我正在使用NSIS的64位构建,除了DumpLog函数之外,其他所有功能都可以将安装日志写入文件 (NSIS 64在这里:) DumpLog使用Windows消息来获取文本值,看起来调用仅为32位 下面是该函数的一个示例: 它定义了不适用于64位的: !define LVM_GETITEMCOUNT 0x1004 !define LVM_GETITEMTEXT 0x1073 我找到了LVM_GETITEMCOUNT的64位版本,即0x00001004 有没有人能用64位来实现这个函数 bit
!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x1073
我找到了LVM_GETITEMCOUNT的64位版本,即0x00001004
有没有人能用64位来实现这个函数 bitbucket端口不支持使用System::Call调用任意函数,该DumpLog函数也不兼容64位,因为它在需要
p
时使用i
类型,并且存在一些额外的填充问题
以下是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中打开)0x00001004与0x1004相同。。。