Inno安装程序无法在x64上找到并执行ie4uinit.exe

时间:2017-07-04 11:35:26

标签: inno-setup pascalscript

我正在尝试使用众所周知且记录在案的方法来刷新Windows图标缓存,以便在Windows 10及以上版本的Windows 10和ie4uinit.exe -ClearIconCache下调用ie4uinit.exe -Show

[Run]
Filename: "{sys}\ie4uinit.exe"; Parameters: "-ClearIconCache"; StatusMsg: "Rebuilding Windows icon cache..."; Flags: runhidden; Check: not IsWindows10AndAbove
Filename: "{sys}\ie4uinit.exe"; Parameters: "-Show"; StatusMsg: "Rebuilding Windows icon cache..."; Flags: runhidden; Check: IsWindows10AndAbove

在资源管理器或命令提示符下运行时,这两个命令都按预期工作。在x86系统上运行时,它们也可以在Inno Setup中正常工作。但是,在x64系统上,会产生以下错误:

Unable to execute file

使用{sys}常量的文件路径正确解析,文件存在,可以在资源管理器和命令提示符下的目录列表中看到:

C:\Windows\System32 Directory Listing

C:\Windows\System32 Explorer

通过命令提示符运行的上述代码的以下变体也以相同的方式失败,尽管它是静默的,并且仅在安装日志中以退出代码1表示。

[Run]
Filename: "{cmd}"; Parameters: "/c {sys}\ie4uinit.exe -ClearIconCache"; StatusMsg: "Rebuilding Windows icon cache..."; Flags: runhidden; Check: not IsWindows10AndAbove
Filename: "{cmd}"; Parameters: "/c {sys}\ie4uinit.exe -Show"; StatusMsg: "Rebuilding Windows icon cache..."; Flags: runhidden; Check: IsWindows10AndAbove

我已经阅读了clear icon cache in win 7 programmatically - execute ie4uinit.exe-ClearIconCache using C# or Visual Basic,其中也提到了这是Inno Setup中的一个问题(向下)并尝试了解决方法来复制文件并从其他地方运行它。但是,尝试使用FileCopy功能将文件复制到其他位置也无法在C:\Windows\System32中找到它。我还尝试使用[Code]函数在Exec部分中运行相同的命令,但这也无法在C:\Windows\System32中找到它。

我考虑制作文件的副本并将其安装到临时目录以从那里运行它,但是这个文件在每个Windows版本上都是不同的版本,所以这不是一个真正可行的解决方案,尤其是系统文件,将来也可能会改变。

上述问题中接受的答案似乎是为“任何CPU”而不是“x86”构建可执行文件。但是,我不确定这是否可以在Inno Setup中完成,如果这样做会对安装程序的行为产生任何不可预见的副作用?

有没有办法在Inno Setup中解决或解决这个问题?

2 个答案:

答案 0 :(得分:2)

一个更简单,更好的解决方案(感谢链接Martin)是为{x} [Run]Check: IsWin64添加两个重复的Flags: 64bit条目,并添加Check: not IsWin64到原来的行:

[Run]
Filename: "{sys}\ie4uinit.exe"; Parameters: "-ClearIconCache"; StatusMsg: "Refreshing Windows icon cache..."; Flags: runhidden; Check: not IsWindows10AndAbove and not IsWin64
Filename: "{sys}\ie4uinit.exe"; Parameters: "-Show"; StatusMsg: "Refreshing Windows icon cache..."; Flags: runhidden; Check: IsWindows10AndAbove and not IsWin64
Filename: "{sys}\ie4uinit.exe"; Parameters: "-ClearIconCache"; StatusMsg: "Refreshing Windows icon cache..."; Flags: runhidden 64bit; Check: not IsWindows10AndAbove and IsWin64
Filename: "{sys}\ie4uinit.exe"; Parameters: "-Show"; StatusMsg: "Refreshing Windows icon cache..."; Flags: runhidden 64bit; Check: IsWindows10AndAbove and IsWin64

答案 1 :(得分:1)

我终于弄明白了。 Inno安装程序无法找到该文件,相当令人困惑,尽管它显示它正在查看C:\Windows\System32,Windows文件重定向实际上是静默地导致它查看C:\Windows\SysWOW64,其中ie4uinit.exe没有存在。因此,解决方案是使用[Code]部分[Run]BeforeInstall指令临时禁用AfterInstall部分中的文件重定向,然后使用EnableFsRedirection函数之后,Inno Setup现在可以查看并访问实际的C:\Windows\System32目录,将文件复制到临时目录并从那里运行,然后将文件重定向恢复到之前的状态:

[Run]
Filename: "{tmp}\Config Tools\ie4uinit.exe"; Parameters: "-ClearIconCache"; StatusMsg: "Refreshing Windows icon cache..."; Flags: runhidden; Check: not IsWindows10AndAbove; BeforeInstall: StartRefreshIconCache; AfterInstall: FinishRefreshIconCache
Filename: "{tmp}\Config Tools\ie4uinit.exe"; Parameters: "-Show"; StatusMsg: "Refreshing Windows icon cache..."; Flags: runhidden; Check: IsWindows10AndAbove; BeforeInstall: StartRefreshIconCache; AfterInstall: FinishRefreshIconCache

[Code]
//Start refresh or rebuild of the Windows icon cache
procedure StartRefreshIconCache();
var
  OriginalFileRedirectionState: Boolean;
begin
  if not IsWin64 then
    begin
      if FileCopy(ExpandConstant('{sys}\ie4uinit.exe'), ExpandConstant('{tmp}\Config Tools\ie4uinit.exe'), False) then
        begin
          Log(ExpandConstant('Copied {sys}\ie4uinit.exe to {tmp}\Config Tools\ie4uinit.exe'));
        end;
    end
  else if IsWin64 then
    begin
      //Store Windows file redirection's original state and temporarily disable to allow access to the System32 directory on x64 to allow copy of ie4uinit.exe
      OriginalFileRedirectionState := EnableFsRedirection(False); 
      Log('File redirection temporarily disabled for x64 compatibility.');
      try
        if FileCopy(ExpandConstant('{sys}\ie4uinit.exe'), ExpandConstant('{tmp}\Config Tools\ie4uinit.exe'), False) then
          begin
            Log(ExpandConstant('Copied {sys}\ie4uinit.exe to {tmp}\Config Tools\ie4uinit.exe'));
          end;
      finally
        //Restore file redirection's original state
        EnableFsRedirection(OriginalFileRedirectionState);
        Log('File redirection restored to it''s original state.');
      end;
    end;
end;

//Finish refresh or rebuild of the Windows icon cache
procedure FinishRefreshIconCache();
begin
  if DeleteFile(ExpandConstant('{tmp}\Config Tools\ie4uinit.exe')) then
    begin
      Log(ExpandConstant('Deleted {tmp}\Config Tools\ie4uinit.exe'));    
    end;
end;