Inno setup 如何使vcredist_x86仅在尚未安装时重新安装?

Inno setup 如何使vcredist_x86仅在尚未安装时重新安装?,inno-setup,msvcrt,Inno Setup,Msvcrt,在我的inno安装运行选择中,我强制静默安装MSVCRT。我想知道如果还没有安装,如何让它自己安装 这就是我现在所说的: Filename: {tmp}\vcredist_x86.exe; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: Installing 2010 RunTime... 因为您不想告诉您需要VisualC++可重分配包的最小版本,这里有代码示例,您可以通过它自己构建代码示

在我的inno安装运行选择中,我强制静默安装MSVCRT。我想知道如果还没有安装,如何让它自己安装

这就是我现在所说的:

Filename: {tmp}\vcredist_x86.exe; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: Installing 2010 RunTime...

因为您不想告诉您需要VisualC++可重分配包的最小版本,这里有代码示例,您可以通过它自己构建代码示例。请注意,我没有任何线索,什么版本与什么兼容,什么更低的版本必须安装,我将保留这个给你

我能告诉您的唯一一件事是,您必须使用条件参数,当向导打开时,试图安装框架或运行库的解决方案是错误的。此条件参数的作用与当您将其返回True时相同,即文件正在安装,如果返回False,则跳过该文件。因此,当您要安装运行时库时,需要将True返回到
vcreditneedsinstall
函数,否则返回False。助手函数
VCVersionInstalled
在安装包时返回True,否则返回False

