Skip to main content
 首页 » 编程设计

inno-setup之如何仅在尚未安装的情况下重新安装 vcredist_x86

2024年08月16日47落叶

在我的 inno setup RUN 选择中,我强制静默安装 MSVCRT。我想知道如何使其仅在尚未安装的情况下自行安装?

这就是我现在所说的:

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

请您参考如下方法:

由于您不想告诉您需要哪个 Visual C++ 可再发行组件包的最小版本,因此您可以在此处获得代码示例,您可以从中自行构建此版本。请注意,我不知道哪些版本与哪些版本兼容以及必须安装哪些较低版本,我会告诉您。

我唯一可以告诉你的是,你绝对应该使用 Check条件参数,打开向导时尝试安装框架或运行时库的解决方案是错误的。此条件参数的作用是,当您返回 True 时,文件正在安装,如果返回 False 则跳过。因此,当您想要安装运行时库时,您需要向 VCRedistNeedsInstall 函数返回 True,否则返回 False。辅助函数 VCVersionInstalled 使用以 VC_ 开头的常量,当安装包时返回 True,否则返回 False。

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

  1. How to detect the presence of the VC 8.0 runtime redistributable package
  2. How to detect the presence of the VC 9.0 runtime redistributable package
  3. How to detect the presence of the VC 2010 runtime redistributable package

由于 kobik's idea to use the conditional define,以下代码应该与 Inno Setup 的 Unicode 和 ANSI 版本兼容.

这是代码:

[Files] 
Source: "vcredist_x86.exe"; DestDir: {tmp}; Flags: deleteafterinstall 
 
[Run] 
; add the Parameters, WorkingDir and StatusMsg as you wish, just keep here 
; the conditional installation Check 
Filename: "{tmp}\vcredist_x86.exe"; Check: VCRedistNeedsInstall 
 
[Code] 
#IFDEF UNICODE 
  #DEFINE AW "W" 
#ELSE 
  #DEFINE AW "A" 
#ENDIF 
type 
  INSTALLSTATE = Longint; 
const 
  INSTALLSTATE_INVALIDARG = -2;  { An invalid parameter was passed to the function. } 
  INSTALLSTATE_UNKNOWN = -1;     { The product is neither advertised or installed. } 
  INSTALLSTATE_ADVERTISED = 1;   { The product is advertised but not installed. } 
  INSTALLSTATE_ABSENT = 2;       { The product is installed for a different user. } 
  INSTALLSTATE_DEFAULT = 5;      { The product is installed for the current user. } 
 
  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_2008_SP1_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-87755C07200F}'; 
  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}'; 
 
  { Microsoft Visual C++ 2012 x86 Minimum Runtime - 11.0.61030.0 (Update 4) } 
  VC_2012_REDIST_MIN_UPD4_X86 = '{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}'; 
  VC_2012_REDIST_MIN_UPD4_X64 = '{CF2BEA3C-26EA-32F8-AA9B-331F7E34BA97}'; 
  { Microsoft Visual C++ 2012 x86 Additional Runtime - 11.0.61030.0 (Update 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 Redistributable 12.0.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-4B11EDEFC185}'; 
  VC_2013_REDIST_X64_ADD = '{929FBD26-9020-399B-9A7A-751D61F0B942}'; 
 
  { Visual C++ 2015 Redistributable 14.0.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 Redistributable 14.0.24210 } 
  VC_2015_REDIST_X86 = '{8FD71E98-EE44-3844-9DAD-9CB0BBBC603C}'; 
  VC_2015_REDIST_X64 = '{C0B2C673-ECAA-372D-94E5-E89440D087AD}'; 
 
function MsiQueryProductState(szProduct: string): INSTALLSTATE;  
  external 'MsiQueryProductState{#AW}@msi.dll stdcall'; 
 
function VCVersionInstalled(const ProductID: string): Boolean; 
begin 
  Result := MsiQueryProductState(ProductID) = INSTALLSTATE_DEFAULT; 
end; 
 
function VCRedistNeedsInstall: Boolean; 
begin 
  { here the Result must be True when you need to install your VCRedist } 
  { or False when you don't need to, so now it's upon you how you build } 
  { this statement, the following won't install your VC redist only when } 
  { the Visual C++ 2010 Redist (x86) and Visual C++ 2010 SP1 Redist(x86) } 
  { are installed for the current user } 
  Result := not (VCVersionInstalled(VC_2010_REDIST_X86) and  
    VCVersionInstalled(VC_2010_SP1_REDIST_X86)); 
end; 
<小时 />

更新者chuckleplant :

添加了 VC++ 2012 产品代码。请注意,可再发行软件包安装了两个东西:最小运行时和附加运行时。对于您来说,寻找最小运行时间应该足够了。针对 Microsoft Visual C++ 2012 Redistributable 产品代码进行测试将给出 INSTALLSTATE_UNKNOWN,请改用“最短运行时间”代码。 VC++ 2013 和 2015 的情况是一样的。

您可以在 HKEY_CLASSES_ROOT\Installer\Dependency\ 中找到其他 Visual Studio 版本的产品代码,例如 HKEY_CLASSES_ROOT\Installer\Dependency\Microsoft.VS.VC_RuntimeAdditionalVSU_amd64,v14