在“自定义NSIS”页面中下载文件

时间:2018-10-06 09:37:50

标签: nsis

我想创建一个安装程序,该安装程序使用inetc插件下载文件而无需冻结UI。我的问题是,使用带有/ ASYNC标志的ExecDos :: Exec,然后使用ExecDos :: Wait,可以不使用

此外,我不需要安装程序中的安装页面。 这是我的代码:

!macro DOWNLOAD_PAGE
    Function myTimer
        ${If} $0 == "OK"
            ${NSD_KillTimer} myTimer
            SendMessage $hPBar ${PBM_SETRANGE32} 0 100
            SendMessage $hPBar ${PBM_SETPOS} 100 0
            Return
        ${EndIf}

        SendMessage $hPBar ${PBM_SETRANGE32} 0 100
        SendMessage $hPBar ${PBM_SETPOS} 50 0

    FunctionEnd

    function Page1
        nsDialogs::Create 1018
        Pop $Dialog

        ${NSD_CreateLabel} 0 0 100% 50% "Starting download..."
        Pop $hInfo

        ${NSD_CreateProgressBar} 0 55% 100% 10u ""
        Pop $hPBar

        ${NSD_CreateTimer} myTimer 1000
        inetc::get /silent "$URL\skype.exe" "$EXEDIR\skype.exe" /end
        Pop $0
        nsDialogs::Show
    functionEnd 

    function Page2
    functionEnd 
    Page Custom Page1 Page2
!macroend

  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"

  !insertmacro DOWNLOAD_PAGE
  !insertmacro MUI_PAGE_FINISH

或者我唯一的选择是将ExecDos :: Exec与/ ASYNC标志一起使用? 也许,解决方案是创建另一个可以下载的nsis安装程序?

1 个答案:

答案 0 :(得分:0)

nsDialogs::CreatensDialogs::Show之间执行长操作将使UI挂起。

简单的解决方案是在Section中下载,因为它们是在不同的线程中执行的。您应该在Section中执行大多数任务。

如果您坚持要在自定义页面上下载内容,则可以使用InetBgDL plug-in

!include nsDialogs.nsh
!include LogicLib.nsh

Page Custom Page1
Var hInfo

Function Page1
nsDialogs::Create 1018
Pop $0
${NSD_CreateLabel} 0 0 100% 50% "Starting download..."
Pop $hInfo

InitPluginsDir
INetBgDl::Get "https://example.com/file.exe" "$PluginsDir\file.exe" /end

${NSD_CreateTimer} myTimer 1000
nsDialogs::Show
${NSD_KillTimer} myTimer
FunctionEnd

Function myTimer
InetBgDL::GetStats
${NSD_SetText} $hInfo "Status=$0$\nCompleted files=$1$\nDownloaded $3 of $4 bytes"
${If} $0 = 0 ; HTTP status code or 0 if completed without errors
    ${NSD_KillTimer} myTimer
    MessageBox mb_ok Done
${EndIf}
FunctionEnd