作为本文的来源,我使用了以下来源:

  • 以下代码应与Inno Setup的Unicode和ANSI版本兼容,这要归功于

    代码如下:

    [文件]
    来源:“vcredit_x86.exe”;DestDir:{tmp};标志:deleteafterinstall
    [运行]
    ; 根据需要添加参数WorkingDir和StatusMsg,只需保留在此处
    ; 条件安装检查
    文件名:“{tmp}\vcredit_x86.exe”;检查:VCRedistNeedsInstall
    [守则]
    #IFDEF UNICODE
    #定义AW“W”
    #否则
    #定义“A”
    #恩迪夫
    类型
    INSTALLSTATE=Longint;
    常数
    INSTALLSTATE_INVALIDARG=-2;{传递给函数的参数无效。}
    INSTALLSTATE_UNKNOWN=-1;{该产品既没有广告也没有安装。}
    INSTALLSTATE_=1;{该产品已发布广告,但尚未安装。}
    INSTALLSTATE_缺席=2;{该产品是为其他用户安装的。}
    INSTALLSTATE_默认值=5;{产品是为当前用户安装的。}
    VC_2005_REDIST_X86='{A49F249F-0C91-497F-86DF-B2585E8E76B7}';
    VC_2005_REDIST_X64='{6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}';
    VC_2005_REDIST_IA64='{03ED71EA-F531-4927-AABD-1C31BCE8E187}';
    VC_2005_SP1_REDIST_X86='{7299052B-02A4-4627-81F2-1818DA5D550D}';
    VC_2005_SP1_REDIST_X64={071C9B48-7C32-4621-A0AC-3F809523288F};
    VC_2005_SP1_REDIST_IA64={0F8FB34E-675E-42ED-850B-29D98C2ECE08};
    VC_2005_SP1_ATL_SEC_UPD_REDIST_X86=“{837B34E3-7C30-493C-8F6A-2B0F04E2912C}”;
    VC_2005_SP1_ATL_SEC_UPD_REDIST_X64=“{6CE5BAE9-D3CA-4B99-891A-1DC6C118A5FC}”;
    VC_2005_SP1_ATL_SEC_UPD_REDIST_IA64=“{85025851-A784-46D8-950D-05CB3CA43A13}”;
    VC_2008_REDIST_X86={FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4};
    VC_2008_REDIST_X64=“{350AA351-21FA-3270-8B7A-835434E766AD}”;
    VC_2008_REDIST_IA64={2B547B43-DB50-3139-9EBE-37D419E0F5FA};
    VC_2008_SP1_REDIST_X86=“{9A25302D-30C0-39D9-BD6F-21E6EC160475}”;
    VC(U 2008)SP1(U REDIST)X64={8220EEFE-38CD-377E-8595-13398D740ACE}};
    VC_2008_SP1_REDIST_IA64=“{5827ECE1-AEB0-328E-B813-6FC68622C1F9}”;
    VC_2008_SP1_ATL_SEC_UPD_REDIST_X86=“{1F1C2DFC-2D24-3E06-BCB8-725134ADF989}”;
    VC_2008_SP1_ATL_SEC_UPD_REDIST_X64=“{4B6C7001-C7D6-3710-913E-5BC23FCE91E6}”;
    VC_2008_SP1_ATL_SEC_UPD_REDIST_IA64=“{977AD349-C2A8-39DD-9273-285C08987C7B}”;
    VC_2008_SP1_MFC_SEC_UPD_REDIST_X86=“{9BE518E6-ECC6-35A9-88E4-87755C0720F}”;
    VC_2008_SP1_MFC_SEC_UPD_REDIST_X64=“{5FCE6D76-F5DC-37AB-B2B8-22AB8CEDB1D4}”;
    VC_2008_SP1_MFC_SEC_UPD_REDIST_IA64=“{515643D1-4E9E-342F-A75A-D1F16448DC04}”;
    VC_2010_REDIST_X86=“{196BB40D-1578-3D01-B289-BEFC77A11A1E}”;
    VC_2010_REDIST_X64=“{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}”;
    VC_2010_REDIST_IA64={C1A35166-4301-38E9-BA67-02823AD72A1B};
    VC_2010_SP1_REDIST_X86={F0C3E5D1-1ADE-321E-8167-68EF0DE699A5};
    VC_2010_SP1_REDIST_X64={1D8E6291-B0D5-35EC-8441-6616F567A0F7};
    VC_2010_SP1_REDIST_IA64={88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD};
    {微软Visual C++ 2012 x86最小运行时间-110.61030.0(更新4)}
    VC_2012_REDIST_MIN_UPD4_X86=“{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}”;
    VC_2012_REDIST_MIN_UPD4_X64=“{CF2BEA3C-26EA-32F8-AA9B-331F7E34BA97}”;
    {微软Visual C++ 2012 x86附加运行时-1.0.61030.0(更新4)}
    VC_2012_REDIST_ADD_UPD4_X86=“{B175520C-86A2-35A7-8619-86DC379688B9}”;
    VC_2012_REDIST_ADD_UPD4_X64=“{37B8F9C7-03FB-3253-8781-2517C99D7C00}”;
    {Visual C++ 2013可重新分配120.21005}
    VC_2013_REDIST_X86_MIN={13A4EE12-23EA-3371-91EE-EFB36DDFFF3E};
    VC_2013_REDIST_X64_MIN={A749D8E6-B613-3BE3-8F5F-045C84EBA29B};
    VC_2013_REDIST_X86_ADD='{F8CFEB22-A2E7-3971-9EDA-4B11efc185}';
    VC_2013_REDIST_X64_ADD={929FBD26-9020-399B-9A7A-751D61F0B942};
    {Visual C++ 2015可重分配140.23026}
    VC_2015_REDIST_X86_MIN={A2563E55-3BEC-3828-8D67-E5E8B9E8B675};
    VC_2015_REDIST_X64_MIN={0D3E9E15-DE7A-300B-96F1-B4AF12B96488};
    VC_2015_REDIST_X86_ADD={BE960C1C-7BAD-3DE6-8B1A-2616FE532845};
    VC_2015_REDIST_X64_ADD={BC958BD2-5DAC-3862-BB1A-C1BE0790438D};
    {Visual C++ 2015可重分配140.24210}
    VC_2015_REDIST_X86=“{8FD71E98-EE44-3844-9DAD-9CB0BBBC603C}”;
    VC_2015_REDIST_X64=“{C0B2C673-ECAA-372D-94E5-E89440D087AD}”;
    函数MsiQueryProductState(szProduct:string):INSTALLSTATE;
    外部“MsiQueryProductState{#AW}@msi.dll stdcall”;
    函数vVersionInstalled(const ProductID:string):布尔值;
    开始
    结果:=MsiQueryProductState(ProductID)=INSTALLSTATE\u默认值;
    结束;
    函数vcreditneedsinstall:Boolean;
    开始
    {在这里,当您需要安装VCRedist时,结果必须为True}
    {或者在不需要的时候为假,所以现在取决于你如何构建}
    {此语句中,以下内容不会仅在以下情况下安装VC redist}
    {Visual C++ 2010 ReDIST(X)
    
    #define VCmsg "Installing Microsoft Visual C++ Redistributable...."
    
    [Run]
    Filename: "vc_redist.x86.exe"; StatusMsg: "{#VCmsg}"; Check: not IsWin64 and not VCinstalled
    Filename: "vc_redist.x64.exe"; StatusMsg: "{#VCmsg}"; Check: IsWin64 and not VCinstalled
    
    [Code]
    function VCinstalled: Boolean;
     // By Michael Weiner <mailto:spam@cogit.net>
     // Function for Inno Setup Compiler
     // 13 November 2015
     // Returns True if Microsoft Visual C++ Redistributable is installed, otherwise False.
     // The programmer may set the year of redistributable to find; see below.
     var
      names: TArrayOfString;
      i: Integer;
      dName, key, year: String;
     begin
      // Year of redistributable to find; leave null to find installation for any year.
      year := '';
      Result := False;
      key := 'Software\Microsoft\Windows\CurrentVersion\Uninstall';
      // Get an array of all of the uninstall subkey names.
      if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, key, names) then
       // Uninstall subkey names were found.
       begin
        i := 0
        while ((i < GetArrayLength(names)) and (Result = False)) do
         // The loop will end as soon as one instance of a Visual C++ redistributable is found.
         begin
          // For each uninstall subkey, look for a DisplayName value.
          // If not found, then the subkey name will be used instead.
          if not RegQueryStringValue(HKEY_LOCAL_MACHINE, key + '\' + names[i], 'DisplayName', dName) then
           dName := names[i];
          // See if the value contains both of the strings below.
          Result := (Pos(Trim('Visual C++ ' + year),dName) * Pos('Redistributable',dName) <> 0)
          i := i + 1;
         end;
       end;
     end;
    
    [Files]
    Source: ".\vc-redist\vc-redist\win64\bin\vc_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall; Check: Is64BitInstallMode
    
    ; FlexLM requires the VC 2015 redistributables so run the installer if this 
    ; or a later 2015 version is not already present
    [Run]
    Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/install /passive"; StatusMsg: "{#VCmsg}"; Check: IsWin64 and not VCinstalled
    
    [Code]
    function VCinstalled: Boolean;
     // Function for Inno Setup Compiler
     // Returns True if same or later Microsoft Visual C++ 2015 Redistributable is installed, otherwise False.
     var
      major: Cardinal;
      minor: Cardinal;
      bld: Cardinal;
      rbld: Cardinal;
      key: String;
     begin
      Result := False;
      key := 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64';
      if RegQueryDWordValue(HKEY_LOCAL_MACHINE, key, 'Major', major) then begin
        if RegQueryDWordValue(HKEY_LOCAL_MACHINE, key, 'Minor', minor) then begin
          if RegQueryDWordValue(HKEY_LOCAL_MACHINE, key, 'Bld', bld) then begin
            if RegQueryDWordValue(HKEY_LOCAL_MACHINE, key, 'RBld', rbld) then begin
                Log('VC 2015 Redist Major is: ' + IntToStr(major) + ' Minor is: ' + IntToStr(minor) + ' Bld is: ' + IntToStr(bld) + ' Rbld is: ' + IntToStr(rbld));
                // Version info was found. Return true if later or equal to our 14.0.24212.00 redistributable
                // Note brackets required because of weird operator precendence
                Result := (major >= 14) and (minor >= 0) and (bld >= 24212) and (rbld >= 0)
            end;
          end;
        end;
      end;
     end;