【问题标题】:How to add count down timer in InstallScript code?如何在 InstallScript 代码中添加倒数计时器?
【发布时间】:2018-05-28 10:56:39
【问题描述】:

我已经创建了一个基本的 MSI 项目,并且我已经编写了一个 InstallScript 自定义操作来从服务器下载文件。我为此使用了CopyFile() 函数。在此下载过程中,我还会显示 sdShowMsg()。但是当下载服务器没有响应时,sdShowMsg() 对话框保持原样在屏幕上并在后台下载,不会发生。那么有没有办法添加一个倒数计时器,它只会在这段时间内执行下载操作,然后退出。或者有没有其他方法可以首先检查下载服务器是否响应?

SdShowMsg("Please Wait... Downloading file from our server...", TRUE);
CopyFile("https://<downloadURL>/sample.rtf", szEULAFile);
SdShowMsg("Please Wait... Downloading file from our server...", FALSE);

【问题讨论】:

    标签: windows-installer installscript installscript-msi


    【解决方案1】:

    您可以将 CopyFile 调用替换为外部命令以下载文件,然后使用 LaunchApp() 函数设置超时。 这是一个使用powershell的小伪示例(您也可以使用curl.exe和许多其他方法从命令行下载文件)

    nOptions = LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN | LAAW_OPTION_FIXUP_PROGRAM | LAAW_OPTION_SHOW_HOURGLASS;
    LAAW_PARAMETERS.nTimeOut = 30000;  // 30 seconds
    SdShowMsg("Downloading, please wait...", TRUE);
    nResult = LaunchAppAndWait( "powershell", "-Command \"Invoke-WebRequest -Uri https://example.com/sample.rtf -OutFile " + szEULAFile + "\"", nOptions); 
    SdShowMsg("", FALSE);
    if nResult < 0 then
      // failed to launch, notify the user
    elseif (nResult == 5) || (nResult == 259) then
      // timeout reached, notify the user
    endif;
    

    【讨论】:

    • 感谢 yossiz74 提供此解决方案。但这里的一个问题是子进程。如果我正在下载一个需要超过 30 秒的文件,那么在这种情况下,即使达到超时,子进程仍然存在于后台。为此,我使用了标志 LAAW_OPTION_WAIT_INCL_CHILD,但它不考虑超时。
    • 正确。我找到了我的一个旧项目,在那里我遇到了这种情况,并通过调用 taskkill 命令终止已启动的进程(包括子进程)来处理它。像这样 LaunchAppAndWait("TASKKILL","/F /PID " + LAAW_PROCESS_INFORMATION.dwProcessId + " /T", WAIT);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2018-05-25
    相关资源
    最近更新 更多