2012-11-14 61 views
3

TL; DR版本:如何知道InnoSetup脚本是否需要重新启动?

在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; 
    
  • CloseApplicationsRestartApplications设置为false(*),以及一些文件有restartreplaceuninsrestartdelete标志,所以重新启动将需要完成安装文件是否已被使用现在

,如果需要重新启动,无论“高级选项”复选框的状态如何,我都希望显示“完成”页面,因为我不想在没有提示用户的情况下重新启动。所以,我的代码将是类似的东西:

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

+0

@TLama,你是什么意思?你能详细说明吗? –

+0

收回,对不起... – TLama

+1

重新启动管理器看起来不适合你,这很奇怪;重新启动浏览器面对shell扩展应该是其主要目标之一。 – Miral

回答

3

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

请注意,这不会考虑“强制重新启动”,例如。从您执行NeedRestart并返回true或来自标有restart标志的组件;你应该能够独自掌握这一点,因为你掌握了这一点。

+0

正是我需要的,谢谢! –

相关问题