InnoSetup - 检查是否安装了visual studio 2010 crt redist,如果没有,则运行安装程序

时间:2012-06-11 14:49:30

标签: c++ installer installation inno-setup

我目前在Inno脚本的这一部分中有这个

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

它将在应用安装期间运行vcredist安装程序。但问题是,如果用户已安装它,则抛出类似

的内容
  • 维修/删除
  • 已检测到较新版本

有没有办法避免这种情况,只在需要时运行此安装程序?我应该在Inno脚本中添加什么?

编辑:

在@John链接的帮助下,我做了以下功能

我还使用this site进行参考以获取visual studio 2010 crt ++产品代码,并在注册表中使用Uninstall文件夹来检测它是否已安装。

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;

如果安装程序在下载/安装后仍然继续,或者我可以以某种方式调整我之前运行的代码(使用安装程序)安装程序,那仍然会很好:

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

但这仍然足够好。

3 个答案:

答案 0 :(得分:0)

我遵循“官方”MS方式https://stackoverflow.com/a/199783/866333。还没有完全病毒化,但它适用于我。

有关仅检测一个版本的工作代码,请参阅Inno Setup: Verify that .NET 4.0 is installed

这是我实际使用的代码的最佳示例:http://www.vincenzo.net/isxkb/index.php?title=.NET_-_Detect_framework

以上所有目标都是.NET框架。对于VCRT,我将从VC2010中提取可再发行组件,并让InnoSetup将内容复制到应用程序的目标安装目录。这样系统文件就不会被改变。

答案 1 :(得分:0)

关注此链接https://www.codeproject.com/Articles/20868/NET-Framework-Installer-for-InnoSetup。它适用于NET框架和VC可分发文件。您可以查明是否在PC中安装了可分发文件(例如2013)。如果未安装,它将为您安装。我强烈推荐这个。

答案 2 :(得分:0)

也许您可以使用HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ SharedDLLs。您会发现所有版本均已安装。 DLL的特殊名称取决于c ++可恢复安装:

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

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

110:Visual Studio 2012(版本11.0)…110

120:Visual Studio 2013(版本12.0)…120

140:Visual Studio 2015(版本14.0)... 140

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

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

此致