4

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;
    
  • CloseApplicationsandRestartApplications设置为false(*),并且某些文件具有restartreplaceanduninsrestartdelete标志,因此如果文件正在使用中,则需要重新启动才能完成安装

现在,如果需要重新启动,无论“高级选项”复选框的状态如何,我都想显示“已完成”页面,因为我不想在不提示用户的情况下导致重新启动。所以我的代码会是这样的:

    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:该过程立即重新启动,并且我的文件再次被锁定。

4

1 回答 1

4

通常的建议是MakePendingFileRenameOperationsChecksum在安装过程开始时调用,然后在您想检查是否需要重新启动时再次调用。只要它一直返回相同的值,就不需要重新启动。

请注意,这不会考虑“强制重启”,例如。来自您实现NeedRestart并返回 true 或来自标有restart标志的组件;你应该能够自己解决这个问题,因为你可以控制它。

于 2012-11-15T06:24:30.043 回答