我正在尝试使用众所周知且记录在案的方法来刷新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系统上,会产生以下错误:
使用{sys}
常量的文件路径正确解析,文件存在,可以在资源管理器和命令提示符下的目录列表中看到:
通过命令提示符运行的上述代码的以下变体也以相同的方式失败,尽管它是静默的,并且仅在安装日志中以退出代码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中解决或解决这个问题?
答案 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;