在 Qt Installer Framework (QtIFW) 安装程序中安装 VC++ Redistributables?

Posted

技术标签:

【中文标题】在 Qt Installer Framework (QtIFW) 安装程序中安装 VC++ Redistributables?【英文标题】:Installing VC++ Redistributables in a Qt Installer Framework (QtIFW) installer? 【发布时间】:2016-05-01 21:40:07 【问题描述】:

我正在使用 Qt 安装程序框架 (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 版本时遇到了问题。有没有办法从安装脚本中确定这一点?也许是一种查看要提取的文件列表的方法?或者有没有更简单的方法来完成这个看似常见的安装 VCRedists 任务?

文档只是说明了这一点:

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

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

【问题讨论】:

【参考方案1】:

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

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

注意:这将返回操作系统架构,因此 x64 CPU 上的 x86 操作系统将被视为 x86。

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

【讨论】:

我希望能够从一台 x64 机器上为 x86 和 x64 构建安装程序,因此使用系统的架构并不能解决问题,但感谢您提供额外的信息和示例。 为什么?当用户运行安装程序时,我将在运行时确定 target 架构,而不是构建系统的 on。您可以使用它来了解系统是否支持 x64。 我目前正在构建两个独立的安装程序。用户可以选择是否需要 32 位或 64 位版本。即使他们有 64 位机器,他们也可能想要 32 位安装。我可以包含两个 vcredist_xxx.exe 文件并使用此代码来选择合适的文件,但这意味着我正在为用户决定他们获得哪个版本,而不是让他们选择。我可能只是将两个包中的每个 vcredist_xxx.exe 重命名为 vcredist.exe,所以安装程序脚本没有区别。 啊,现在我明白了。在这种情况下,我认为您无法使用一个安装程序将其存档。您将不得不为您的两个想法之一做出决定【参考方案2】:

这是我在 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");
    

【讨论】:

您的帖子中缺少如何使用此功能。我通过将其连接到安装程序的 installationFinished 信号来实现此功能:function Component() if (systemInfo.productType === "windows") installer.installationFinished.connect(this, Component.prototype.installVCRedist);

以上是关于在 Qt Installer Framework (QtIFW) 安装程序中安装 VC++ Redistributables?的主要内容,如果未能解决你的问题,请参考以下文章

Qt Installer Framework - 防止安装在非空文件夹中

Qt Installer Framework:如何卸载以前的版本?

Qt Installer Framework - 在开始菜单中为所有用户创建快捷方式

使用Qt installer framework制作安装包(不知道是否适合Mac和Linux?)

重要网址小记

重要网址小记