TL; DRバージョン:
InnoSetupスクリプトで、使用中のファイルが原因で再起動が必要かどうかをどのように検出できますか?
より詳細なバージョン:
次の特徴を持つInnoSetupスクリプトがあります。
この
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
は、ファイルに私のファイルが含まれているかどうかを確認することですが、それはかなり醜い解決策です...
(*)置き換えまたは削除したいファイルは、シェル拡張機能と、この拡張機能で使用されるいくつかのDLLです。リスタートマネージャーに依存していない理由は、リスタートマネージャーが機能していないように見えるためですexplorer.exe
。プロセスはすぐに再起動され、ファイルは再びロックされます。