TL;DR 版本:
在 InnoSetup 脚本中,如何检测是否因为正在使用的文件而需要重新启动?
更详细的版本:
我有一个具有以下特征的 Inno Setup 脚本:
该
ShouldSkipPage
功能的实现是为了跳过所有页面(欢迎页面除外),除非选中欢迎页面上的自定义“高级选项”复选框:function ShouldSkipPage(PageID: Integer): Boolean; begin if ((PageID = wpSelectDir) or (PageID = wpSelectProgramGroup) or (PageID = wpSelectTasks) or (PageID = wpFinished) or (PageID = wpReady)) then begin Result := not advancedCheckBox.Checked; end; end;
CloseApplications
andRestartApplications
设置为false
(*),并且某些文件具有restartreplace
anduninsrestartdelete
标志,因此如果文件正在使用中,则需要重新启动才能完成安装
现在,如果需要重新启动,无论“高级选项”复选框的状态如何,我都想显示“已完成”页面,因为我不想在不提示用户的情况下导致重新启动。所以我的代码会是这样的:
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if ((PageID = wpSelectDir) or
(PageID = wpSelectProgramGroup) or
(PageID = wpSelectTasks) or
(PageID = wpReady)) then
begin
Result := not advancedCheckBox.Checked;
end
else if ((PageID = wpFinished)) then
begin
Result := (not advancedCheckBox.Checked) and (not IsRestartNeeded);
end
end;
不幸的是,没有IsRestartNeeded
函数(NeedRestart
存在,但它是一个事件函数)。我花了很长时间查看文档,但没有找到任何可以为我提供此信息的函数。
我能想到的唯一选择是HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
查看它是否包含我的任何文件,但这是一个相当丑陋的解决方案......
(*) 我要替换或删除的文件是 shell 扩展和此扩展使用的一些 DLL。我不依赖重新启动管理器的原因是它似乎无法使用explorer.exe
:该过程立即重新启动,并且我的文件再次被锁定。