在Qt安装程序框架(QtIFW)安装程序中安装VC ++ Redistributables?

时间:2016-05-01 21:40:07

标签: qt installer qt-installer

我正在使用Qt Installer Framework(v2.0.1)为我的应用程序构建安装程序。我正在为Windows上的x86和x64构建我的应用程序,因此我正在为每个体系结构构建一个安装程序,每个体系结构中都包含不同的VC ++ Redistributables(来自MSVC ++ 2013的vcredist_x86.exe和vcredist_x64.exe)。 QtIFW文档令人沮丧的细节,但我发现我可以在installscript.qs中添加一个操作,以便在我的文件被提取后以静默方式运行vcredist安装程序:

component.addOperation("Execute", "@TargetDir@/vcredist_x64.exe", "/quiet", "/norestart");

但是我遇到了确定我的安装程序是x86还是x64版本的问题。有没有办法从installscript确定这个?也许是一种查看要提取的文件列表的方法?或者是否有更简单的方法来完成安装VCRedists这个看似常见的任务?

文档只说明了这一点:

  

要在最终用户的系统上安装运行时库,您需要在应用程序中包含相应的Visual C ++ Redistributable Package(VCRedist)可执行文件,并确保在用户安装应用程序时执行该文件。

但它没有提供关于如何“确保它被执行”的任何细节。

2 个答案:

答案 0 :(得分:3)

我有类似的问题。您可以使用systeminfo.currentCpuArchitecture 获取系统架构。为了找出,给定的架构是否是x64,我做的是:

if(systemInfo.currentCpuArchitecture.search("64") < 0) {
    //x86
} else {
    //x64
}

注意:这将返回OS体系结构,因此x64 CPU上的x86 OS将被视为x86。

编辑:看看:https://github.com/Skycoder42/QtIFW-Advanced-Setup。它是我创建的一个示例项目,它可以提供许多额外的功能来改进QtIFW的使用,例如修复安装路径或正确处理离线/在线安装程序。

答案 1 :(得分:0)

这是我用来在installscript.qt中执行此操作的完整功能。仅64位。它检查是否有一个比当前可用版本(26706)小的版本:

Component.prototype.installVCRedist = function()
{
    var registryVC2017x64 = installer.execute("reg", new Array("QUERY", "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\x64", "/v", "Installed"))[0];
    var doInstall = false;
    if (!registryVC2017x64) {
        doInstall = true;
    }
    else
    {
        var bld = installer.execute("reg", new Array("QUERY", "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\x64", "/v", "Bld"))[0];

        var elements = bld.split(" ");

        bld = parseInt(elements[elements.length-1]);
        if (bld < 26706)
        {
            doInstall = true;
        }
    }

    if (doInstall)
    {
        QMessageBox.information("vcRedist.install", "Install VS Redistributables", "The application requires Visual Studio 2017 Redistributables. Please follow the steps to install it now.", QMessageBox.OK);
        var dir = installer.value("TargetDir");
        installer.execute(dir + "/VC_redist.x64.exe", "/norestart", "/passive");
    }
}