Inno脚本未检测到未安装vcredist_x64.exe

时间:2018-03-02 14:57:31

标签: inno-setup vcredist

我的Inno安装脚本中有以下代码:

[Files]

Source: "C:\Users\Myname\Documents\Visual Studio 
2010\Redistributional\vcredist_x86.exe"; DestDir: "{tmp}"; Flags: 
deleteafterinstall;
Source: "C:\Users\Myname\Documents\Visual Studio 
2010\Redistributional\vcredist_x64.exe"; DestDir: "{tmp}"; Flags: 
deleteafterinstall;   

[Run]

Filename: "{tmp}\vcredist_x86.exe"; Parameters: "/install /passive"; Check: 
not IsWin64 and not VCinstalled32
Filename: "{tmp}\vcredist_x64.exe"; Parameters: "/install /passive"; Check: 
IsWin64 and not VCinstalled64
Filename: "{app}\Myprogram.exe"; Description {cm:LaunchProgram,Myprogram}";

[Code]

function VCinstalled32: Boolean;
var
installed: Cardinal;
key: String;
begin
 Result := False;
 key := 'SOFTWARE\Microsoft\VisualStudio\10.0\VC\Runtimes\x86';
 if DirExists 
 ('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\Runtimes\x86') 
 then begin  
   if RegQueryDWordValue(HKEY_LOCAL_MACHINE, key, 'Installed', installed) 
   then begin  
     if installed = 1 then begin
      Result := True;
     end;
   end;
 end;
end;

function VCinstalled64: Boolean;
var
installed: Cardinal;
key: String;
begin
  Result := False;
  key := 'SOFTWARE\Microsoft\VisualStudio\10.0\VC\Runtimes\x64';
  if DirExists 
 ('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\Runtimes\x64') 
    then begin 
      if RegQueryDWordValue(HKEY_LOCAL_MACHINE, key, 'Installed', installed) 
        then begin  
          if installed = 1 then begin
            Result := True;
          end;
      end;
   end;
 end;

我尝试在64位Windows 10计算机上运行此操作,其中目录HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\Runtimes\x64不存在,但我收到一条错误消息,指出未找到MSVCR100。

提前致谢。

更新

非常感谢您的回答,但我仍然收到相同的错误消息。也许我忽略了一些东西。

更新

我不太熟悉Inno脚本,也不知道如何记录结果。我试图谷歌后者,但它似乎非常复杂,所以如果我无法以其他任何方式找到答案,我会试着稍后再等。

更新

以下是日志文件的一些输出:

2018-03-05 14:01:03.567   -- File entry --
2018-03-05 14:01:03.568   Dest filename: C:\Users\Bruker\AppData\Local\Temp\is-SP07M.tmp\vcredist_x86.exe
2018-03-05 14:01:03.568   Time stamp of our file: 2018-02-18 14:27:32.000
2018-03-05 14:01:03.568   Installing the file.
2018-03-05 14:01:04.016   Successfully installed the file.
2018-03-05 14:01:04.017   -- File entry --
2018-03-05 14:01:04.018   Dest filename: C:\Users\Bruker\AppData\Local\Temp\is-SP07M.tmp\vcredist_x64.exe
2018-03-05 14:01:04.018   Time stamp of our file: 2018-02-18 16:00:00.000
2018-03-05 14:01:04.018   Installing the file.
2018-03-05 14:01:04.937   Successfully installed the file.
2018-03-05 14:01:08.883   -- Run entry --
2018-03-05 14:01:08.883   Run as: Current user
2018-03-05 14:01:08.883   Type: Exec
2018-03-05 14:01:08.883   Filename: C:\Users\Bruker\AppData\Local\Temp\is-SP07M.tmp\vcredist_x64.exe
2018-03-05 14:01:08.883   Parameters: /install /passive
2018-03-05 14:01:21.800   Process exit code: 0
2018-03-05 14:01:21.800   -- Run entry --
2018-03-05 14:01:21.800   Run as: Current user
2018-03-05 14:01:21.800   Type: Exec
2018-03-05 14:01:21.800   Filename: C:\Program Files (x86)\Myfile\myfile.exe
2018-03-05 14:01:28.020   Process exit code: 3221225781
2018-03-05 14:01:28.023   Need to restart Windows? No
2018-03-05 14:01:30.504   Deinitializing Setup.
2018-03-05 14:01:30.593   Log closed.

