InnoSetup - Check if visual studio 2010 crt redist

2020-02-29 11:55发布

问题:

I currently have this in this part of Inno script

[Run]
Filename: {app}\bin\vcredist_x86.exe; Parameters: "/q:a /c:""VCREDI~3.EXE /q:a /c:""""msiexec /i vcredist.msi /qn"""" """; WorkingDir: {app}\bin; StatusMsg: Installing Visual Studio 2010 C++ CRT Libraries...

It will run vcredist installer during app installation. But the problem with this is that if the user has it already installed it throws things like

  • Repair/Remove
  • Already newer version detected

Is there any way to avoid this and only run this installer if needed? What should i add to Inno script?

EDIT:

With the help of @John links i made it witht he following function added

I also used this site for refference to get visual studio 2010 crt++ product code and used Uninstall folder in registry to detect if its installed.

function InitializeSetup(): Boolean;
var
  ErrorCode: Integer;
  RedistInstalled : Boolean;
  Result1 : Boolean;
begin
  RedistInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{196BB40D-1578-3D01-B289-BEFC77A11A1E}');
  if RedistInstalled then
  begin
    Result := true;
  end else
  begin
    RedistInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{196BB40D-1578-3D01-B289-BEFC77A11A1E}');
    if RedistInstalled then
    begin
      Result := true;
    end else
    begin
      Result1 := MsgBox('This setup requires Microsoft Visual C++ 2010 Redistributable Package (x86). Please install Visual C++ 2010 Redistributable Package (x86) and run this setup again.  '#13#10' '#13#10'Do you want to download Microsoft Visual C++ 2010 Redistributable Package (x86) now?',
        mbConfirmation, MB_YESNO) = idYes;
      if Result1 =false then
      begin
        Result:=false;
      end else
      begin
        Result:=false;
        ShellExec('open',
          'http://download.microsoft.com/download/5/B/C/5BC5DBB3-652D-4DCE-B14A-475AB85EEF6E/vcredist_x86.exe',
          '','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
      end;
    end;
  end;
end;

It would still be nice if however installer would continue after downloading/installing or that i could somehow adapt my previous code that runs included(with setup) installer:

 [Run]
    Filename: {app}\bin\vcredist_x86.exe; Parameters: "/q:a /c:""VCREDI~3.EXE /q:a /c:""""msiexec /i vcredist.msi /qn"""" """; WorkingDir: {app}\bin; StatusMsg: Installing Visual Studio 2010 C++ CRT Libraries...

but this is still good enough.

回答1:

I follow the "official" MS way https://stackoverflow.com/a/199783/866333. Not exactly gone viral yet but it works for me.

See Inno Setup: Verify that .NET 4.0 is installed for working code to detect just one version.

This is the best example of the code I actually use: http://www.vincenzo.net/isxkb/index.php?title=.NET_-_Detect_framework

All the above targets the .NET framework. For VCRT I would extract the redistributable from VC2010 and have InnoSetup copy the contents over to the application's target install directory. That way system files don't get altered.



回答2:

Follow this link https://www.codeproject.com/Articles/20868/NET-Framework-Installer-for-InnoSetup. Its for both NET framework and VC distributables.You can find out if there is a distributable, say 2013, is installed in a pc or not. If not installed, it will install it for you. I HIGHLY RECOMMEND this.



回答3:

Maybe you can use HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs. You can found all versions has been installed. DLL has special name depends of c++ Retribuitable installation:

90: Visual Studio 2008 (Version 9.0) (atl90.dll, msvcr90.dll, msvcp90.dll)

100: Visual Studio 2010 (Version 10.0) (atl100.dll, msvcr100.dll, msvcp100.dll)

110: Visual Studio 2012 (Version 11.0) …110

120: Visual Studio 2013 (Version 12.0) …120

140: Visual Studio 2015 (Version 14.0) …140

150: Visual Studio 2017 (Version 15.0) (atl150.dll, msvcr150.dll, msvcp150.dll)

160: Visual Studio 2019 (Version 16.0) (atl160.dll, msvcr160.dll, msvcp160.dll)

Regards,