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;
CloseApplications
和RestartApplications
設置爲false
(*),以及一些文件有restartreplace
和uninsrestartdelete
標誌,所以重新啓動將需要完成安裝文件是否已被使用現在
,如果需要重新啓動,無論「高級選項」複選框的狀態如何,我都希望顯示「完成」頁面,因爲我不想在沒有提示用戶的情況下重新啓動。所以,我的代碼將是類似的東西:
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
:該過程立即重新啓動,並且我的文件再次被鎖定。
@TLama,你是什麼意思?你能詳細說明嗎? –
收回,對不起... – TLama
重新啓動管理器看起來不適合你,這很奇怪;重新啓動瀏覽器面對shell擴展應該是其主要目標之一。 – Miral