NSIS DumpLog可以与64位版本一起使用吗?

时间:2014-03-05 12:57:15

标签: nsis

我正在使用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位这个功能?

1 个答案:

答案 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不支持文件上传,您可以将此图像AMD64 System.dll GIFAR重命名为.zip并在7Zip中将其打开)