据我了解,Process exit code: 0表示该文件已成功执行,因此我仍然不了解可能出现的问题。

1 个答案:

答案 0 :(得分:2)

我刚读了 MSVCR100.DLL

  

MSVCR100.dll = Visual Studio 2010 Runtime

     

MSVCR110.dll = Visual Studio 2012 Runtime

     

MSVCR120.dll = Visual Studio 2013 Runtime

您实际安装了正确的可再发行组件吗?

尊重您的脚本,为什么使用DirExists?这旨在验证directory是否存在。您正在使用registry,因此您应该使用RegKeyExists。帮助提供了一个例子:

begin
  if RegKeyExists(HKEY_CURRENT_USER, 'Software\Jordan Russell\Inno Setup') then
  begin
    // The key exists
  end;
end;

我没有对此进行过测试,但你需要这样的东西:

function VCinstalled64: Boolean;
var
installed: Cardinal;
key: String;
begin
  Result := False;
  key := 'SOFTWARE\Microsoft\VisualStudio\10.0\VC\Runtimes\x64';
  if RegKeyExists(HKEY_LOCAL_MACHINE, key) then
  begin 
      if RegQueryDWordValue(HKEY_LOCAL_MACHINE, key, 'Installed', installed) 
        then begin  
          if installed = 1 then begin
            Result := True;
          end;
      end;
   end;
 end;

另一种方法VCinstalled32需要进行类似的更改。

登录

Inno Setup(也在线)提供的帮助系统解释了logging

  

<强> / LOG   安装程序在用户的TEMP目录中创建日志文件,详细说明安装过程中执行的文件安装和[运行]操作。这可以是一个有用的调试辅助工具。例如,如果您怀疑某个文件在您认为应该被替换时没有被替换(反之亦然),则日志文件将告诉您文件是否真的被跳过,以及原因。

     

使用基于当前日期的唯一名称创建日志文件。 (它不会覆盖或附加到现有文件。)

     

日志文件中包含的信息本质上是技术性的,因此最终用户无法理解。它也不是可机器分析的;文件的格式如有更改,恕不另行通知。

     

<强> / LOG = “文件名”   与/ LOG相同,但它允许您指定用于日志文件的固定路径/文件名。如果已存在具有指定名称的文件,则将覆盖该文件。如果无法创建文件,安装程序将中止并显示错误消息。

  • 因此,从Windows“开始”菜单中选择cmd框,然后点击命令提示符

Command Prompt Menu

  • 接下来,导航到安装程序所在的文件夹,并使用/log参数运行它:

Command Prompt

编辑您的问题并将日志中的输出添加到其中。另外,请考虑使用完整脚本(使用DirExists的原始脚本替换脚本片段。

我做了一些研究,发现这个有趣question。如果查看日志输出,它只会安装64位版本:

2018-03-05 14:01:08.883   -- Run entry --
2018-03-05 14:01:08.883   Run as: Current user
2018-03-05 14:01:08.883   Type: Exec
2018-03-05 14:01:08.883   Filename: C:\Users\Bruker\AppData\Local\Temp\is-SP07M.tmp\vcredist_x64.exe
2018-03-05 14:01:08.883   Parameters: /install /passive
2018-03-05 14:01:21.800   Process exit code: 0

从以下位置更改此行:

Filename: "{tmp}\vcredist_x86.exe"; Parameters: "/install /passive"; Check: not IsWin64 and not VCinstalled32

为:

Filename: "{tmp}\vcredist_x86.exe"; Parameters: "/install /passive"; Check: not VCinstalled32

你的可执行文件似乎是32位,根据我提到的那个问题:

  

不,您需要x86版本才能运行32位VC ++程序,并且您需要x64版本才能运行64位VC ++程序。