Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make vcredist_x86 reinstall only if not yet installed?

In my inno setup RUN selection I force silent install of MSVCRT. I wonder how to make it install itself only if not yet installed?

This is what I call now:

Filename: {tmp}\vcredist_x86.exe; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: Installing 2010 RunTime... 
like image 308
myWallJSON Avatar asked Jun 21 '12 11:06

myWallJSON


People also ask

Is Visual C++ already installed?

To check if Visual C++ redistributables are installed, open Add and Remove Programs and look for the Microsoft Visual C++ Redistributable. If installed, you see "Microsoft Visual C++ 2015-2019 Redistributable (x64) - 14.22. 27821".

Do I need to download C++ redistributable?

These libraries are required by many applications built by using Microsoft C and C++ tools. If your app uses those libraries, a Microsoft Visual C++ Redistributable package must be installed on the target system before you install your app.

Where is vcredist_x86 exe located?

The vcredist_x86.exe file is located in a subfolder of "C:\ProgramData" (for example C:\ProgramData\Package Cache\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}\).


2 Answers

Since you don't want to tell what minimal version of Visual C++ redistributable package you require, here you have the code sample from which you can build this by your own. Please notice that I have no clue, what versions are compatible with what and what lower versions must be installed, I'll keep this upon you.

The only thing I can tell you is that you should definitely use Check conditional parameter, the solutions attempting to install the framework or runtime libraries when the wizard is being opened are wrong. This conditional parameter works as when you return True to it, the file is being installed, if False it is skipped. So you need to return True to VCRedistNeedsInstall function when you want to install your runtime libraries, False if not. The helper function VCVersionInstalled which uses constants beginning with the VC_ here returns True when the package is installed, False otherwise.

As the source of this I've used the following sources:

  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

The following code should be compatible with Unicode and ANSI versions of Inno Setup thanks to kobik's idea to use the conditional define.

Here is the code:

[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; 

Update by chuckleplant:

Added VC++ 2012 product codes. Notice that the redistributable package installs two things, the minimum runtime and the additional runtime. It should be enough for you to look for the minimum runtime. Testing against the Microsoft Visual C++ 2012 Redistributable product code will give INSTALLSTATE_UNKNOWN, use the Minimum Runtime codes instead. It's the same situation for VC++ 2013 and 2015.

You can find product codes for other Visual Studio versions in HKEY_CLASSES_ROOT\Installer\Dependencies\, for example HKEY_CLASSES_ROOT\Installer\Dependencies\Microsoft.VS.VC_RuntimeAdditionalVSU_amd64,v14

like image 193
TLama Avatar answered Sep 23 '22 13:09

TLama


Here's a version that uses the Microsoft recommended way of determining whether the VC Redistributable is installed. I only needed VC 2015 so you will need to adapt values and parameters for other versions:

[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; 
like image 43
Comsci Avatar answered Sep 26 '22 13:09

Comsci