0

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

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

我试图在目录HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\Runtimes\x64不存在的 64 位 Windows 10 机器上运行它,但我收到一条错误消息,提示找不到 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意味着文件已成功执行,所以我仍然不明白可能出了什么问题。

4

1 回答 1

2

我刚刚阅读了MSVCR100.DLL

MSVCR100.dll = Visual Studio 2010 运行时

MSVCR110.dll = Visual Studio 2012 运行时

MSVCR120.dll = Visual Studio 2013 运行时

那么您实际上是否安装了正确的可再发行组件?


关于您的脚本,您为什么要使用DirExists?这旨在验证目录是否存在。您正在使用注册表,因此您应该使用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 提供的帮助系统(也在线)解释了日志记录

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

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

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

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


  • 因此,从 Windows 开始菜单中输入框中cmd并单击命令提示符

命令提示符菜单

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

命令提示符

编辑您的问题并将日志的输出添加到它。还可以考虑将您的脚本片段替换为您的完整脚本(使用DirExists.


我做了更多的研究,发现了这个有趣的问题。如果您查看日志输出,它只会安装 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++ 程序。

于 2018-03-02T20:28:02.197 回答