2012-11-14 62 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

正是我需要的,謝謝! –

相關問題