Installing VC++ Redistributables in a Qt Installer Framework (QtIFW) installer?

不打扰是莪最后的温柔 提交于 2019-12-07 08:10:39

问题


I am building installers for my app with the Qt Installer Framework (v2.0.1). I'm building my app for both x86 and x64 on Windows, so I'm building an installer for each architecture, with different VC++ Redistributables packaged in each (vcredist_x86.exe and vcredist_x64.exe from MSVC++2013). The QtIFW documentation is frustratingly short on details, but I found that I can add an operation in installscript.qs to run the vcredist installer silently after my files are extracted:

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

But then I have the problem of determining whether my installer is the x86 or x64 version. Is there a way to determine this from the installscript? Perhaps a way to look through the list of files to be extracted? Or is there an easier way to accomplish this seemingly common task of installing the VCRedists?

The documentation just states this:

To install the runtime libraries on the end-user's system, you need to include the appropriate Visual C++ Redistributable Package (VCRedist) executable with your application and ensure that it is executed when the user installs your application.

But it doesn't offer any details on how to "ensure that it is executed".


回答1:


I had a similar problem. You can get the systems architecture using the systeminfo.currentCpuArchitecture . To find out, whether the given architecture is x64, what I did was:

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

Note: This will return the OS architecture, so a x86 OS on a x64 CPU will be seen as x86.

Edit: Have a look at: https://github.com/Skycoder42/QtIFW-Advanced-Setup . It's a sample project I created that does a lot of additional stuff to improve working with QtIFW, like for example reparing the install path or properly handling offline/online installers.




回答2:


Here's the complete function I use to do this in an installscript.qt. 64 bit only. It checks for a build # less than the currently-available build (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");
    }
}


来源:https://stackoverflow.com/questions/36972287/installing-vc-redistributables-in-a-qt-installer-framework-qtifw-installer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!